From 93e27e61f67959589775681783d4dc6631f0a82b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isak=20Stenstr=C3=B6m?= Date: Wed, 25 Mar 2026 08:16:40 +0100 Subject: [PATCH] Generate `possibleTypes.json` without running the backend This makes it easier to run it in CI. --- .../npm_translate_lock_LTUzNjQ2NjY3 | 2 +- frontend/create-possible-types.js | 43 ------------------- frontend/package.json | 5 ++- .../ApolloWrapper/possibleTypes.json | 7 ++- frontend/tools/create-possible-types.js | 36 ++++++++++++++++ .../{scripts => tools}/grpc-client-gen.sh | 0 6 files changed, 44 insertions(+), 49 deletions(-) delete mode 100644 frontend/create-possible-types.js create mode 100644 frontend/tools/create-possible-types.js rename frontend/{scripts => tools}/grpc-client-gen.sh (100%) diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTUzNjQ2NjY3 b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTUzNjQ2NjY3 index 2d13a08a..8a9544c9 100755 --- a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTUzNjQ2NjY3 +++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTUzNjQ2NjY3 @@ -2,6 +2,6 @@ # Input hashes for repository rule npm_translate_lock(name = "npm", pnpm_lock = "@@//frontend:pnpm-lock.yaml"). # This file should be checked into version control along with the pnpm-lock.yaml file. frontend/package-lock.json=1050907894 -frontend/package.json=-1287539742 +frontend/package.json=-2118623145 frontend/patches/vite.patch=-1261363333 frontend/pnpm-lock.yaml=1245402688 diff --git a/frontend/create-possible-types.js b/frontend/create-possible-types.js deleted file mode 100644 index e82645b5..00000000 --- a/frontend/create-possible-types.js +++ /dev/null @@ -1,43 +0,0 @@ -const fetch = require('cross-fetch'); -const fs = require('fs'); - -const YOUR_API_HOST = 'http://localhost:8081' - -fetch(`${YOUR_API_HOST}/graphql`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - variables: {}, - query: ` - { - __schema { - types { - kind - name - possibleTypes { - name - } - } - } - } - `, - }), -}).then(result => result.json()) - .then(result => { - const possibleTypes = {}; - - result.data.__schema.types.forEach(supertype => { - if (supertype.possibleTypes) { - possibleTypes[supertype.name] = - supertype.possibleTypes.map(subtype => subtype.name); - } - }); - - fs.writeFile('./src/components/ApolloWrapper/possibleTypes.json', JSON.stringify(possibleTypes, null, " "), err => { - if (err) { - console.error('Error writing possibleTypes.json', err); - } else { - console.log('Fragment types successfully extracted!'); - } - }); - }); \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index 1170e60e..2b47bccc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -8,7 +8,10 @@ "build": "vite build", "preview": "vite preview", "test": "vitest", - "generate": "graphql-codegen --config ./src/graphql/codegen.ts && ./scripts/grpc-client-gen.sh", + "generate": "npm run generate-graphql && npm run generate-grpc && npm run generate-possible-types", + "generate-graphql": "graphql-codegen --config ./src/graphql/codegen.ts", + "generate-grpc": "./tools/grpc-client-gen.sh", + "generate-possible-types": "node ./tools/create-possible-types.js", "predev": "npm run generate" }, "dependencies": { diff --git a/frontend/src/components/ApolloWrapper/possibleTypes.json b/frontend/src/components/ApolloWrapper/possibleTypes.json index 6d270194..b17e27b9 100644 --- a/frontend/src/components/ApolloWrapper/possibleTypes.json +++ b/frontend/src/components/ApolloWrapper/possibleTypes.json @@ -11,8 +11,6 @@ "ArtifactMetrics": [], "ArtifactMetricsWhereInput": [], "AuthenticatedUser": [], - "AuthenticatedUserConnection": [], - "AuthenticatedUserEdge": [], "AuthenticatedUserWhereInput": [], "BazelInvocation": [], "BazelInvocationConnection": [], @@ -35,7 +33,6 @@ "ConnectionMetadataWhereInput": [], "Cursor": [], "Duration": [], - "Float": [], "GarbageMetrics": [], "GarbageMetricsWhereInput": [], "ID": [], @@ -84,6 +81,7 @@ "TargetMetrics", "TestResult", "TestSummary", + "TestTarget", "TimingMetrics" ], "OrderDirection": [], @@ -104,7 +102,6 @@ "TargetMetrics": [], "TargetMetricsWhereInput": [], "TargetWhereInput": [], - "TargetsOverview": [], "TestResult": [], "TestResultWhereInput": [], "TestSummary": [], @@ -113,6 +110,8 @@ "TestSummaryOrder": [], "TestSummaryOrderField": [], "TestSummaryWhereInput": [], + "TestTarget": [], + "TestTargetWhereInput": [], "Time": [], "TimingMetrics": [], "TimingMetricsWhereInput": [], diff --git a/frontend/tools/create-possible-types.js b/frontend/tools/create-possible-types.js new file mode 100644 index 00000000..48581f9e --- /dev/null +++ b/frontend/tools/create-possible-types.js @@ -0,0 +1,36 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { buildSchema } from 'graphql'; + +const schemaFiles = [ + '../internal/graphql/schema/scalars.graphql', + '../internal/graphql/schema/ent.graphql', + '../internal/graphql/schema/custom.graphql' +]; + +const schemaString = schemaFiles + .map(file => fs.readFileSync(path.resolve(file), 'utf8')) + .join('\n'); + +const schema = buildSchema(schemaString); +const typeMap = schema.getTypeMap(); + +const possibleTypes = {}; + +for (const type of Object.values(typeMap)) { + possibleTypes[type.name] ??= []; +} + +for (const type of Object.values(typeMap)) { + const interfaces = type.getInterfaces?.() ?? []; + for (const iface of interfaces) { + if (possibleTypes[iface.name] !== undefined) { + possibleTypes[iface.name].push(type.name); + }; + } +} + +fs.writeFileSync( + './src/components/ApolloWrapper/possibleTypes.json', + JSON.stringify(possibleTypes, Object.keys(possibleTypes).sort(), 2) +); diff --git a/frontend/scripts/grpc-client-gen.sh b/frontend/tools/grpc-client-gen.sh similarity index 100% rename from frontend/scripts/grpc-client-gen.sh rename to frontend/tools/grpc-client-gen.sh