@fabricorg/gen-graphql 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Make the capability runtime vertical-neutral and instance-scoped. Move experience and display
8
+ semantics into a namespaced companion package, require explicit host registries, replace privacy
9
+ field defaults with caller-owned policy, add PostgreSQL projection adapters, and generate executable
10
+ ProjectionHost read and PlatformHost mutation seams.
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+ - @fabricorg/platform@1.0.0
16
+ - @fabricorg/platform-host@4.0.0
17
+ - @fabricorg/projection-host@1.0.0
18
+ - @fabricorg/compiler@2.0.0
19
+
20
+ ## 1.2.0
21
+
22
+ - Generate executable mutation helpers that call `PlatformHost.submitAction()` with trusted resolver context.
23
+ - Keep generated queries routed through `ProjectionHost.project()`.
24
+
25
+ ## 1.1.0
26
+
27
+ - Generate version-pinned view identities and a `ProjectionHost`-backed query resolver helper.
28
+ - Require server-derived actor and tenant scope through the generated resolver context.
29
+
3
30
  ## 1.0.0
4
31
 
5
32
  ### Major Changes
package/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # `@fabricorg/gen-graphql`
2
2
 
3
3
  Federation-ready GraphQL SDL and resolver contracts. Generated mutations point to governed Host
4
- submission; they never call action handlers directly.
5
-
4
+ submission; they never call action handlers directly. Generated query contracts map every view field
5
+ to its exact name and version and execute it through `@fabricorg/projection-host`; they never read a
6
+ projection store directly. Resolver context must contain server-derived actor and tenant scope.
package/dist/index.cjs CHANGED
@@ -34,7 +34,7 @@ var identifier = (value) => {
34
34
  };
35
35
  var graphqlGenerator = {
36
36
  name: "@fabricorg/gen-graphql",
37
- version: "1.0.0",
37
+ version: "2.0.0",
38
38
  generate(ir) {
39
39
  return ir.modules.flatMap((module2) => {
40
40
  const types = module2.objectTypes.map((objectType) => {
@@ -70,9 +70,22 @@ ${mutations.length ? mutations.join("\n") : " _fabric: Boolean!"}
70
70
  ""
71
71
  ].join("\n\n");
72
72
  const resolvers = [
73
+ 'import type { ProjectionHost, ProjectionQuery } from "@fabricorg/projection-host";',
74
+ 'import type { GovernedActionHost, SubmitActionInput, SubmitActionResult } from "@fabricorg/platform-host";',
75
+ "",
73
76
  "// Generated resolver seam. Authenticate first; derive actor and tenant server-side.",
74
77
  `export const actionIds = ${JSON.stringify(Object.fromEntries(module2.actions.map((action) => [fieldName(action.actionId), action.actionId])), null, 2)} as const;`,
75
- "// Each mutation resolver must call createGovernedActionHost().submitAction(); never call handlers directly.",
78
+ `export const viewIds = ${JSON.stringify(Object.fromEntries(module2.views.map((view) => [fieldName(view.name), { name: view.name, version: view.version }])), null, 2)} as const;`,
79
+ 'export async function resolveProjection(host: Pick<ProjectionHost, "project">, field: keyof typeof viewIds, context: Omit<ProjectionQuery, "view">): Promise<unknown> {',
80
+ " const result = await host.project({ ...context, view: viewIds[field] });",
81
+ " return result.state;",
82
+ "}",
83
+ 'export type GovernedMutationContext = Omit<SubmitActionInput, "actionId" | "parameters">;',
84
+ 'export async function submitMutation(host: Pick<GovernedActionHost, "submitAction">, field: keyof typeof actionIds, parameters: Record<string, unknown>, context: GovernedMutationContext): Promise<SubmitActionResult> {',
85
+ " return await host.submitAction({ ...context, actionId: actionIds[field], parameters });",
86
+ "}",
87
+ "// Query resolvers call resolveProjection(); never read a projection store directly.",
88
+ "// Mutation resolvers call submitMutation(); never call handlers directly.",
76
89
  ""
77
90
  ].join("\n");
78
91
  return [{ path: `${module2.namespace}/schema.graphql`, content }, { path: `${module2.namespace}/resolver-contract.ts`, content: resolvers }];
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import type { GeneratorTarget } from \"@fabricorg/compiler\";\nimport type { PortableJsonSchema } from \"@fabricorg/platform\";\n\nconst pascal = (value: string): string =>\n\tvalue.split(/[-._/]/).filter(Boolean).map((part) => part[0]?.toUpperCase() + part.slice(1)).join(\"\");\nconst gql = (schema: PortableJsonSchema): string => {\n\tconst type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n\treturn type === \"integer\" ? \"Int\" : type === \"number\" ? \"Float\" : type === \"boolean\" ? \"Boolean\" : type === \"string\" ? \"String\" : \"JSON\";\n};\nconst identifier = (value: string): string => {\n\tconst normalized = value.replace(/[^_0-9A-Za-z]/g, \"_\");\n\treturn /^[_A-Za-z]/.test(normalized) ? normalized : `field_${normalized}`;\n};\n\nexport const graphqlGenerator: GeneratorTarget = {\n\tname: \"@fabricorg/gen-graphql\",\n\tversion: \"1.0.0\",\n\tgenerate(ir) {\n\t\treturn ir.modules.flatMap((module) => {\n\t\t\tconst types = module.objectTypes.map((objectType) => {\n\t\t\t\tconst required = new Set(objectType.schema?.required ?? []);\n\t\t\t\tconst properties = Object.entries(objectType.schema?.properties ?? {}).filter(([name]) => ![\"id\", \"tenantId\", \"spaceId\"].includes(name));\n\t\t\t\tconst fieldNames = properties.map(([name]) => identifier(name));\n\t\t\t\tif (new Set(fieldNames).size !== fieldNames.length) throw new Error(`Object \"${module.namespace}.${objectType.type}\" produces colliding GraphQL field names.`);\n\t\t\t\tconst fields = properties.map(\n\t\t\t\t\t([name, schema]) => ` ${identifier(name)}: ${gql(schema)}${required.has(name) ? \"!\" : \"\"}`,\n\t\t\t\t);\n\t\t\t\treturn [`type ${pascal(module.namespace)}${objectType.type} @key(fields: \"id\") {`, \" id: ID!\", \" tenantId: ID!\", \" spaceId: ID!\", ...fields, \"}\"].join(\"\\n\");\n\t\t\t});\n\t\t\tconst fieldName = (value: string): string => {\n\t\t\t\tconst name = pascal(value);\n\t\t\t\treturn `${name[0]?.toLowerCase() ?? \"\"}${name.slice(1)}`;\n\t\t\t};\n\t\t\tconst queryFields = module.views.map((view) => ` ${fieldName(view.name)}: JSON!`);\n\t\t\tconst mutations = module.actions.map((action) => ` ${fieldName(action.actionId)}(parameters: JSON!): GovernedActionSubmission!`);\n\t\t\tconst operationNames = [...module.views.map((view) => fieldName(view.name)), ...module.actions.map((action) => fieldName(action.actionId))];\n\t\t\tif (new Set(operationNames).size !== operationNames.length) throw new Error(`Module \"${module.namespace}\" produces colliding GraphQL operation names.`);\n\t\t\tconst content = [\n\t\t\t\t`# Generated by ${graphqlGenerator.name}@${graphqlGenerator.version}`,\n\t\t\t\t`# Manifest digest: ${ir.manifestDigest}`,\n\t\t\t\t\"scalar JSON\",\n\t\t\t\t\"type GovernedActionSubmission { actionInvocationId: ID!, status: String! }\",\n\t\t\t\t...types,\n\t\t\t\t`type Query {\\n${queryFields.length ? queryFields.join(\"\\n\") : \" _fabric: Boolean!\"}\\n}`,\n\t\t\t\t`type Mutation {\\n${mutations.length ? mutations.join(\"\\n\") : \" _fabric: Boolean!\"}\\n}`,\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\\n\");\n\t\t\tconst resolvers = [\n\t\t\t\t\"// Generated resolver seam. Authenticate first; derive actor and tenant server-side.\",\n\t\t\t\t`export const actionIds = ${JSON.stringify(Object.fromEntries(module.actions.map((action) => [fieldName(action.actionId), action.actionId])), null, 2)} as const;`,\n\t\t\t\t\"// Each mutation resolver must call createGovernedActionHost().submitAction(); never call handlers directly.\",\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\");\n\t\t\treturn [{ path: `${module.namespace}/schema.graphql`, content }, { path: `${module.namespace}/resolver-contract.ts`, content: resolvers }];\n\t\t});\n\t},\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAM,SAAS,CAAC,UACf,MAAM,MAAM,QAAQ,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE;AACpG,IAAM,MAAM,CAAC,WAAuC;AACnD,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO;AAClE,SAAO,SAAS,YAAY,QAAQ,SAAS,WAAW,UAAU,SAAS,YAAY,YAAY,SAAS,WAAW,WAAW;AACnI;AACA,IAAM,aAAa,CAAC,UAA0B;AAC7C,QAAM,aAAa,MAAM,QAAQ,kBAAkB,GAAG;AACtD,SAAO,aAAa,KAAK,UAAU,IAAI,aAAa,SAAS,UAAU;AACxE;AAEO,IAAM,mBAAoC;AAAA,EAChD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS,IAAI;AACZ,WAAO,GAAG,QAAQ,QAAQ,CAACA,YAAW;AACrC,YAAM,QAAQA,QAAO,YAAY,IAAI,CAAC,eAAe;AACpD,cAAM,WAAW,IAAI,IAAI,WAAW,QAAQ,YAAY,CAAC,CAAC;AAC1D,cAAM,aAAa,OAAO,QAAQ,WAAW,QAAQ,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,YAAY,SAAS,EAAE,SAAS,IAAI,CAAC;AACvI,cAAM,aAAa,WAAW,IAAI,CAAC,CAAC,IAAI,MAAM,WAAW,IAAI,CAAC;AAC9D,YAAI,IAAI,IAAI,UAAU,EAAE,SAAS,WAAW,OAAQ,OAAM,IAAI,MAAM,WAAWA,QAAO,SAAS,IAAI,WAAW,IAAI,2CAA2C;AAC7J,cAAM,SAAS,WAAW;AAAA,UACzB,CAAC,CAAC,MAAM,MAAM,MAAM,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,SAAS,IAAI,IAAI,IAAI,MAAM,EAAE;AAAA,QAC1F;AACA,eAAO,CAAC,QAAQ,OAAOA,QAAO,SAAS,CAAC,GAAG,WAAW,IAAI,yBAAyB,aAAa,mBAAmB,kBAAkB,GAAG,QAAQ,GAAG,EAAE,KAAK,IAAI;AAAA,MAC/J,CAAC;AACD,YAAM,YAAY,CAAC,UAA0B;AAC5C,cAAM,OAAO,OAAO,KAAK;AACzB,eAAO,GAAG,KAAK,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,MACvD;AACA,YAAM,cAAcA,QAAO,MAAM,IAAI,CAAC,SAAS,KAAK,UAAU,KAAK,IAAI,CAAC,SAAS;AACjF,YAAM,YAAYA,QAAO,QAAQ,IAAI,CAAC,WAAW,KAAK,UAAU,OAAO,QAAQ,CAAC,gDAAgD;AAChI,YAAM,iBAAiB,CAAC,GAAGA,QAAO,MAAM,IAAI,CAAC,SAAS,UAAU,KAAK,IAAI,CAAC,GAAG,GAAGA,QAAO,QAAQ,IAAI,CAAC,WAAW,UAAU,OAAO,QAAQ,CAAC,CAAC;AAC1I,UAAI,IAAI,IAAI,cAAc,EAAE,SAAS,eAAe,OAAQ,OAAM,IAAI,MAAM,WAAWA,QAAO,SAAS,+CAA+C;AACtJ,YAAM,UAAU;AAAA,QACf,kBAAkB,iBAAiB,IAAI,IAAI,iBAAiB,OAAO;AAAA,QACnE,sBAAsB,GAAG,cAAc;AAAA,QACvC;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH;AAAA,EAAiB,YAAY,SAAS,YAAY,KAAK,IAAI,IAAI,qBAAqB;AAAA;AAAA,QACpF;AAAA,EAAoB,UAAU,SAAS,UAAU,KAAK,IAAI,IAAI,qBAAqB;AAAA;AAAA,QACnF;AAAA,MACD,EAAE,KAAK,MAAM;AACb,YAAM,YAAY;AAAA,QACjB;AAAA,QACA,4BAA4B,KAAK,UAAU,OAAO,YAAYA,QAAO,QAAQ,IAAI,CAAC,WAAW,CAAC,UAAU,OAAO,QAAQ,GAAG,OAAO,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,QACtJ;AAAA,QACA;AAAA,MACD,EAAE,KAAK,IAAI;AACX,aAAO,CAAC,EAAE,MAAM,GAAGA,QAAO,SAAS,mBAAmB,QAAQ,GAAG,EAAE,MAAM,GAAGA,QAAO,SAAS,yBAAyB,SAAS,UAAU,CAAC;AAAA,IAC1I,CAAC;AAAA,EACF;AACD;","names":["module"]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["import type { GeneratorTarget } from \"@fabricorg/compiler\";\nimport type { PortableJsonSchema } from \"@fabricorg/platform\";\n\nconst pascal = (value: string): string =>\n\tvalue.split(/[-._/]/).filter(Boolean).map((part) => part[0]?.toUpperCase() + part.slice(1)).join(\"\");\nconst gql = (schema: PortableJsonSchema): string => {\n\tconst type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n\treturn type === \"integer\" ? \"Int\" : type === \"number\" ? \"Float\" : type === \"boolean\" ? \"Boolean\" : type === \"string\" ? \"String\" : \"JSON\";\n};\nconst identifier = (value: string): string => {\n\tconst normalized = value.replace(/[^_0-9A-Za-z]/g, \"_\");\n\treturn /^[_A-Za-z]/.test(normalized) ? normalized : `field_${normalized}`;\n};\n\nexport const graphqlGenerator: GeneratorTarget = {\n\tname: \"@fabricorg/gen-graphql\",\n\tversion: \"2.0.0\",\n\tgenerate(ir) {\n\t\treturn ir.modules.flatMap((module) => {\n\t\t\tconst types = module.objectTypes.map((objectType) => {\n\t\t\t\tconst required = new Set(objectType.schema?.required ?? []);\n\t\t\t\tconst properties = Object.entries(objectType.schema?.properties ?? {}).filter(([name]) => ![\"id\", \"tenantId\", \"spaceId\"].includes(name));\n\t\t\t\tconst fieldNames = properties.map(([name]) => identifier(name));\n\t\t\t\tif (new Set(fieldNames).size !== fieldNames.length) throw new Error(`Object \"${module.namespace}.${objectType.type}\" produces colliding GraphQL field names.`);\n\t\t\t\tconst fields = properties.map(\n\t\t\t\t\t([name, schema]) => ` ${identifier(name)}: ${gql(schema)}${required.has(name) ? \"!\" : \"\"}`,\n\t\t\t\t);\n\t\t\t\treturn [`type ${pascal(module.namespace)}${objectType.type} @key(fields: \"id\") {`, \" id: ID!\", \" tenantId: ID!\", \" spaceId: ID!\", ...fields, \"}\"].join(\"\\n\");\n\t\t\t});\n\t\t\tconst fieldName = (value: string): string => {\n\t\t\t\tconst name = pascal(value);\n\t\t\t\treturn `${name[0]?.toLowerCase() ?? \"\"}${name.slice(1)}`;\n\t\t\t};\n\t\t\tconst queryFields = module.views.map((view) => ` ${fieldName(view.name)}: JSON!`);\n\t\t\tconst mutations = module.actions.map((action) => ` ${fieldName(action.actionId)}(parameters: JSON!): GovernedActionSubmission!`);\n\t\t\tconst operationNames = [...module.views.map((view) => fieldName(view.name)), ...module.actions.map((action) => fieldName(action.actionId))];\n\t\t\tif (new Set(operationNames).size !== operationNames.length) throw new Error(`Module \"${module.namespace}\" produces colliding GraphQL operation names.`);\n\t\t\tconst content = [\n\t\t\t\t`# Generated by ${graphqlGenerator.name}@${graphqlGenerator.version}`,\n\t\t\t\t`# Manifest digest: ${ir.manifestDigest}`,\n\t\t\t\t\"scalar JSON\",\n\t\t\t\t\"type GovernedActionSubmission { actionInvocationId: ID!, status: String! }\",\n\t\t\t\t...types,\n\t\t\t\t`type Query {\\n${queryFields.length ? queryFields.join(\"\\n\") : \" _fabric: Boolean!\"}\\n}`,\n\t\t\t\t`type Mutation {\\n${mutations.length ? mutations.join(\"\\n\") : \" _fabric: Boolean!\"}\\n}`,\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\\n\");\n\t\t\tconst resolvers = [\n\t\t\t\t'import type { ProjectionHost, ProjectionQuery } from \"@fabricorg/projection-host\";',\n\t\t\t\t'import type { GovernedActionHost, SubmitActionInput, SubmitActionResult } from \"@fabricorg/platform-host\";',\n\t\t\t\t\"\",\n\t\t\t\t\"// Generated resolver seam. Authenticate first; derive actor and tenant server-side.\",\n\t\t\t\t`export const actionIds = ${JSON.stringify(Object.fromEntries(module.actions.map((action) => [fieldName(action.actionId), action.actionId])), null, 2)} as const;`,\n\t\t\t\t`export const viewIds = ${JSON.stringify(Object.fromEntries(module.views.map((view) => [fieldName(view.name), { name: view.name, version: view.version }])), null, 2)} as const;`,\n\t\t\t\t\"export async function resolveProjection(host: Pick<ProjectionHost, \\\"project\\\">, field: keyof typeof viewIds, context: Omit<ProjectionQuery, \\\"view\\\">): Promise<unknown> {\",\n\t\t\t\t\" const result = await host.project({ ...context, view: viewIds[field] });\",\n\t\t\t\t\" return result.state;\",\n\t\t\t\t\"}\",\n\t\t\t\t\"export type GovernedMutationContext = Omit<SubmitActionInput, \\\"actionId\\\" | \\\"parameters\\\">;\",\n\t\t\t\t\"export async function submitMutation(host: Pick<GovernedActionHost, \\\"submitAction\\\">, field: keyof typeof actionIds, parameters: Record<string, unknown>, context: GovernedMutationContext): Promise<SubmitActionResult> {\",\n\t\t\t\t\" return await host.submitAction({ ...context, actionId: actionIds[field], parameters });\",\n\t\t\t\t\"}\",\n\t\t\t\t\"// Query resolvers call resolveProjection(); never read a projection store directly.\",\n\t\t\t\t\"// Mutation resolvers call submitMutation(); never call handlers directly.\",\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\");\n\t\t\treturn [{ path: `${module.namespace}/schema.graphql`, content }, { path: `${module.namespace}/resolver-contract.ts`, content: resolvers }];\n\t\t});\n\t},\n};\n"],"mappings":"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","names":["module"]}
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ var identifier = (value) => {
10
10
  };
11
11
  var graphqlGenerator = {
12
12
  name: "@fabricorg/gen-graphql",
13
- version: "1.0.0",
13
+ version: "2.0.0",
14
14
  generate(ir) {
15
15
  return ir.modules.flatMap((module) => {
16
16
  const types = module.objectTypes.map((objectType) => {
@@ -46,9 +46,22 @@ ${mutations.length ? mutations.join("\n") : " _fabric: Boolean!"}
46
46
  ""
47
47
  ].join("\n\n");
48
48
  const resolvers = [
49
+ 'import type { ProjectionHost, ProjectionQuery } from "@fabricorg/projection-host";',
50
+ 'import type { GovernedActionHost, SubmitActionInput, SubmitActionResult } from "@fabricorg/platform-host";',
51
+ "",
49
52
  "// Generated resolver seam. Authenticate first; derive actor and tenant server-side.",
50
53
  `export const actionIds = ${JSON.stringify(Object.fromEntries(module.actions.map((action) => [fieldName(action.actionId), action.actionId])), null, 2)} as const;`,
51
- "// Each mutation resolver must call createGovernedActionHost().submitAction(); never call handlers directly.",
54
+ `export const viewIds = ${JSON.stringify(Object.fromEntries(module.views.map((view) => [fieldName(view.name), { name: view.name, version: view.version }])), null, 2)} as const;`,
55
+ 'export async function resolveProjection(host: Pick<ProjectionHost, "project">, field: keyof typeof viewIds, context: Omit<ProjectionQuery, "view">): Promise<unknown> {',
56
+ " const result = await host.project({ ...context, view: viewIds[field] });",
57
+ " return result.state;",
58
+ "}",
59
+ 'export type GovernedMutationContext = Omit<SubmitActionInput, "actionId" | "parameters">;',
60
+ 'export async function submitMutation(host: Pick<GovernedActionHost, "submitAction">, field: keyof typeof actionIds, parameters: Record<string, unknown>, context: GovernedMutationContext): Promise<SubmitActionResult> {',
61
+ " return await host.submitAction({ ...context, actionId: actionIds[field], parameters });",
62
+ "}",
63
+ "// Query resolvers call resolveProjection(); never read a projection store directly.",
64
+ "// Mutation resolvers call submitMutation(); never call handlers directly.",
52
65
  ""
53
66
  ].join("\n");
54
67
  return [{ path: `${module.namespace}/schema.graphql`, content }, { path: `${module.namespace}/resolver-contract.ts`, content: resolvers }];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import type { GeneratorTarget } from \"@fabricorg/compiler\";\nimport type { PortableJsonSchema } from \"@fabricorg/platform\";\n\nconst pascal = (value: string): string =>\n\tvalue.split(/[-._/]/).filter(Boolean).map((part) => part[0]?.toUpperCase() + part.slice(1)).join(\"\");\nconst gql = (schema: PortableJsonSchema): string => {\n\tconst type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n\treturn type === \"integer\" ? \"Int\" : type === \"number\" ? \"Float\" : type === \"boolean\" ? \"Boolean\" : type === \"string\" ? \"String\" : \"JSON\";\n};\nconst identifier = (value: string): string => {\n\tconst normalized = value.replace(/[^_0-9A-Za-z]/g, \"_\");\n\treturn /^[_A-Za-z]/.test(normalized) ? normalized : `field_${normalized}`;\n};\n\nexport const graphqlGenerator: GeneratorTarget = {\n\tname: \"@fabricorg/gen-graphql\",\n\tversion: \"1.0.0\",\n\tgenerate(ir) {\n\t\treturn ir.modules.flatMap((module) => {\n\t\t\tconst types = module.objectTypes.map((objectType) => {\n\t\t\t\tconst required = new Set(objectType.schema?.required ?? []);\n\t\t\t\tconst properties = Object.entries(objectType.schema?.properties ?? {}).filter(([name]) => ![\"id\", \"tenantId\", \"spaceId\"].includes(name));\n\t\t\t\tconst fieldNames = properties.map(([name]) => identifier(name));\n\t\t\t\tif (new Set(fieldNames).size !== fieldNames.length) throw new Error(`Object \"${module.namespace}.${objectType.type}\" produces colliding GraphQL field names.`);\n\t\t\t\tconst fields = properties.map(\n\t\t\t\t\t([name, schema]) => ` ${identifier(name)}: ${gql(schema)}${required.has(name) ? \"!\" : \"\"}`,\n\t\t\t\t);\n\t\t\t\treturn [`type ${pascal(module.namespace)}${objectType.type} @key(fields: \"id\") {`, \" id: ID!\", \" tenantId: ID!\", \" spaceId: ID!\", ...fields, \"}\"].join(\"\\n\");\n\t\t\t});\n\t\t\tconst fieldName = (value: string): string => {\n\t\t\t\tconst name = pascal(value);\n\t\t\t\treturn `${name[0]?.toLowerCase() ?? \"\"}${name.slice(1)}`;\n\t\t\t};\n\t\t\tconst queryFields = module.views.map((view) => ` ${fieldName(view.name)}: JSON!`);\n\t\t\tconst mutations = module.actions.map((action) => ` ${fieldName(action.actionId)}(parameters: JSON!): GovernedActionSubmission!`);\n\t\t\tconst operationNames = [...module.views.map((view) => fieldName(view.name)), ...module.actions.map((action) => fieldName(action.actionId))];\n\t\t\tif (new Set(operationNames).size !== operationNames.length) throw new Error(`Module \"${module.namespace}\" produces colliding GraphQL operation names.`);\n\t\t\tconst content = [\n\t\t\t\t`# Generated by ${graphqlGenerator.name}@${graphqlGenerator.version}`,\n\t\t\t\t`# Manifest digest: ${ir.manifestDigest}`,\n\t\t\t\t\"scalar JSON\",\n\t\t\t\t\"type GovernedActionSubmission { actionInvocationId: ID!, status: String! }\",\n\t\t\t\t...types,\n\t\t\t\t`type Query {\\n${queryFields.length ? queryFields.join(\"\\n\") : \" _fabric: Boolean!\"}\\n}`,\n\t\t\t\t`type Mutation {\\n${mutations.length ? mutations.join(\"\\n\") : \" _fabric: Boolean!\"}\\n}`,\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\\n\");\n\t\t\tconst resolvers = [\n\t\t\t\t\"// Generated resolver seam. Authenticate first; derive actor and tenant server-side.\",\n\t\t\t\t`export const actionIds = ${JSON.stringify(Object.fromEntries(module.actions.map((action) => [fieldName(action.actionId), action.actionId])), null, 2)} as const;`,\n\t\t\t\t\"// Each mutation resolver must call createGovernedActionHost().submitAction(); never call handlers directly.\",\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\");\n\t\t\treturn [{ path: `${module.namespace}/schema.graphql`, content }, { path: `${module.namespace}/resolver-contract.ts`, content: resolvers }];\n\t\t});\n\t},\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["import type { GeneratorTarget } from \"@fabricorg/compiler\";\nimport type { PortableJsonSchema } from \"@fabricorg/platform\";\n\nconst pascal = (value: string): string =>\n\tvalue.split(/[-._/]/).filter(Boolean).map((part) => part[0]?.toUpperCase() + part.slice(1)).join(\"\");\nconst gql = (schema: PortableJsonSchema): string => {\n\tconst type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n\treturn type === \"integer\" ? \"Int\" : type === \"number\" ? \"Float\" : type === \"boolean\" ? \"Boolean\" : type === \"string\" ? \"String\" : \"JSON\";\n};\nconst identifier = (value: string): string => {\n\tconst normalized = value.replace(/[^_0-9A-Za-z]/g, \"_\");\n\treturn /^[_A-Za-z]/.test(normalized) ? normalized : `field_${normalized}`;\n};\n\nexport const graphqlGenerator: GeneratorTarget = {\n\tname: \"@fabricorg/gen-graphql\",\n\tversion: \"2.0.0\",\n\tgenerate(ir) {\n\t\treturn ir.modules.flatMap((module) => {\n\t\t\tconst types = module.objectTypes.map((objectType) => {\n\t\t\t\tconst required = new Set(objectType.schema?.required ?? []);\n\t\t\t\tconst properties = Object.entries(objectType.schema?.properties ?? {}).filter(([name]) => ![\"id\", \"tenantId\", \"spaceId\"].includes(name));\n\t\t\t\tconst fieldNames = properties.map(([name]) => identifier(name));\n\t\t\t\tif (new Set(fieldNames).size !== fieldNames.length) throw new Error(`Object \"${module.namespace}.${objectType.type}\" produces colliding GraphQL field names.`);\n\t\t\t\tconst fields = properties.map(\n\t\t\t\t\t([name, schema]) => ` ${identifier(name)}: ${gql(schema)}${required.has(name) ? \"!\" : \"\"}`,\n\t\t\t\t);\n\t\t\t\treturn [`type ${pascal(module.namespace)}${objectType.type} @key(fields: \"id\") {`, \" id: ID!\", \" tenantId: ID!\", \" spaceId: ID!\", ...fields, \"}\"].join(\"\\n\");\n\t\t\t});\n\t\t\tconst fieldName = (value: string): string => {\n\t\t\t\tconst name = pascal(value);\n\t\t\t\treturn `${name[0]?.toLowerCase() ?? \"\"}${name.slice(1)}`;\n\t\t\t};\n\t\t\tconst queryFields = module.views.map((view) => ` ${fieldName(view.name)}: JSON!`);\n\t\t\tconst mutations = module.actions.map((action) => ` ${fieldName(action.actionId)}(parameters: JSON!): GovernedActionSubmission!`);\n\t\t\tconst operationNames = [...module.views.map((view) => fieldName(view.name)), ...module.actions.map((action) => fieldName(action.actionId))];\n\t\t\tif (new Set(operationNames).size !== operationNames.length) throw new Error(`Module \"${module.namespace}\" produces colliding GraphQL operation names.`);\n\t\t\tconst content = [\n\t\t\t\t`# Generated by ${graphqlGenerator.name}@${graphqlGenerator.version}`,\n\t\t\t\t`# Manifest digest: ${ir.manifestDigest}`,\n\t\t\t\t\"scalar JSON\",\n\t\t\t\t\"type GovernedActionSubmission { actionInvocationId: ID!, status: String! }\",\n\t\t\t\t...types,\n\t\t\t\t`type Query {\\n${queryFields.length ? queryFields.join(\"\\n\") : \" _fabric: Boolean!\"}\\n}`,\n\t\t\t\t`type Mutation {\\n${mutations.length ? mutations.join(\"\\n\") : \" _fabric: Boolean!\"}\\n}`,\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\\n\");\n\t\t\tconst resolvers = [\n\t\t\t\t'import type { ProjectionHost, ProjectionQuery } from \"@fabricorg/projection-host\";',\n\t\t\t\t'import type { GovernedActionHost, SubmitActionInput, SubmitActionResult } from \"@fabricorg/platform-host\";',\n\t\t\t\t\"\",\n\t\t\t\t\"// Generated resolver seam. Authenticate first; derive actor and tenant server-side.\",\n\t\t\t\t`export const actionIds = ${JSON.stringify(Object.fromEntries(module.actions.map((action) => [fieldName(action.actionId), action.actionId])), null, 2)} as const;`,\n\t\t\t\t`export const viewIds = ${JSON.stringify(Object.fromEntries(module.views.map((view) => [fieldName(view.name), { name: view.name, version: view.version }])), null, 2)} as const;`,\n\t\t\t\t\"export async function resolveProjection(host: Pick<ProjectionHost, \\\"project\\\">, field: keyof typeof viewIds, context: Omit<ProjectionQuery, \\\"view\\\">): Promise<unknown> {\",\n\t\t\t\t\" const result = await host.project({ ...context, view: viewIds[field] });\",\n\t\t\t\t\" return result.state;\",\n\t\t\t\t\"}\",\n\t\t\t\t\"export type GovernedMutationContext = Omit<SubmitActionInput, \\\"actionId\\\" | \\\"parameters\\\">;\",\n\t\t\t\t\"export async function submitMutation(host: Pick<GovernedActionHost, \\\"submitAction\\\">, field: keyof typeof actionIds, parameters: Record<string, unknown>, context: GovernedMutationContext): Promise<SubmitActionResult> {\",\n\t\t\t\t\" return await host.submitAction({ ...context, actionId: actionIds[field], parameters });\",\n\t\t\t\t\"}\",\n\t\t\t\t\"// Query resolvers call resolveProjection(); never read a projection store directly.\",\n\t\t\t\t\"// Mutation resolvers call submitMutation(); never call handlers directly.\",\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\");\n\t\t\treturn [{ path: `${module.namespace}/schema.graphql`, content }, { path: `${module.namespace}/resolver-contract.ts`, content: resolvers }];\n\t\t});\n\t},\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabricorg/gen-graphql",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Federation-ready GraphQL contract generator for Fabric compiler IR.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,17 +25,20 @@
25
25
  "CHANGELOG.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@fabricorg/compiler": "^1.0.0"
28
+ "@fabricorg/compiler": "^2.0.0"
29
29
  },
30
30
  "peerDependencies": {
31
- "@fabricorg/platform": "^0.12.0"
31
+ "@fabricorg/platform": "^1.0.0",
32
+ "@fabricorg/projection-host": "^1.0.0",
33
+ "@fabricorg/platform-host": "^4.0.0"
32
34
  },
33
35
  "devDependencies": {
34
36
  "@types/node": "^22.10.0",
35
37
  "tsup": "^8.5.0",
36
38
  "typescript": "^5.7.3",
37
39
  "vitest": "^4.1.5",
38
- "@fabricorg/platform": "^0.12.0"
40
+ "@fabricorg/platform-host": "^4.0.0",
41
+ "@fabricorg/platform": "^1.0.0"
39
42
  },
40
43
  "engines": {
41
44
  "node": ">=20"