diff --git a/.github/workflows/make.yaml b/.github/workflows/make.yaml index 6ed5e2f48..b1b8b2dc1 100644 --- a/.github/workflows/make.yaml +++ b/.github/workflows/make.yaml @@ -27,14 +27,13 @@ jobs: with: go: "false" - run: "npm --workspace @probo/emails run build" + - run: "npm run relay" - name: "Build console" run: | - npm --workspace @probo/console run relay npm --workspace @probo/console run check NODE_ENV=production npm --workspace @probo/console run build - name: "Build trust" run: | - npm --workspace @probo/trust run relay npm --workspace @probo/trust run check NODE_ENV=production npm --workspace @probo/trust run build - uses: "actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f" # v7 @@ -305,9 +304,7 @@ jobs: go: "false" - uses: reviewdog/action-setup@d8a7baabd7f3e8544ee4dbde3ee41d0011c3a93f # v1.5.0 - name: "Generate Relay artifacts" - run: | - npm --workspace @probo/console run relay - npm --workspace @probo/trust run relay + run: npm run relay - name: "Run eslint" env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 924d03f20..58df04e17 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -24,14 +24,13 @@ jobs: with: go: "false" - run: "npm --workspace @probo/emails run build" + - run: "npm run relay" - name: "Build console" run: | - npm --workspace @probo/console run relay npm --workspace @probo/console run check NODE_ENV=production npm --workspace @probo/console run build - name: "Build trust" run: | - npm --workspace @probo/trust run relay npm --workspace @probo/trust run check NODE_ENV=production npm --workspace @probo/trust run build - uses: "actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f" # v7 diff --git a/GNUmakefile b/GNUmakefile index 79b569881..f554e4ea4 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -221,17 +221,19 @@ bin/probod-bootstrap: @probo/emails: $(NPM) --workspace $@ run build +.PHONY: relay +relay: + $(NPM) run relay + .PHONY: @probo/console @probo/console: NODE_ENV=production -@probo/console: - $(NPM) --workspace $@ run relay +@probo/console: relay $(NPM) --workspace $@ run check $(NPM) --workspace $@ run build .PHONY: @probo/trust @probo/trust: NODE_ENV=production -@probo/trust: - $(NPM) --workspace $@ run relay +@probo/trust: relay $(NPM) --workspace $@ run check $(NPM) --workspace $@ run build @@ -244,8 +246,7 @@ generate: pkg/server/api/connect/v1/schema/schema.go \ pkg/server/api/trust/v1/types/types.go \ pkg/server/api/mcp/v1/server/server.go \ pkg/server/api/mcp/v1/types/types.go - $(NPM) --workspace @probo/console run relay - $(NPM) --workspace @probo/trust run relay + $(NPM) run relay pkg/server/api/connect/v1/schema/schema.go \ pkg/server/api/connect/v1/types/types.go \ diff --git a/apps/console/CLAUDE.md b/apps/console/CLAUDE.md index d79e44ec5..a8f5786c2 100644 --- a/apps/console/CLAUDE.md +++ b/apps/console/CLAUDE.md @@ -8,7 +8,7 @@ React 19 + Vite + TypeScript + Relay + TailwindCSS. Port 5173. |---------|---------| | `npm run dev` | Start dev server (port 5173) | | `npm run build` | Production build | -| `npx relay-compiler` | Regenerate Relay artifacts | +| `npm run relay` (from repo root) | Regenerate Relay artifacts | ## Routes diff --git a/apps/console/package.json b/apps/console/package.json index 104e4cf3e..932dd8df2 100644 --- a/apps/console/package.json +++ b/apps/console/package.json @@ -5,9 +5,6 @@ "type": "module", "scripts": { "dev": "vite --port 5173", - "relay-clean": "find src -type d -name \"__generated__\" -exec rm -rf {} +", - "relay-compile": "npx relay-compiler", - "relay": "npm run relay-clean && npm run relay-compile", "build": "tsc -b && vite build", "lint": "eslint . --concurrency 4", "check": "tsc --noEmit -p tsconfig.app.json", @@ -33,9 +30,9 @@ "react-error-boundary": "^6.0.0", "react-hook-form": "^7.56.4", "react-pdf": "^10.3.0", - "react-relay": "^19.0.0", + "react-relay": "^20.1.1", "react-router": "^7.12.0", - "relay-runtime": "^19.0.0", + "relay-runtime": "^20.1.1", "use-debounce": "^10.0.5", "usehooks-ts": "^3.1.1", "zod": "^3.25.17" @@ -48,12 +45,11 @@ "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", "@types/react-relay": "^18.2.1", - "@types/relay-runtime": "^19.0.1", + "@types/relay-runtime": "^20.1.1", "@vitejs/plugin-react": "^5.1.4", - "babel-plugin-relay": "^19.0.0", + "babel-plugin-relay": "^20.1.1", "eslint": "^9.39.2", "graphql": "^16.11.0", - "relay-compiler": "^19.0.0", "tailwindcss": "^4.1.7", "typescript": "~5.8.3", "vite": "^7.3.2" diff --git a/apps/trust/package.json b/apps/trust/package.json index 8808deec3..a71768ed6 100644 --- a/apps/trust/package.json +++ b/apps/trust/package.json @@ -5,7 +5,6 @@ "type": "module", "scripts": { "dev": "vite --port 5174", - "relay": "find src -type d -name \"__generated__\" -exec rm -rf {} + && npx relay-compiler ./relay.config.json", "build": "tsc -b && vite build", "lint": "eslint . --concurrency 2", "check": "tsc --noEmit -p tsconfig.app.json", @@ -24,9 +23,9 @@ "react-error-boundary": "^6.0.0", "react-hook-form": "^7.56.4", "react-pdf": "^10.3.0", - "react-relay": "^19.0.0", + "react-relay": "^20.1.1", "react-router": "^7.12.0", - "relay-runtime": "^19.0.0", + "relay-runtime": "^20.1.1", "usehooks-ts": "^3.1.1", "zod": "^3.25.71" }, @@ -38,12 +37,11 @@ "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", "@types/react-relay": "^18.2.1", - "@types/relay-runtime": "^19.0.1", + "@types/relay-runtime": "^20.1.1", "@vitejs/plugin-react": "^5.1.4", - "babel-plugin-relay": "^19.0.0", + "babel-plugin-relay": "^20.1.1", "eslint": "^9.39.2", "graphql": "^16.11.0", - "relay-compiler": "^19.0.0", "tailwindcss": "^4.1.7", "typescript": "~5.8.3", "vite": "^7.3.2" diff --git a/apps/trust/relay.config.json b/apps/trust/relay.config.json deleted file mode 100644 index 213567742..000000000 --- a/apps/trust/relay.config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "src": "./src", - "schema": "../../pkg/server/api/trust/v1/schema.graphql", - "language": "typescript", - "eagerEsModules": true, - "noFutureProofEnums": true -} diff --git a/contrib/claude/relay.md b/contrib/claude/relay.md index 6b14eb196..f89760776 100644 --- a/contrib/claude/relay.md +++ b/contrib/claude/relay.md @@ -15,11 +15,11 @@ Configured in `apps/console/src/environments.ts`. Each has its own store with 1- ## Relay compiler -Config lives in `apps/console/relay.config.json` with two projects (`core`, `iam`) mapped to different source directories and schemas. Generated files go into `__generated__/` directories. +Config lives in `relay.config.json` at the repo root with three projects (`core`, `iam`, `trust`) mapped to different source directories and schemas. Generated files go into `__generated__/` directories. ```sh -npm run relay # clean + compile -npm run relay-compile # compile only +npm run relay # clean + compile (from repo root) +npm run relay-compile # compile only (from repo root) ``` Custom scalar mappings: `Datetime → string`, `GID → string`, `CursorKey → string`, `Duration → string`, `BigInt → number`, `EmailAddr → string`. diff --git a/package-lock.json b/package-lock.json index ed3559bff..f582c97e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "react-dom": "^19.2.1" }, "devDependencies": { + "relay-compiler": "^20.1.1", "turbo": "^2.5.3" }, "engines": { @@ -44,9 +45,9 @@ "react-error-boundary": "^6.0.0", "react-hook-form": "^7.56.4", "react-pdf": "^10.3.0", - "react-relay": "^19.0.0", + "react-relay": "^20.1.1", "react-router": "^7.12.0", - "relay-runtime": "^19.0.0", + "relay-runtime": "^20.1.1", "use-debounce": "^10.0.5", "usehooks-ts": "^3.1.1", "zod": "^3.25.17" @@ -59,12 +60,11 @@ "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", "@types/react-relay": "^18.2.1", - "@types/relay-runtime": "^19.0.1", + "@types/relay-runtime": "^20.1.1", "@vitejs/plugin-react": "^5.1.4", - "babel-plugin-relay": "^19.0.0", + "babel-plugin-relay": "^20.1.1", "eslint": "^9.39.2", "graphql": "^16.11.0", - "relay-compiler": "^19.0.0", "tailwindcss": "^4.1.7", "typescript": "~5.8.3", "vite": "^7.3.2" @@ -86,9 +86,9 @@ "react-error-boundary": "^6.0.0", "react-hook-form": "^7.56.4", "react-pdf": "^10.3.0", - "react-relay": "^19.0.0", + "react-relay": "^20.1.1", "react-router": "^7.12.0", - "relay-runtime": "^19.0.0", + "relay-runtime": "^20.1.1", "usehooks-ts": "^3.1.1", "zod": "^3.25.71" }, @@ -100,12 +100,11 @@ "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", "@types/react-relay": "^18.2.1", - "@types/relay-runtime": "^19.0.1", + "@types/relay-runtime": "^20.1.1", "@vitejs/plugin-react": "^5.1.4", - "babel-plugin-relay": "^19.0.0", + "babel-plugin-relay": "^20.1.1", "eslint": "^9.39.2", "graphql": "^16.11.0", - "relay-compiler": "^19.0.0", "tailwindcss": "^4.1.7", "typescript": "~5.8.3", "vite": "^7.3.2" @@ -6677,9 +6676,9 @@ } }, "node_modules/@types/relay-runtime": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@types/relay-runtime/-/relay-runtime-19.0.3.tgz", - "integrity": "sha512-pvpWWQq5e9KeESF8klQaP2igLLhr2bRd3XxVCxNpGElsPQiP6Mejr59RT9/OGY3O3i8jAGGQsshVe0QCQDbxNg==", + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/@types/relay-runtime/-/relay-runtime-20.1.1.tgz", + "integrity": "sha512-loM2iJteknnJcsxrynmBVb7pIDkSkJUuCMnAa/oDFcrvaxkDvq8iy0J2UshMdDy14iJJocDblXeAu7c6Q1+Ucw==", "dev": true, "license": "MIT" }, @@ -7928,9 +7927,9 @@ } }, "node_modules/babel-plugin-relay": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-relay/-/babel-plugin-relay-19.0.0.tgz", - "integrity": "sha512-7K0UnVyagSgzexy28KcEGu18/ms8wgJd2AufZshiKEaZXH/5XwtK2sh+6wKj/8U7xTGSudBuze39Se+CxSlxsw==", + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-relay/-/babel-plugin-relay-20.1.1.tgz", + "integrity": "sha512-BWlqLPiHbxZTxlyng2rVgsZCwztHNje7H8FR4c+UKy3ErQJBG6BKLr9vUdeR7mAZCH2v0sOAxNhG6zR1FrWjAg==", "dev": true, "license": "MIT", "dependencies": { @@ -16474,16 +16473,16 @@ } }, "node_modules/react-relay": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react-relay/-/react-relay-19.0.0.tgz", - "integrity": "sha512-OaUISVLUTjfBL1tGBtmt3eDZC+KFnP4QIHq0HDacm7ntiZPgAt+udYs3zapuc8hN65wlRruaLKrWc6P/ZQRlSg==", + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/react-relay/-/react-relay-20.1.1.tgz", + "integrity": "sha512-pwl7wHHXCOx32dOg4TVNkhVojgGVvOBMo9pcMGeM1BIFYvmwGauKTtBB+qr5buXHGooCL8TXjMVg+ZLizIsbeQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", "fbjs": "^3.0.2", "invariant": "^2.2.4", "nullthrows": "^1.1.1", - "relay-runtime": "19.0.0" + "relay-runtime": "20.1.1" }, "peerDependencies": { "react": "^16.9.0 || ^17 || ^18 || ^19" @@ -16704,9 +16703,9 @@ } }, "node_modules/relay-compiler": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-19.0.0.tgz", - "integrity": "sha512-DwyNWPUkzdggT3oBuNTS18bL6KCU3Sg/oSW/q+pqOQNHLo+RUZOWAx44ALy5XoBrsXjQVBr0EiNqJ4A8G1skOw==", + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-20.1.1.tgz", + "integrity": "sha512-J/FFFLS/3vnbDkyQMw8l3Ev7dNHXMgC1RAs0fITz4Q63TFPOw142knKxY1Mm5ZZBABkAs9g2JghXaqM+phwTxw==", "dev": true, "license": "MIT", "bin": { @@ -16714,9 +16713,9 @@ } }, "node_modules/relay-runtime": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-19.0.0.tgz", - "integrity": "sha512-uQqizN6d/7ZkTm2C0sTUAFfHk65BQEFLkfp0IBsXPTsXLL3fAJ2iHkemA621vuphtiKsF06C5ZKxypmC5lduFg==", + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-20.1.1.tgz", + "integrity": "sha512-N98ZkkyuIHdXmHaPuljihM1QbFYXATF0gxA0CESFphszsQzXs9A/zZloVfzdOI/xg3B3CfM/5nozvIoeTDIcfw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", @@ -18187,7 +18186,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -19706,9 +19704,9 @@ }, "peerDependencies": { "react": "^19.2.1", - "react-relay": "^19.0.0", + "react-relay": "^20.1.1", "react-router": "^7.10.0", - "relay-runtime": "^19.0.0" + "relay-runtime": "^20.1.1" } }, "packages/routes": { @@ -19721,9 +19719,9 @@ }, "peerDependencies": { "react": "^19.2.1", - "react-relay": "^19.0.0", + "react-relay": "^20.1.1", "react-router": "^7.10.0", - "relay-runtime": "^19.0.0" + "relay-runtime": "^20.1.1" } }, "packages/tsconfig": { diff --git a/package.json b/package.json index 4af250483..27dbc1fe2 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,12 @@ "dev": "turbo run dev", "lint": "turbo run lint", "check": "turbo run check", - "relay": "turbo run relay" + "relay-clean": "find apps -type d -name __generated__ -exec rm -rf {} +", + "relay-compile": "npx relay-compiler", + "relay": "npm run relay-clean && npm run relay-compile" }, "devDependencies": { + "relay-compiler": "^20.1.1", "turbo": "^2.5.3" }, "graphql": { diff --git a/packages/relay/package.json b/packages/relay/package.json index 6150aa764..82440754a 100644 --- a/packages/relay/package.json +++ b/packages/relay/package.json @@ -17,9 +17,9 @@ }, "peerDependencies": { "react": "^19.2.1", - "react-relay": "^19.0.0", + "react-relay": "^20.1.1", "react-router": "^7.10.0", - "relay-runtime": "^19.0.0" + "relay-runtime": "^20.1.1" }, "dependencies": { "graphql": "^16.12.0" diff --git a/packages/routes/package.json b/packages/routes/package.json index c3c5b39ec..7c2c68c52 100644 --- a/packages/routes/package.json +++ b/packages/routes/package.json @@ -16,8 +16,8 @@ }, "peerDependencies": { "react": "^19.2.1", - "react-relay": "^19.0.0", + "react-relay": "^20.1.1", "react-router": "^7.10.0", - "relay-runtime": "^19.0.0" + "relay-runtime": "^20.1.1" } } diff --git a/apps/console/relay.config.json b/relay.config.json similarity index 73% rename from apps/console/relay.config.json rename to relay.config.json index ec6e89044..d88213d6e 100644 --- a/apps/console/relay.config.json +++ b/relay.config.json @@ -1,10 +1,29 @@ { - "root": "../..", + "root": ".", + "sources": { + "apps/console/src/pages/iam": "iam", + "apps/console/src": "core", + "apps/trust/src": "trust" + }, "projects": { + "core": { + "schema": "pkg/server/api/console/v1/schema.graphql", + "language": "typescript", + "noFutureProofEnums": true, + "output": "apps/console/src/__generated__/core", + "relativizeJsModulePaths": false, + "customScalarTypes": { + "Datetime": "string", + "GID": "string", + "CursorKey": "string", + "Duration": "string", + "BigInt": "number", + "EmailAddr": "string" + } + }, "iam": { "schema": "pkg/server/api/connect/v1/schema.graphql", "language": "typescript", - "eagerEsModules": true, "noFutureProofEnums": true, "output": "apps/console/src/__generated__/iam", "relativizeJsModulePaths": false, @@ -17,25 +36,15 @@ "EmailAddr": "string" } }, - "core": { - "schema": "pkg/server/api/console/v1/schema.graphql", + "trust": { + "schema": "pkg/server/api/trust/v1/schema.graphql", "language": "typescript", - "eagerEsModules": true, "noFutureProofEnums": true, - "output": "apps/console/src/__generated__/core", - "relativizeJsModulePaths": false, "customScalarTypes": { "Datetime": "string", - "GID": "string", "CursorKey": "string", - "Duration": "string", - "BigInt": "number", "EmailAddr": "string" } } - }, - "sources": { - "apps/console/src/pages/iam": "iam", - "apps/console/src": "core" } } diff --git a/turbo.json b/turbo.json index 429f08504..9bc2016ca 100644 --- a/turbo.json +++ b/turbo.json @@ -16,9 +16,6 @@ "dev": { "cache": false, "persistent": true - }, - "relay": { - "cache": false } } }