Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b65b9a7fb2 | |||
| 858c7bbc39 | |||
| 149123ef90 | |||
| 6bc49d1c52 | |||
| 52ffe49019 | |||
| 73fa292528 | |||
| f2c0a4581c | |||
| 367c4d8404 | |||
| 587c88980f | |||
| fcdfdb4588 | |||
| 6bbaa8d105 | |||
| eccc084441 |
@@ -1,4 +1,5 @@
|
|||||||
# Project
|
# Project
|
||||||
|
IMAGE_TAG=v1.7.3
|
||||||
PROJECT_NAME=sample-website
|
PROJECT_NAME=sample-website
|
||||||
PROJECT_COLOR=#82ed20
|
PROJECT_COLOR=#82ed20
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
|
|
||||||
# Check if we are pushing a tag
|
# Check if we are pushing a tag
|
||||||
if echo "$*" | grep -q "refs/tags/v"; then
|
while read local_ref local_sha remote_ref remote_sha
|
||||||
echo "🏷️ Tag detected in push, syncing versions..."
|
do
|
||||||
pnpm sync-versions
|
if [[ "$remote_ref" == refs/tags/v* ]]; then
|
||||||
|
TAG=${remote_ref#refs/tags/}
|
||||||
# Stage the changed package.json files
|
echo "🏷️ Tag detected: $TAG, syncing versions..."
|
||||||
git add "package.json" "packages/*/package.json" "apps/*/package.json"
|
pnpm sync-versions "$TAG"
|
||||||
|
|
||||||
# Amend the tag if it's on the current commit, but this is complex in pre-push.
|
# Stage the changed files (excluding ignored files like .env)
|
||||||
# Better: Just warn the user that they might need to update the tag if package.json changed.
|
git add package.json packages/*/package.json apps/*/package.json .env.example
|
||||||
echo "⚠️ package.json files updated to match tag. Please ensure these changes are part of your tag/commit."
|
|
||||||
fi
|
echo "⚠️ package.json and .env files updated to match tag $TAG."
|
||||||
|
echo "⚠️ Note: You might need to push again if these changes were not already in your commit/tag."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "sample-website",
|
"name": "sample-website",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ services:
|
|||||||
- "traefik.http.services.sample-website.loadbalancer.server.port=3000"
|
- "traefik.http.services.sample-website.loadbalancer.server.port=3000"
|
||||||
|
|
||||||
directus:
|
directus:
|
||||||
image: registry.infra.mintel.me/mintel/directus:latest
|
image: registry.infra.mintel.me/mintel/directus:${IMAGE_TAG:-latest}
|
||||||
restart: always
|
restart: always
|
||||||
networks:
|
networks:
|
||||||
- infra
|
- infra
|
||||||
|
|||||||
@@ -9,12 +9,12 @@
|
|||||||
"test": "pnpm -r test",
|
"test": "pnpm -r test",
|
||||||
"changeset": "changeset",
|
"changeset": "changeset",
|
||||||
"version-packages": "changeset version",
|
"version-packages": "changeset version",
|
||||||
"sync-versions": "tsx scripts/sync-versions.ts",
|
"sync-versions": "tsx scripts/sync-versions.ts --",
|
||||||
"cms:push:infra": "./scripts/sync-directus.sh push infra",
|
"cms:push:infra": "./scripts/sync-directus.sh push infra",
|
||||||
"cms:pull:infra": "./scripts/sync-directus.sh pull infra",
|
"cms:pull:infra": "./scripts/sync-directus.sh pull infra",
|
||||||
"cms:schema:snapshot": "./scripts/cms-snapshot.sh",
|
"cms:schema:snapshot": "./scripts/cms-snapshot.sh",
|
||||||
"cms:schema:snapshot:infra": "./scripts/cms-snapshot.sh infra",
|
"cms:schema:apply": "./scripts/cms-apply.sh local",
|
||||||
"cms:schema:apply": "./scripts/cms-apply.sh",
|
"cms:schema:apply:infra": "./scripts/cms-apply.sh infra",
|
||||||
"dev:infra": "docker-compose up -d directus directus-db",
|
"dev:infra": "docker-compose up -d directus directus-db",
|
||||||
"release": "pnpm build && changeset publish",
|
"release": "pnpm build && changeset publish",
|
||||||
"release:tag": "pnpm build && pnpm -r publish --no-git-checks --access public",
|
"release:tag": "pnpm build && pnpm -r publish --no-git-checks --access public",
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
"pino-pretty": "^13.1.3",
|
"pino-pretty": "^13.1.3",
|
||||||
"require-in-the-middle": "^8.0.1"
|
"require-in-the-middle": "^8.0.1"
|
||||||
},
|
},
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"next": "16.1.6",
|
"next": "16.1.6",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/cli",
|
"name": "@mintel/cli",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
Binary file not shown.
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/cms-infra",
|
"name": "@mintel/cms-infra",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -126,9 +126,9 @@ fields:
|
|||||||
schema:
|
schema:
|
||||||
name: id
|
name: id
|
||||||
table: client_users
|
table: client_users
|
||||||
data_type: char
|
data_type: uuid
|
||||||
default_value: null
|
default_value: null
|
||||||
max_length: 36
|
max_length: null
|
||||||
numeric_precision: null
|
numeric_precision: null
|
||||||
numeric_scale: null
|
numeric_scale: null
|
||||||
is_nullable: false
|
is_nullable: false
|
||||||
@@ -304,7 +304,7 @@ fields:
|
|||||||
foreign_key_column: null
|
foreign_key_column: null
|
||||||
- collection: client_users
|
- collection: client_users
|
||||||
field: company
|
field: company
|
||||||
type: string
|
type: uuid
|
||||||
meta:
|
meta:
|
||||||
collection: client_users
|
collection: client_users
|
||||||
conditions: null
|
conditions: null
|
||||||
@@ -328,9 +328,9 @@ fields:
|
|||||||
schema:
|
schema:
|
||||||
name: company
|
name: company
|
||||||
table: client_users
|
table: client_users
|
||||||
data_type: char
|
data_type: uuid
|
||||||
default_value: null
|
default_value: null
|
||||||
max_length: 36
|
max_length: null
|
||||||
numeric_precision: null
|
numeric_precision: null
|
||||||
numeric_scale: null
|
numeric_scale: null
|
||||||
is_nullable: true
|
is_nullable: true
|
||||||
@@ -450,9 +450,9 @@ fields:
|
|||||||
schema:
|
schema:
|
||||||
name: id
|
name: id
|
||||||
table: companies
|
table: companies
|
||||||
data_type: char
|
data_type: uuid
|
||||||
default_value: null
|
default_value: null
|
||||||
max_length: 36
|
max_length: null
|
||||||
numeric_precision: null
|
numeric_precision: null
|
||||||
numeric_scale: null
|
numeric_scale: null
|
||||||
is_nullable: false
|
is_nullable: false
|
||||||
@@ -617,7 +617,7 @@ fields:
|
|||||||
width: full
|
width: full
|
||||||
- collection: directus_users
|
- collection: directus_users
|
||||||
field: company
|
field: company
|
||||||
type: string
|
type: uuid
|
||||||
meta:
|
meta:
|
||||||
collection: directus_users
|
collection: directus_users
|
||||||
conditions: null
|
conditions: null
|
||||||
@@ -641,9 +641,9 @@ fields:
|
|||||||
schema:
|
schema:
|
||||||
name: company
|
name: company
|
||||||
table: directus_users
|
table: directus_users
|
||||||
data_type: char
|
data_type: uuid
|
||||||
default_value: null
|
default_value: null
|
||||||
max_length: 36
|
max_length: null
|
||||||
numeric_precision: null
|
numeric_precision: null
|
||||||
numeric_scale: null
|
numeric_scale: null
|
||||||
is_nullable: true
|
is_nullable: true
|
||||||
@@ -869,7 +869,7 @@ fields:
|
|||||||
foreign_key_column: null
|
foreign_key_column: null
|
||||||
- collection: visual_feedback
|
- collection: visual_feedback
|
||||||
field: user_created
|
field: user_created
|
||||||
type: string
|
type: uuid
|
||||||
meta:
|
meta:
|
||||||
collection: visual_feedback
|
collection: visual_feedback
|
||||||
conditions: null
|
conditions: null
|
||||||
@@ -894,9 +894,9 @@ fields:
|
|||||||
schema:
|
schema:
|
||||||
name: user_created
|
name: user_created
|
||||||
table: visual_feedback
|
table: visual_feedback
|
||||||
data_type: char
|
data_type: uuid
|
||||||
default_value: null
|
default_value: null
|
||||||
max_length: 36
|
max_length: null
|
||||||
numeric_precision: null
|
numeric_precision: null
|
||||||
numeric_scale: null
|
numeric_scale: null
|
||||||
is_nullable: true
|
is_nullable: true
|
||||||
@@ -910,7 +910,7 @@ fields:
|
|||||||
foreign_key_column: null
|
foreign_key_column: null
|
||||||
- collection: visual_feedback
|
- collection: visual_feedback
|
||||||
field: screenshot
|
field: screenshot
|
||||||
type: string
|
type: uuid
|
||||||
meta:
|
meta:
|
||||||
collection: visual_feedback
|
collection: visual_feedback
|
||||||
conditions: null
|
conditions: null
|
||||||
@@ -934,9 +934,9 @@ fields:
|
|||||||
schema:
|
schema:
|
||||||
name: screenshot
|
name: screenshot
|
||||||
table: visual_feedback
|
table: visual_feedback
|
||||||
data_type: char
|
data_type: uuid
|
||||||
default_value: null
|
default_value: null
|
||||||
max_length: 36
|
max_length: null
|
||||||
numeric_precision: null
|
numeric_precision: null
|
||||||
numeric_scale: null
|
numeric_scale: null
|
||||||
is_nullable: true
|
is_nullable: true
|
||||||
@@ -950,7 +950,7 @@ fields:
|
|||||||
foreign_key_column: null
|
foreign_key_column: null
|
||||||
- collection: visual_feedback
|
- collection: visual_feedback
|
||||||
field: company
|
field: company
|
||||||
type: string
|
type: uuid
|
||||||
meta:
|
meta:
|
||||||
collection: visual_feedback
|
collection: visual_feedback
|
||||||
conditions: null
|
conditions: null
|
||||||
@@ -974,9 +974,9 @@ fields:
|
|||||||
schema:
|
schema:
|
||||||
name: company
|
name: company
|
||||||
table: visual_feedback
|
table: visual_feedback
|
||||||
data_type: char
|
data_type: uuid
|
||||||
default_value: null
|
default_value: null
|
||||||
max_length: 36
|
max_length: null
|
||||||
numeric_precision: null
|
numeric_precision: null
|
||||||
numeric_scale: null
|
numeric_scale: null
|
||||||
is_nullable: true
|
is_nullable: true
|
||||||
@@ -1072,7 +1072,7 @@ fields:
|
|||||||
foreign_key_column: null
|
foreign_key_column: null
|
||||||
- collection: visual_feedback_comments
|
- collection: visual_feedback_comments
|
||||||
field: user_created
|
field: user_created
|
||||||
type: string
|
type: uuid
|
||||||
meta:
|
meta:
|
||||||
collection: visual_feedback_comments
|
collection: visual_feedback_comments
|
||||||
conditions: null
|
conditions: null
|
||||||
@@ -1097,9 +1097,9 @@ fields:
|
|||||||
schema:
|
schema:
|
||||||
name: user_created
|
name: user_created
|
||||||
table: visual_feedback_comments
|
table: visual_feedback_comments
|
||||||
data_type: char
|
data_type: uuid
|
||||||
default_value: null
|
default_value: null
|
||||||
max_length: 36
|
max_length: null
|
||||||
numeric_precision: null
|
numeric_precision: null
|
||||||
numeric_scale: null
|
numeric_scale: null
|
||||||
is_nullable: true
|
is_nullable: true
|
||||||
@@ -1111,6 +1111,24 @@ fields:
|
|||||||
has_auto_increment: false
|
has_auto_increment: false
|
||||||
foreign_key_table: null
|
foreign_key_table: null
|
||||||
foreign_key_column: null
|
foreign_key_column: null
|
||||||
|
- collection: visual_feedback_comments
|
||||||
|
field: feedback_id
|
||||||
|
type: integer
|
||||||
|
meta:
|
||||||
|
collection: visual_feedback_comments
|
||||||
|
field: feedback_id
|
||||||
|
interface: select-dropdown-m2o
|
||||||
|
special: null
|
||||||
|
width: full
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
name: feedback_id
|
||||||
|
table: visual_feedback_comments
|
||||||
|
data_type: integer
|
||||||
|
is_nullable: false
|
||||||
|
is_indexed: true
|
||||||
|
foreign_key_table: visual_feedback
|
||||||
|
foreign_key_column: id
|
||||||
systemFields:
|
systemFields:
|
||||||
- collection: directus_activity
|
- collection: directus_activity
|
||||||
field: timestamp
|
field: timestamp
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "customer-manager",
|
"name": "customer-manager",
|
||||||
"description": "Custom High-Fidelity Customer & Company Management for Directus",
|
"description": "Custom High-Fidelity Customer & Company Management for Directus",
|
||||||
"icon": "supervisor_account",
|
"icon": "supervisor_account",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"directus",
|
"directus",
|
||||||
"directus-extension",
|
"directus-extension",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/eslint-config",
|
"name": "@mintel/eslint-config",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "@mintel/extension-feedback-commander",
|
"name": "@mintel/extension-feedback-commander",
|
||||||
"description": "Custom High-Fidelity Feedback Management Extension for Directus",
|
"description": "Custom High-Fidelity Feedback Management Extension for Directus",
|
||||||
"icon": "view_kanban",
|
"icon": "view_kanban",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"directus",
|
"directus",
|
||||||
"directus-extension",
|
"directus-extension",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/gatekeeper",
|
"name": "@mintel/gatekeeper",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/husky-config",
|
"name": "@mintel/husky-config",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ services:
|
|||||||
- "traefik.http.services.${PROJECT_NAME}-gatekeeper.loadbalancer.server.port=3000"
|
- "traefik.http.services.${PROJECT_NAME}-gatekeeper.loadbalancer.server.port=3000"
|
||||||
|
|
||||||
directus:
|
directus:
|
||||||
image: registry.infra.mintel.me/mintel/directus:latest
|
image: registry.infra.mintel.me/mintel/directus:${IMAGE_TAG:-latest}
|
||||||
restart: always
|
restart: always
|
||||||
networks:
|
networks:
|
||||||
- infra
|
- infra
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/infra",
|
"name": "@mintel/infra",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/mail",
|
"name": "@mintel/mail",
|
||||||
"version": "1.7.0",
|
"version": "1.7.3",
|
||||||
"private": false,
|
"private": false,
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
|
|||||||
@@ -6,6 +6,12 @@
|
|||||||
|
|
||||||
- Add `turbopack: {}` to support Next.js 16 default Turbopack behavior when a webpack config is present.
|
- Add `turbopack: {}` to support Next.js 16 default Turbopack behavior when a webpack config is present.
|
||||||
|
|
||||||
|
## 1.6.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Add `turbopack: {}` to support Next.js 16 default Turbopack behavior when a webpack config is present.
|
||||||
|
|
||||||
## 1.0.1
|
## 1.0.1
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/next-config",
|
"name": "@mintel/next-config",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/next-feedback",
|
"name": "@mintel/next-feedback",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/next-observability",
|
"name": "@mintel/next-observability",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/next-utils",
|
"name": "@mintel/next-utils",
|
||||||
"version": "1.6.0",
|
"version": "1.7.4",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -12,13 +12,35 @@ export type MintelDirectusClient = DirectusClient<any> &
|
|||||||
AuthenticationClient<any>;
|
AuthenticationClient<any>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Directus client configured with Mintel standards
|
* Creates a Directus client configured with Mintel standards.
|
||||||
|
* Automatically handles internal vs. external URLs based on environment.
|
||||||
*/
|
*/
|
||||||
export function createMintelDirectusClient(url?: string): MintelDirectusClient {
|
export function createMintelDirectusClient(url?: string): MintelDirectusClient {
|
||||||
const directusUrl =
|
const isServer = typeof window === "undefined";
|
||||||
url || process.env.DIRECTUS_URL || "http://localhost:8055";
|
|
||||||
|
|
||||||
return createDirectus(directusUrl).with(rest()).with(authentication());
|
// 1. If an explicit URL is provided, use it.
|
||||||
|
if (url) {
|
||||||
|
return createDirectus(url).with(rest()).with(authentication());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. On server: Prioritize INTERNAL_DIRECTUS_URL, fallback to DIRECTUS_URL
|
||||||
|
if (isServer) {
|
||||||
|
const directusUrl =
|
||||||
|
process.env.INTERNAL_DIRECTUS_URL ||
|
||||||
|
process.env.DIRECTUS_URL ||
|
||||||
|
"http://localhost:8055";
|
||||||
|
return createDirectus(directusUrl).with(rest()).with(authentication());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. In browser: Use a proxy path if we are on a different origin,
|
||||||
|
// or use the current origin if no DIRECTUS_URL is set.
|
||||||
|
const proxyPath = "/api/directus"; // Standard Mintel proxy path
|
||||||
|
const browserUrl =
|
||||||
|
typeof window !== "undefined"
|
||||||
|
? `${window.location.origin}${proxyPath}`
|
||||||
|
: proxyPath;
|
||||||
|
|
||||||
|
return createDirectus(browserUrl).with(rest()).with(authentication());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4,10 +4,17 @@ export const mintelEnvSchema = {
|
|||||||
NODE_ENV: z
|
NODE_ENV: z
|
||||||
.enum(["development", "production", "test"])
|
.enum(["development", "production", "test"])
|
||||||
.default("development"),
|
.default("development"),
|
||||||
NEXT_PUBLIC_BASE_URL: z.string().url(),
|
NEXT_PUBLIC_BASE_URL: z.string().url().optional(),
|
||||||
|
NEXT_PUBLIC_TARGET: z
|
||||||
|
.enum(["development", "testing", "staging", "production"])
|
||||||
|
.optional(),
|
||||||
|
TARGET: z
|
||||||
|
.enum(["development", "testing", "staging", "production"])
|
||||||
|
.optional(),
|
||||||
|
|
||||||
// Analytics (Proxy Pattern)
|
// Analytics (Proxy Pattern)
|
||||||
UMAMI_WEBSITE_ID: z.string().optional(),
|
UMAMI_WEBSITE_ID: z.string().optional(),
|
||||||
|
NEXT_PUBLIC_UMAMI_WEBSITE_ID: z.string().optional(),
|
||||||
UMAMI_API_ENDPOINT: z
|
UMAMI_API_ENDPOINT: z
|
||||||
.string()
|
.string()
|
||||||
.url()
|
.url()
|
||||||
@@ -23,6 +30,8 @@ export const mintelEnvSchema = {
|
|||||||
LOG_LEVEL: z
|
LOG_LEVEL: z
|
||||||
.enum(["trace", "debug", "info", "warn", "error", "fatal"])
|
.enum(["trace", "debug", "info", "warn", "error", "fatal"])
|
||||||
.default("info"),
|
.default("info"),
|
||||||
|
|
||||||
|
// Mail
|
||||||
MAIL_HOST: z.string().optional(),
|
MAIL_HOST: z.string().optional(),
|
||||||
MAIL_PORT: z.coerce.number().default(587),
|
MAIL_PORT: z.coerce.number().default(587),
|
||||||
MAIL_USERNAME: z.string().optional(),
|
MAIL_USERNAME: z.string().optional(),
|
||||||
@@ -32,13 +41,21 @@ export const mintelEnvSchema = {
|
|||||||
(val) => (typeof val === "string" ? val.split(",").filter(Boolean) : val),
|
(val) => (typeof val === "string" ? val.split(",").filter(Boolean) : val),
|
||||||
z.array(z.string()).default([]),
|
z.array(z.string()).default([]),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
// Directus
|
||||||
|
DIRECTUS_URL: z.string().url().default("http://localhost:8055"),
|
||||||
|
DIRECTUS_ADMIN_EMAIL: z.string().optional(),
|
||||||
|
DIRECTUS_ADMIN_PASSWORD: z.string().optional(),
|
||||||
|
DIRECTUS_API_TOKEN: z.string().optional(),
|
||||||
|
INTERNAL_DIRECTUS_URL: z.string().url().optional(),
|
||||||
};
|
};
|
||||||
|
|
||||||
export function validateMintelEnv(schemaExtension = {}) {
|
export function validateMintelEnv<
|
||||||
const fullSchema = z.object({
|
T extends z.ZodRawShape = Record<string, never>,
|
||||||
...mintelEnvSchema,
|
>(
|
||||||
...schemaExtension,
|
schemaExtension: T = {} as T,
|
||||||
});
|
): z.infer<z.ZodObject<typeof mintelEnvSchema & T>> {
|
||||||
|
const fullSchema = z.object(mintelEnvSchema).extend(schemaExtension);
|
||||||
|
|
||||||
const isBuildTime =
|
const isBuildTime =
|
||||||
process.env.NEXT_PHASE === "phase-production-build" ||
|
process.env.NEXT_PHASE === "phase-production-build" ||
|
||||||
@@ -51,7 +68,7 @@ export function validateMintelEnv(schemaExtension = {}) {
|
|||||||
console.warn(
|
console.warn(
|
||||||
"⚠️ Some environment variables are missing during build, but skipping strict validation.",
|
"⚠️ Some environment variables are missing during build, but skipping strict validation.",
|
||||||
);
|
);
|
||||||
// Return partial data to allow build to continue
|
// Return process.env casted to ensure types match for the full schema
|
||||||
return process.env as unknown as z.infer<typeof fullSchema>;
|
return process.env as unknown as z.infer<typeof fullSchema>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,5 +79,5 @@ export function validateMintelEnv(schemaExtension = {}) {
|
|||||||
throw new Error("Invalid environment variables");
|
throw new Error("Invalid environment variables");
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.data;
|
return result.data as z.infer<typeof fullSchema>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/observability",
|
"name": "@mintel/observability",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mintel/tsconfig",
|
"name": "@mintel/tsconfig",
|
||||||
"version": "1.6.0",
|
"version": "1.7.3",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"registry": "https://npm.infra.mintel.me"
|
"registry": "https://npm.infra.mintel.me"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
packages:
|
packages:
|
||||||
- 'packages/*'
|
- 'packages/*'
|
||||||
- 'apps/*'
|
- 'apps/*'
|
||||||
- '../klz-2026'
|
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
ENV=$1
|
# Configuration
|
||||||
|
PROJECT="infra-cms"
|
||||||
|
LOCAL_SCHEMA_PATH="./packages/cms-infra/schema/snapshot.yaml"
|
||||||
REMOTE_HOST="root@infra.mintel.me"
|
REMOTE_HOST="root@infra.mintel.me"
|
||||||
REMOTE_DIR="/opt/infra/directus"
|
REMOTE_DIR="/opt/infra/directus"
|
||||||
|
|
||||||
|
ENV=$1
|
||||||
|
|
||||||
if [ -z "$ENV" ]; then
|
if [ -z "$ENV" ]; then
|
||||||
echo "Usage: ./scripts/cms-apply.sh [local|infra]"
|
echo "Usage: ./scripts/cms-apply.sh [local|infra]"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -11,38 +15,55 @@ fi
|
|||||||
|
|
||||||
case $ENV in
|
case $ENV in
|
||||||
local)
|
local)
|
||||||
CONTAINER=$(docker compose ps -q directus)
|
PROJECT="infra-cms"
|
||||||
if [ -z "$CONTAINER" ]; then
|
CMD_PREFIX="docker-compose -f packages/cms-infra/docker-compose.yml"
|
||||||
echo "❌ Local directus container not found."
|
|
||||||
|
LOCAL_CONTAINER=$($CMD_PREFIX ps -q $PROJECT)
|
||||||
|
if [ -z "$LOCAL_CONTAINER" ]; then
|
||||||
|
echo "❌ Local $PROJECT container not found. Is it running?"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "🚀 Applying schema locally..."
|
|
||||||
docker exec "$CONTAINER" npx directus schema apply /directus/schema/snapshot.yaml --yes
|
echo "🚀 Applying schema to LOCAL $PROJECT..."
|
||||||
|
docker exec "$LOCAL_CONTAINER" npx directus schema apply -y /directus/schema/snapshot.yaml
|
||||||
;;
|
;;
|
||||||
infra)
|
infra)
|
||||||
PROJECT_NAME="directus"
|
# 'infra' is the remote production server for at-mintel
|
||||||
|
PROJECT="directus" # Remote project name
|
||||||
echo "📤 Uploading snapshot to $ENV..."
|
|
||||||
# Ensure remote directory exists
|
|
||||||
ssh "$REMOTE_HOST" "mkdir -p $REMOTE_DIR/directus/schema"
|
|
||||||
scp ./directus/schema/snapshot.yaml "$REMOTE_HOST:$REMOTE_DIR/directus/schema/snapshot.yaml"
|
|
||||||
|
|
||||||
echo "🔍 Detecting remote container..."
|
echo "🔍 Detecting remote container..."
|
||||||
REMOTE_CONTAINER=$(ssh "$REMOTE_HOST" "cd $REMOTE_DIR && docker compose -p $PROJECT_NAME ps -q directus")
|
REMOTE_CONTAINER=$(ssh "$REMOTE_HOST" "docker ps --filter label=com.docker.compose.project=$PROJECT --filter label=com.docker.compose.service=directus -q")
|
||||||
|
|
||||||
|
if [ -z "$REMOTE_CONTAINER" ]; then
|
||||||
|
# Fallback to older name if labels fail
|
||||||
|
REMOTE_CONTAINER=$(ssh "$REMOTE_HOST" "docker ps -f name=directus-directus-1 -q")
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$REMOTE_CONTAINER" ]; then
|
if [ -z "$REMOTE_CONTAINER" ]; then
|
||||||
echo "❌ Remote container for $ENV not found."
|
echo "❌ Remote container for $ENV not found."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "📦 Syncing extensions to REMOTE $ENV..."
|
||||||
|
# Ensure remote directory exists
|
||||||
|
ssh "$REMOTE_HOST" "mkdir -p $REMOTE_DIR/extensions"
|
||||||
|
rsync -avz --delete ./packages/cms-infra/extensions/ "$REMOTE_HOST:$REMOTE_DIR/extensions/"
|
||||||
|
|
||||||
echo "🚀 Applying schema to $ENV..."
|
echo "📤 Injecting snapshot directly into container $REMOTE_CONTAINER..."
|
||||||
ssh "$REMOTE_HOST" "docker exec $REMOTE_CONTAINER npx directus schema apply /directus/schema/snapshot.yaml --yes"
|
# Inject file via stdin to avoid needing a host-side mount or scp path matching
|
||||||
|
ssh "$REMOTE_HOST" "docker exec -i $REMOTE_CONTAINER sh -c 'cat > /tmp/snapshot.yaml'" < "$LOCAL_SCHEMA_PATH"
|
||||||
|
|
||||||
echo "🔄 Restarting Directus to clear cache..."
|
echo "🚀 Applying schema to REMOTE $ENV..."
|
||||||
ssh "$REMOTE_HOST" "cd $REMOTE_DIR && docker compose -p $PROJECT_NAME restart directus"
|
ssh "$REMOTE_HOST" "docker exec $REMOTE_CONTAINER npx directus schema apply -y /tmp/snapshot.yaml"
|
||||||
|
|
||||||
|
echo "🔄 Restarting remote Directus to clear cache..."
|
||||||
|
ssh "$REMOTE_HOST" "cd $REMOTE_DIR && docker compose restart directus"
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
ssh "$REMOTE_HOST" "docker exec $REMOTE_CONTAINER rm /tmp/snapshot.yaml"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "❌ Invalid environment: $ENV. Only 'local' and 'infra' are supported."
|
echo "❌ Invalid environment: $ENV. Supported: local, infra."
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -1,17 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
PROJECT="directus"
|
PROJECT="infra-cms"
|
||||||
SCHEMA_PATH="./directus/schema/snapshot.yaml"
|
SCHEMA_PATH="./packages/cms-infra/schema/snapshot.yaml"
|
||||||
CMD_PREFIX=""
|
CMD_PREFIX="docker-compose -f packages/cms-infra/docker-compose.yml"
|
||||||
|
|
||||||
if [ "$1" == "infra" ]; then
|
|
||||||
PROJECT="infra-cms"
|
|
||||||
SCHEMA_PATH="./packages/cms-infra/schema/snapshot.yaml"
|
|
||||||
CMD_PREFIX="docker-compose -f packages/cms-infra/docker-compose.yml"
|
|
||||||
else
|
|
||||||
CMD_PREFIX="docker compose"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Detect local container
|
# Detect local container
|
||||||
LOCAL_CONTAINER=$($CMD_PREFIX ps -q $PROJECT)
|
LOCAL_CONTAINER=$($CMD_PREFIX ps -q $PROJECT)
|
||||||
@@ -21,8 +13,11 @@ if [ -z "$LOCAL_CONTAINER" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "📸 Creating schema snapshot for $PROJECT..."
|
echo "📸 Creating schema snapshot for local $PROJECT..."
|
||||||
# Note: we save it to the mounted volume path inside the container
|
# Note: we save it to the mounted volume path inside the container
|
||||||
docker exec "$LOCAL_CONTAINER" npx directus schema snapshot -y /directus/schema/snapshot.yaml
|
docker exec "$LOCAL_CONTAINER" npx directus schema snapshot -y /directus/schema/snapshot.yaml
|
||||||
|
|
||||||
echo "✅ Snapshot saved to $SCHEMA_PATH"
|
echo "🛠️ Repairing snapshot for Postgres compatibility..."
|
||||||
|
python3 ./scripts/fix_snapshot_v3.py
|
||||||
|
|
||||||
|
echo "✅ Snapshot saved and repaired at $SCHEMA_PATH"
|
||||||
|
|||||||
96
scripts/fix_snapshot_v3.py
Normal file
96
scripts/fix_snapshot_v3.py
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
path = '/Users/marcmintel/Projects/at-mintel/packages/cms-infra/schema/snapshot.yaml'
|
||||||
|
if not os.path.exists(path):
|
||||||
|
print(f"File not found: {path}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
with open(path, 'r') as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
|
||||||
|
new_lines = []
|
||||||
|
current_collection = None
|
||||||
|
current_field = None
|
||||||
|
in_schema = False
|
||||||
|
|
||||||
|
fix_fields = {'id', 'company', 'user_created', 'user_updated', 'screenshot', 'logo', 'feedback_id'}
|
||||||
|
uuid_fields = {'id', 'company', 'user_created', 'user_updated'}
|
||||||
|
|
||||||
|
# For multi-pass logic
|
||||||
|
snapshot_has_feedback_id = False
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
stripped = line.strip()
|
||||||
|
|
||||||
|
if stripped.startswith('- collection:'):
|
||||||
|
current_collection = stripped.split(':')[-1].strip()
|
||||||
|
in_schema = False
|
||||||
|
elif stripped.startswith('field:'):
|
||||||
|
current_field = stripped.split(':')[-1].strip()
|
||||||
|
if current_collection == 'visual_feedback_comments' and current_field == 'feedback_id':
|
||||||
|
snapshot_has_feedback_id = True
|
||||||
|
elif stripped == 'schema:':
|
||||||
|
in_schema = True
|
||||||
|
elif stripped == 'meta:' or stripped.startswith('- collection:') or (not line.startswith(' ') and line.strip() and not line.startswith('-')):
|
||||||
|
in_schema = False
|
||||||
|
|
||||||
|
# Top-level field type
|
||||||
|
if not in_schema and stripped.startswith('type:') and current_field in uuid_fields:
|
||||||
|
line = line.replace('type: string', 'type: uuid')
|
||||||
|
|
||||||
|
# Schema data type
|
||||||
|
if in_schema and current_field in fix_fields:
|
||||||
|
if 'data_type: char' in line or 'data_type: varchar' in line:
|
||||||
|
line = line.replace('data_type: char', 'data_type: uuid').replace('data_type: varchar', 'data_type: uuid')
|
||||||
|
if 'max_length:' in line:
|
||||||
|
line = ' max_length: null\n'
|
||||||
|
|
||||||
|
new_lines.append(line)
|
||||||
|
|
||||||
|
# Handle Missing feedback_id Injection
|
||||||
|
if not snapshot_has_feedback_id:
|
||||||
|
# We find systemFields and inject before it
|
||||||
|
injected = False
|
||||||
|
final_lines = []
|
||||||
|
feedback_id_block = """ - collection: visual_feedback_comments
|
||||||
|
field: feedback_id
|
||||||
|
type: integer
|
||||||
|
meta:
|
||||||
|
collection: visual_feedback_comments
|
||||||
|
field: feedback_id
|
||||||
|
interface: select-dropdown-m2o
|
||||||
|
required: true
|
||||||
|
sort: 4
|
||||||
|
width: full
|
||||||
|
schema:
|
||||||
|
name: feedback_id
|
||||||
|
table: visual_feedback_comments
|
||||||
|
data_type: integer
|
||||||
|
is_nullable: false
|
||||||
|
is_indexed: true
|
||||||
|
foreign_key_table: visual_feedback
|
||||||
|
foreign_key_column: id
|
||||||
|
"""
|
||||||
|
for line in new_lines:
|
||||||
|
if 'systemFields:' in line and not injected:
|
||||||
|
final_lines.append(feedback_id_block)
|
||||||
|
injected = True
|
||||||
|
final_lines.append(line)
|
||||||
|
new_lines = final_lines
|
||||||
|
|
||||||
|
# Second pass for primary key nullability
|
||||||
|
final_lines = []
|
||||||
|
for i in range(len(new_lines)):
|
||||||
|
line = new_lines[i]
|
||||||
|
if 'is_primary_key: true' in line:
|
||||||
|
# Search backwards and forwards
|
||||||
|
for j in range(max(0, i-10), min(len(new_lines), i+10)):
|
||||||
|
if 'is_nullable: true' in new_lines[j]:
|
||||||
|
new_lines[j] = new_lines[j].replace('is_nullable: true', 'is_nullable: false')
|
||||||
|
final_lines.append(line)
|
||||||
|
|
||||||
|
with open(path, 'w') as f:
|
||||||
|
f.writelines(new_lines)
|
||||||
|
|
||||||
|
print("SUCCESS: Full normalization and field injection complete.")
|
||||||
@@ -4,9 +4,15 @@ import * as path from "path";
|
|||||||
import { execSync } from "child_process";
|
import { execSync } from "child_process";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the current version tag from environment or git.
|
* Gets the current version tag from arguments, environment or git.
|
||||||
*/
|
*/
|
||||||
function getVersionTag() {
|
function getVersionTag() {
|
||||||
|
// 0. Check arguments (passed from husky hook or manual run)
|
||||||
|
const argTag = process.argv.slice(2).find((arg) => arg.startsWith("v"));
|
||||||
|
if (argTag) {
|
||||||
|
return argTag;
|
||||||
|
}
|
||||||
|
|
||||||
// 1. Check CI environment variables
|
// 1. Check CI environment variables
|
||||||
if (
|
if (
|
||||||
process.env.GITHUB_REF_NAME &&
|
process.env.GITHUB_REF_NAME &&
|
||||||
@@ -67,20 +73,50 @@ function updatePkg(pkgPath: string) {
|
|||||||
console.log(`✅ Updated ${pkg.name} to ${version}`);
|
console.log(`✅ Updated ${pkg.name} to ${version}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the IMAGE_TAG in .env files.
|
||||||
|
*/
|
||||||
|
function updateEnv(envPath: string) {
|
||||||
|
if (!fs.existsSync(envPath)) return;
|
||||||
|
let content = fs.readFileSync(envPath, "utf-8");
|
||||||
|
|
||||||
|
if (content.includes("IMAGE_TAG=")) {
|
||||||
|
content = content.replace(/IMAGE_TAG=.*/g, `IMAGE_TAG=${tag}`);
|
||||||
|
} else {
|
||||||
|
// Proactively add it if missing
|
||||||
|
if (content.includes("# Project")) {
|
||||||
|
content = content.replace("# Project", `# Project\nIMAGE_TAG=${tag}`);
|
||||||
|
} else {
|
||||||
|
content = `IMAGE_TAG=${tag}\n${content}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(envPath, content);
|
||||||
|
console.log(`✅ Updated IMAGE_TAG in ${envPath} to ${tag}`);
|
||||||
|
}
|
||||||
|
|
||||||
// Update root
|
// Update root
|
||||||
rootPkg.version = version;
|
rootPkg.version = version;
|
||||||
fs.writeFileSync("package.json", JSON.stringify(rootPkg, null, 2) + "\n");
|
fs.writeFileSync("package.json", JSON.stringify(rootPkg, null, 2) + "\n");
|
||||||
|
|
||||||
// Update all packages
|
// Update all packages
|
||||||
const packages = fs.readdirSync(packagesDir);
|
if (fs.existsSync(packagesDir)) {
|
||||||
for (const p of packages) {
|
const packages = fs.readdirSync(packagesDir);
|
||||||
updatePkg(path.join(packagesDir, p, "package.json"));
|
for (const p of packages) {
|
||||||
|
updatePkg(path.join(packagesDir, p, "package.json"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update all apps
|
// Update all apps
|
||||||
const apps = fs.readdirSync(appsDir);
|
if (fs.existsSync(appsDir)) {
|
||||||
for (const a of apps) {
|
const apps = fs.readdirSync(appsDir);
|
||||||
updatePkg(path.join(appsDir, a, "package.json"));
|
for (const a of apps) {
|
||||||
|
updatePkg(path.join(appsDir, a, "package.json"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update .env files
|
||||||
|
updateEnv(".env");
|
||||||
|
updateEnv(".env.example");
|
||||||
|
|
||||||
console.log("✨ All versions synced!");
|
console.log("✨ All versions synced!");
|
||||||
|
|||||||
Reference in New Issue
Block a user