@fabricorg/gen-graphql 0.2.1 → 1.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,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - Require Platform 0.12 and Compiler 1.0 generated-artifact contracts.
8
+
3
9
  ## 0.2.1
4
10
 
5
11
  ### Patch Changes
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: "0.2.1",
37
+ version: "1.0.0",
38
38
  generate(ir) {
39
39
  return ir.modules.flatMap((module2) => {
40
40
  const types = module2.objectTypes.map((objectType) => {
@@ -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: \"0.2.1\",\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":["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: \"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"]}
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: "0.2.1",
13
+ version: "1.0.0",
14
14
  generate(ir) {
15
15
  return ir.modules.flatMap((module) => {
16
16
  const types = module.objectTypes.map((objectType) => {
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: \"0.2.1\",\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: \"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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabricorg/gen-graphql",
3
- "version": "0.2.1",
3
+ "version": "1.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,17 @@
25
25
  "CHANGELOG.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@fabricorg/compiler": "^0.2.1"
28
+ "@fabricorg/compiler": "^1.0.0"
29
29
  },
30
30
  "peerDependencies": {
31
- "@fabricorg/platform": "^0.11.1"
31
+ "@fabricorg/platform": "^0.12.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/node": "^22.10.0",
35
35
  "tsup": "^8.5.0",
36
36
  "typescript": "^5.7.3",
37
37
  "vitest": "^4.1.5",
38
- "@fabricorg/platform": "^0.11.1"
38
+ "@fabricorg/platform": "^0.12.0"
39
39
  },
40
40
  "engines": {
41
41
  "node": ">=20"