@contember/client-content-generator 2.1.0-alpha.3 → 2.1.0-alpha.35

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.
Files changed (39) hide show
  1. package/dist/development/generate.cjs.map +1 -1
  2. package/dist/development/generate.js.map +1 -1
  3. package/dist/development/src/ContemberClientGenerator.cjs +7 -2
  4. package/dist/development/src/ContemberClientGenerator.cjs.map +1 -1
  5. package/dist/development/src/ContemberClientGenerator.js +7 -2
  6. package/dist/development/src/ContemberClientGenerator.js.map +1 -1
  7. package/dist/development/src/EntityTypeSchemaGenerator.cjs.map +1 -1
  8. package/dist/development/src/EntityTypeSchemaGenerator.js.map +1 -1
  9. package/dist/development/src/EnumTypeSchemaGenerator.cjs.map +1 -1
  10. package/dist/development/src/EnumTypeSchemaGenerator.js.map +1 -1
  11. package/dist/development/src/NameSchemaGenerator.cjs.map +1 -1
  12. package/dist/development/src/NameSchemaGenerator.js.map +1 -1
  13. package/dist/production/generate.cjs +0 -0
  14. package/dist/production/generate.cjs.map +1 -1
  15. package/dist/production/generate.js.map +1 -1
  16. package/dist/production/src/ContemberClientGenerator.cjs +7 -2
  17. package/dist/production/src/ContemberClientGenerator.cjs.map +1 -1
  18. package/dist/production/src/ContemberClientGenerator.js +7 -2
  19. package/dist/production/src/ContemberClientGenerator.js.map +1 -1
  20. package/dist/production/src/EntityTypeSchemaGenerator.cjs.map +1 -1
  21. package/dist/production/src/EntityTypeSchemaGenerator.js.map +1 -1
  22. package/dist/production/src/EnumTypeSchemaGenerator.cjs.map +1 -1
  23. package/dist/production/src/EnumTypeSchemaGenerator.js.map +1 -1
  24. package/dist/production/src/NameSchemaGenerator.cjs.map +1 -1
  25. package/dist/production/src/NameSchemaGenerator.js.map +1 -1
  26. package/dist/types/ContemberClientGenerator.d.ts.map +1 -1
  27. package/dist/types/EntityTypeSchemaGenerator.d.ts.map +1 -1
  28. package/dist/types/NameSchemaGenerator.d.ts.map +1 -1
  29. package/package.json +7 -7
  30. package/src/ContemberClientGenerator.ts +11 -3
  31. package/src/EntityTypeSchemaGenerator.ts +6 -8
  32. package/src/NameSchemaGenerator.ts +1 -3
  33. package/src/generate.ts +3 -5
  34. package/tests/__snapshots__/generateEnittyTypes.test.ts.snap +161 -161
  35. package/tests/__snapshots__/generateEnumTypes.test.ts.snap +8 -8
  36. package/tests/generateEnittyTypes.test.ts +0 -9
  37. package/tests/generateEnumTypes.test.ts +0 -1
  38. package/tests/schemas.ts +1 -3
  39. package/dist/types/tsconfig.tsbuildinfo +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"generate.cjs","sources":["../../../packages/client-content-generator/src/generate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs/promises'\nimport { resolve, join } from 'node:path'\nimport { ContemberClientGenerator } from './ContemberClientGenerator';\n\n(async () => {\n\tconst schemaPath = process.argv[2]\n\tconst outDir = process.argv[3]\n\n\tif (!schemaPath || !outDir) {\n\t\tconsole.error(`Usage:\n\nFrom file:\nyarn contember-client-generator <schema.json> <out-dir>\n\nFrom stdin:\nyarn run --silent contember project:print-schema --format=schema | yarn contember-client-generator - <out-dir>\n`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst sourceData = await (async () => {\n\t\tif (schemaPath === '-') {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tthrow new Error('Cannot read from stdin in TTY mode')\n\t\t\t}\n\t\t\tconst buffer = []\n\t\t\tfor await (const chunk of process.stdin) {\n\t\t\t\tbuffer.push(chunk)\n\t\t\t}\n\t\t\treturn Buffer.concat(buffer).toString('utf8')\n\t\t}\n\t\treturn await fs.readFile(resolve(process.cwd(), process.argv[2]), 'utf8')\n\t})()\n\n\tconst source = JSON.parse(sourceData)\n\n\tconst dir = resolve(process.cwd(), process.argv[3])\n\tconst generator = new ContemberClientGenerator()\n\tconst result = generator.generate(source.model)\n\tawait fs.mkdir(dir, { recursive: true })\n\tfor (const [name, content] of Object.entries(result)) {\n\t\tawait fs.writeFile(join(dir, name), content, 'utf8')\n\t}\n})().catch(e => {\n\tconsole.error(e)\n\tprocess.exit(1)\n})\n\n"],"names":["fs","resolve","ContemberClientGenerator","join"],"mappings":";;;;;;;;;;;;;;;;;;;;;;CAKC,YAAY;AACN,QAAA,aAAa,QAAQ,KAAK,CAAC;AAC3B,QAAA,SAAS,QAAQ,KAAK,CAAC;AAEzB,MAAA,CAAC,cAAc,CAAC,QAAQ;AAC3B,YAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOf;AACC,YAAQ,KAAK,CAAC;AAAA,EAAA;AAGT,QAAA,aAAa,OAAO,YAAY;AACrC,QAAI,eAAe,KAAK;AACnB,UAAA,QAAQ,MAAM,OAAO;AAClB,cAAA,IAAI,MAAM,oCAAoC;AAAA,MAAA;AAErD,YAAM,SAAS,CAAC;AACC,uBAAA,SAAS,QAAQ,OAAO;AACxC,eAAO,KAAK,KAAK;AAAA,MAAA;AAElB,aAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAAA;AAE7C,WAAO,MAAMA,cAAG,SAASC,UAAAA,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EAAA,GACtE;AAEG,QAAA,SAAS,KAAK,MAAM,UAAU;AAE9B,QAAA,MAAMA,kBAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC;AAC5C,QAAA,YAAY,IAAIC,kDAAyB;AAC/C,QAAM,SAAS,UAAU,SAAS,OAAO,KAAK;AAC9C,QAAMF,cAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AACvC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAMA,cAAG,UAAUG,UAAA,KAAK,KAAK,IAAI,GAAG,SAAS,MAAM;AAAA,EAAA;AAErD,KAAK,MAAM,CAAK,MAAA;AACf,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AACf,CAAC;"}
1
+ {"version":3,"file":"generate.cjs","sources":["../../../packages/client-content-generator/src/generate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport { ContemberClientGenerator } from './ContemberClientGenerator'\n;(async () => {\n\tconst schemaPath = process.argv[2]\n\tconst outDir = process.argv[3]\n\n\tif (!schemaPath || !outDir) {\n\t\tconsole.error(`Usage:\n\nFrom file:\nyarn contember-client-generator <schema.json> <out-dir>\n\nFrom stdin:\nyarn run --silent contember project:print-schema --format=schema | yarn contember-client-generator - <out-dir>\n`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst sourceData = await (async () => {\n\t\tif (schemaPath === '-') {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tthrow new Error('Cannot read from stdin in TTY mode')\n\t\t\t}\n\t\t\tconst buffer = []\n\t\t\tfor await (const chunk of process.stdin) {\n\t\t\t\tbuffer.push(chunk)\n\t\t\t}\n\t\t\treturn Buffer.concat(buffer).toString('utf8')\n\t\t}\n\t\treturn await fs.readFile(resolve(process.cwd(), process.argv[2]), 'utf8')\n\t})()\n\n\tconst source = JSON.parse(sourceData)\n\n\tconst dir = resolve(process.cwd(), process.argv[3])\n\tconst generator = new ContemberClientGenerator()\n\tconst result = generator.generate(source.model)\n\tawait fs.mkdir(dir, { recursive: true })\n\tfor (const [name, content] of Object.entries(result)) {\n\t\tawait fs.writeFile(join(dir, name), content, 'utf8')\n\t}\n})().catch(e => {\n\tconsole.error(e)\n\tprocess.exit(1)\n})\n"],"names":["fs","resolve","ContemberClientGenerator","join"],"mappings":";;;;;;;;;;;;;;;;;;;;;;CAIE,YAAY;AACb,QAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,QAAM,SAAS,QAAQ,KAAK,CAAC;AAE7B,MAAI,CAAC,cAAc,CAAC,QAAQ;AAC3B,YAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOf;AACC,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,aAAa,OAAO,YAAY;AACrC,QAAI,eAAe,KAAK;AACvB,UAAI,QAAQ,MAAM,OAAO;AACxB,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACrD;AACA,YAAM,SAAS,CAAA;AACf,uBAAiB,SAAS,QAAQ,OAAO;AACxC,eAAO,KAAK,KAAK;AAAA,MAClB;AACA,aAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAC7C;AACA,WAAO,MAAMA,cAAG,SAASC,UAAAA,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EACzE,GAAA;AAEA,QAAM,SAAS,KAAK,MAAM,UAAU;AAEpC,QAAM,MAAMA,UAAAA,QAAQ,QAAQ,IAAA,GAAO,QAAQ,KAAK,CAAC,CAAC;AAClD,QAAM,YAAY,IAAIC,kDAAA;AACtB,QAAM,SAAS,UAAU,SAAS,OAAO,KAAK;AAC9C,QAAMF,cAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AACvC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAMA,cAAG,UAAUG,UAAAA,KAAK,KAAK,IAAI,GAAG,SAAS,MAAM;AAAA,EACpD;AACD,KAAK,MAAM,CAAA,MAAK;AACf,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AACf,CAAC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sources":["../../../packages/client-content-generator/src/generate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs/promises'\nimport { resolve, join } from 'node:path'\nimport { ContemberClientGenerator } from './ContemberClientGenerator';\n\n(async () => {\n\tconst schemaPath = process.argv[2]\n\tconst outDir = process.argv[3]\n\n\tif (!schemaPath || !outDir) {\n\t\tconsole.error(`Usage:\n\nFrom file:\nyarn contember-client-generator <schema.json> <out-dir>\n\nFrom stdin:\nyarn run --silent contember project:print-schema --format=schema | yarn contember-client-generator - <out-dir>\n`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst sourceData = await (async () => {\n\t\tif (schemaPath === '-') {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tthrow new Error('Cannot read from stdin in TTY mode')\n\t\t\t}\n\t\t\tconst buffer = []\n\t\t\tfor await (const chunk of process.stdin) {\n\t\t\t\tbuffer.push(chunk)\n\t\t\t}\n\t\t\treturn Buffer.concat(buffer).toString('utf8')\n\t\t}\n\t\treturn await fs.readFile(resolve(process.cwd(), process.argv[2]), 'utf8')\n\t})()\n\n\tconst source = JSON.parse(sourceData)\n\n\tconst dir = resolve(process.cwd(), process.argv[3])\n\tconst generator = new ContemberClientGenerator()\n\tconst result = generator.generate(source.model)\n\tawait fs.mkdir(dir, { recursive: true })\n\tfor (const [name, content] of Object.entries(result)) {\n\t\tawait fs.writeFile(join(dir, name), content, 'utf8')\n\t}\n})().catch(e => {\n\tconsole.error(e)\n\tprocess.exit(1)\n})\n\n"],"names":[],"mappings":";;;;CAKC,YAAY;AACN,QAAA,aAAa,QAAQ,KAAK,CAAC;AAC3B,QAAA,SAAS,QAAQ,KAAK,CAAC;AAEzB,MAAA,CAAC,cAAc,CAAC,QAAQ;AAC3B,YAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOf;AACC,YAAQ,KAAK,CAAC;AAAA,EAAA;AAGT,QAAA,aAAa,OAAO,YAAY;AACrC,QAAI,eAAe,KAAK;AACnB,UAAA,QAAQ,MAAM,OAAO;AAClB,cAAA,IAAI,MAAM,oCAAoC;AAAA,MAAA;AAErD,YAAM,SAAS,CAAC;AACC,uBAAA,SAAS,QAAQ,OAAO;AACxC,eAAO,KAAK,KAAK;AAAA,MAAA;AAElB,aAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAAA;AAE7C,WAAO,MAAM,GAAG,SAAS,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EAAA,GACtE;AAEG,QAAA,SAAS,KAAK,MAAM,UAAU;AAE9B,QAAA,MAAM,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC;AAC5C,QAAA,YAAY,IAAI,yBAAyB;AAC/C,QAAM,SAAS,UAAU,SAAS,OAAO,KAAK;AAC9C,QAAM,GAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AACvC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAM,GAAG,UAAU,KAAK,KAAK,IAAI,GAAG,SAAS,MAAM;AAAA,EAAA;AAErD,KAAK,MAAM,CAAK,MAAA;AACf,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AACf,CAAC;"}
1
+ {"version":3,"file":"generate.js","sources":["../../../packages/client-content-generator/src/generate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport { ContemberClientGenerator } from './ContemberClientGenerator'\n;(async () => {\n\tconst schemaPath = process.argv[2]\n\tconst outDir = process.argv[3]\n\n\tif (!schemaPath || !outDir) {\n\t\tconsole.error(`Usage:\n\nFrom file:\nyarn contember-client-generator <schema.json> <out-dir>\n\nFrom stdin:\nyarn run --silent contember project:print-schema --format=schema | yarn contember-client-generator - <out-dir>\n`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst sourceData = await (async () => {\n\t\tif (schemaPath === '-') {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tthrow new Error('Cannot read from stdin in TTY mode')\n\t\t\t}\n\t\t\tconst buffer = []\n\t\t\tfor await (const chunk of process.stdin) {\n\t\t\t\tbuffer.push(chunk)\n\t\t\t}\n\t\t\treturn Buffer.concat(buffer).toString('utf8')\n\t\t}\n\t\treturn await fs.readFile(resolve(process.cwd(), process.argv[2]), 'utf8')\n\t})()\n\n\tconst source = JSON.parse(sourceData)\n\n\tconst dir = resolve(process.cwd(), process.argv[3])\n\tconst generator = new ContemberClientGenerator()\n\tconst result = generator.generate(source.model)\n\tawait fs.mkdir(dir, { recursive: true })\n\tfor (const [name, content] of Object.entries(result)) {\n\t\tawait fs.writeFile(join(dir, name), content, 'utf8')\n\t}\n})().catch(e => {\n\tconsole.error(e)\n\tprocess.exit(1)\n})\n"],"names":[],"mappings":";;;;CAIE,YAAY;AACb,QAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,QAAM,SAAS,QAAQ,KAAK,CAAC;AAE7B,MAAI,CAAC,cAAc,CAAC,QAAQ;AAC3B,YAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOf;AACC,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,aAAa,OAAO,YAAY;AACrC,QAAI,eAAe,KAAK;AACvB,UAAI,QAAQ,MAAM,OAAO;AACxB,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACrD;AACA,YAAM,SAAS,CAAA;AACf,uBAAiB,SAAS,QAAQ,OAAO;AACxC,eAAO,KAAK,KAAK;AAAA,MAClB;AACA,aAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAC7C;AACA,WAAO,MAAM,GAAG,SAAS,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EACzE,GAAA;AAEA,QAAM,SAAS,KAAK,MAAM,UAAU;AAEpC,QAAM,MAAM,QAAQ,QAAQ,IAAA,GAAO,QAAQ,KAAK,CAAC,CAAC;AAClD,QAAM,YAAY,IAAI,yBAAA;AACtB,QAAM,SAAS,UAAU,SAAS,OAAO,KAAK;AAC9C,QAAM,GAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AACvC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAM,GAAG,UAAU,KAAK,KAAK,IAAI,GAAG,SAAS,MAAM;AAAA,EACpD;AACD,KAAK,MAAM,CAAA,MAAK;AACf,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AACf,CAAC;"}
@@ -13,8 +13,13 @@ class ContemberClientGenerator {
13
13
  const nameSchema = this.nameSchemaGenerator.generate(model);
14
14
  const enumTypeSchema = this.enumTypeSchemaGenerator.generate(model);
15
15
  const entityTypeSchema = this.entityTypeSchemaGenerator.generate(model);
16
- const namesCode = `import { SchemaNames } from '@contember/client-content'
17
- export const ContemberClientNames: SchemaNames = ` + JSON.stringify(nameSchema, null, 2);
16
+ const namesCode = `import type { SchemaNames, SchemaEntityNames } from '@contember/client-content'
17
+ import type { ContemberClientEntities } from './entities'
18
+ import type { ContemberClientEnums } from './enums'
19
+ export const ContemberClientNames = {
20
+ entities: ${JSON.stringify(nameSchema.entities, null, " ").replaceAll("\n", "\n ")} satisfies {[K in keyof ContemberClientEntities]: SchemaEntityNames<K>},
21
+ enums: ${JSON.stringify(nameSchema.enums, null, " ").replaceAll("\n", "\n ")} satisfies {[K in keyof ContemberClientEnums]: readonly ContemberClientEnums[K][]},
22
+ } satisfies SchemaNames`;
18
23
  const indexCode = `
19
24
  import { ContemberClientNames } from './names'
20
25
  import type { ContemberClientSchema } from './entities'
@@ -1 +1 @@
1
- {"version":3,"file":"ContemberClientGenerator.cjs","sources":["../../../../packages/client-content-generator/src/ContemberClientGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { EnumTypeSchemaGenerator } from './EnumTypeSchemaGenerator'\nimport { EntityTypeSchemaGenerator } from './EntityTypeSchemaGenerator'\nimport { NameSchemaGenerator } from './NameSchemaGenerator'\n\n\nexport class ContemberClientGenerator {\n\tconstructor(\n\t\tprivate readonly nameSchemaGenerator: NameSchemaGenerator = new NameSchemaGenerator(),\n\t\tprivate readonly enumTypeSchemaGenerator: EnumTypeSchemaGenerator = new EnumTypeSchemaGenerator(),\n\t\tprivate readonly entityTypeSchemaGenerator: EntityTypeSchemaGenerator = new EntityTypeSchemaGenerator(),\n\t) {\n\t}\n\n\tgenerate(model: Model.Schema): Record<string, string> {\n\t\tconst nameSchema = this.nameSchemaGenerator.generate(model)\n\t\tconst enumTypeSchema = this.enumTypeSchemaGenerator.generate(model)\n\t\tconst entityTypeSchema = this.entityTypeSchemaGenerator.generate(model)\n\n\t\tconst namesCode = `import { SchemaNames } from '@contember/client-content'\nexport const ContemberClientNames: SchemaNames = ` + JSON.stringify(nameSchema, null, 2)\n\n\t\tconst indexCode = `\nimport { ContemberClientNames } from './names'\nimport type { ContemberClientSchema } from './entities'\nimport { ContentQueryBuilder, TypedContentQueryBuilder, TypedEntitySelection } from '@contember/client-content'\nexport * from './names'\nexport * from './enums'\nexport * from './entities'\n\nexport const queryBuilder = new ContentQueryBuilder(ContemberClientNames) as unknown as TypedContentQueryBuilder<ContemberClientSchema>\n\nexport type FragmentOf<EntityName extends keyof ContemberClientSchema['entities'] & string, Data = unknown> =\nTypedEntitySelection<ContemberClientSchema, EntityName, ContemberClientSchema['entities'][EntityName], Data>\n\nexport type FragmentType<T extends TypedEntitySelection<any, any, any, any> = any> =\nT extends TypedEntitySelection<any, any, any, infer TFields>\n\t? TFields\n\t: never\n`\n\t\treturn {\n\t\t\t'names.ts': namesCode,\n\t\t\t'enums.ts': enumTypeSchema,\n\t\t\t'entities.ts': entityTypeSchema,\n\t\t\t'index.ts': indexCode,\n\t\t}\n\t}\n}\n"],"names":["NameSchemaGenerator","EnumTypeSchemaGenerator","EntityTypeSchemaGenerator"],"mappings":";;;;;AAMO,MAAM,yBAAyB;AAAA,EACrC,YACkB,sBAA2C,IAAIA,oBAAAA,uBAC/C,0BAAmD,IAAIC,wBAAAA,2BACvD,4BAAuD,IAAIC,0BAAAA,6BAC3E;AAHgB,SAAA,sBAAA;AACA,SAAA,0BAAA;AACA,SAAA,4BAAA;AAAA,EAAA;AAAA,EAIlB,SAAS,OAA6C;AACrD,UAAM,aAAa,KAAK,oBAAoB,SAAS,KAAK;AAC1D,UAAM,iBAAiB,KAAK,wBAAwB,SAAS,KAAK;AAClE,UAAM,mBAAmB,KAAK,0BAA0B,SAAS,KAAK;AAEtE,UAAM,YAAY;AAAA,qDACiC,KAAK,UAAU,YAAY,MAAM,CAAC;AAErF,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBX,WAAA;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,IACb;AAAA,EAAA;AAEF;;"}
1
+ {"version":3,"file":"ContemberClientGenerator.cjs","sources":["../../../../packages/client-content-generator/src/ContemberClientGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { EnumTypeSchemaGenerator } from './EnumTypeSchemaGenerator'\nimport { EntityTypeSchemaGenerator } from './EntityTypeSchemaGenerator'\nimport { NameSchemaGenerator } from './NameSchemaGenerator'\n\nexport class ContemberClientGenerator {\n\tconstructor(\n\t\tprivate readonly nameSchemaGenerator: NameSchemaGenerator = new NameSchemaGenerator(),\n\t\tprivate readonly enumTypeSchemaGenerator: EnumTypeSchemaGenerator = new EnumTypeSchemaGenerator(),\n\t\tprivate readonly entityTypeSchemaGenerator: EntityTypeSchemaGenerator = new EntityTypeSchemaGenerator(),\n\t) {\n\t}\n\n\tgenerate(model: Model.Schema): Record<string, string> {\n\t\tconst nameSchema = this.nameSchemaGenerator.generate(model)\n\t\tconst enumTypeSchema = this.enumTypeSchemaGenerator.generate(model)\n\t\tconst entityTypeSchema = this.entityTypeSchemaGenerator.generate(model)\n\n\t\tconst namesCode = `import type { SchemaNames, SchemaEntityNames } from '@contember/client-content'\nimport type { ContemberClientEntities } from './entities'\nimport type { ContemberClientEnums } from './enums'\nexport const ContemberClientNames = {\n\tentities: ${\n\t\t\tJSON.stringify(nameSchema.entities, null, '\\t').replaceAll('\\n', '\\n\\t')\n\t\t} satisfies {[K in keyof ContemberClientEntities]: SchemaEntityNames<K>},\n\tenums: ${\n\t\t\tJSON.stringify(nameSchema.enums, null, '\\t').replaceAll('\\n', '\\n\\t')\n\t\t} satisfies {[K in keyof ContemberClientEnums]: readonly ContemberClientEnums[K][]},\n} satisfies SchemaNames`\n\n\t\tconst indexCode = `\nimport { ContemberClientNames } from './names'\nimport type { ContemberClientSchema } from './entities'\nimport { ContentQueryBuilder, TypedContentQueryBuilder, TypedEntitySelection } from '@contember/client-content'\nexport * from './names'\nexport * from './enums'\nexport * from './entities'\n\nexport const queryBuilder = new ContentQueryBuilder(ContemberClientNames) as unknown as TypedContentQueryBuilder<ContemberClientSchema>\n\nexport type FragmentOf<EntityName extends keyof ContemberClientSchema['entities'] & string, Data = unknown> =\nTypedEntitySelection<ContemberClientSchema, EntityName, ContemberClientSchema['entities'][EntityName], Data>\n\nexport type FragmentType<T extends TypedEntitySelection<any, any, any, any> = any> =\nT extends TypedEntitySelection<any, any, any, infer TFields>\n\t? TFields\n\t: never\n`\n\t\treturn {\n\t\t\t'names.ts': namesCode,\n\t\t\t'enums.ts': enumTypeSchema,\n\t\t\t'entities.ts': entityTypeSchema,\n\t\t\t'index.ts': indexCode,\n\t\t}\n\t}\n}\n"],"names":["NameSchemaGenerator","EnumTypeSchemaGenerator","EntityTypeSchemaGenerator"],"mappings":";;;;;AAKO,MAAM,yBAAyB;AAAA,EACrC,YACkB,sBAA2C,IAAIA,oBAAAA,uBAC/C,0BAAmD,IAAIC,wBAAAA,2BACvD,4BAAuD,IAAIC,0BAAAA,6BAC3E;AAHgB,SAAA,sBAAA;AACA,SAAA,0BAAA;AACA,SAAA,4BAAA;AAAA,EAElB;AAAA,EAEA,SAAS,OAA6C;AACrD,UAAM,aAAa,KAAK,oBAAoB,SAAS,KAAK;AAC1D,UAAM,iBAAiB,KAAK,wBAAwB,SAAS,KAAK;AAClE,UAAM,mBAAmB,KAAK,0BAA0B,SAAS,KAAK;AAEtE,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA,aAKjB,KAAK,UAAU,WAAW,UAAU,MAAM,GAAI,EAAE,WAAW,MAAM,KAAM,CACxE;AAAA,UAEC,KAAK,UAAU,WAAW,OAAO,MAAM,GAAI,EAAE,WAAW,MAAM,KAAM,CACrE;AAAA;AAGA,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBlB,WAAO;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,EAEd;AACD;;"}
@@ -11,8 +11,13 @@ class ContemberClientGenerator {
11
11
  const nameSchema = this.nameSchemaGenerator.generate(model);
12
12
  const enumTypeSchema = this.enumTypeSchemaGenerator.generate(model);
13
13
  const entityTypeSchema = this.entityTypeSchemaGenerator.generate(model);
14
- const namesCode = `import { SchemaNames } from '@contember/client-content'
15
- export const ContemberClientNames: SchemaNames = ` + JSON.stringify(nameSchema, null, 2);
14
+ const namesCode = `import type { SchemaNames, SchemaEntityNames } from '@contember/client-content'
15
+ import type { ContemberClientEntities } from './entities'
16
+ import type { ContemberClientEnums } from './enums'
17
+ export const ContemberClientNames = {
18
+ entities: ${JSON.stringify(nameSchema.entities, null, " ").replaceAll("\n", "\n ")} satisfies {[K in keyof ContemberClientEntities]: SchemaEntityNames<K>},
19
+ enums: ${JSON.stringify(nameSchema.enums, null, " ").replaceAll("\n", "\n ")} satisfies {[K in keyof ContemberClientEnums]: readonly ContemberClientEnums[K][]},
20
+ } satisfies SchemaNames`;
16
21
  const indexCode = `
17
22
  import { ContemberClientNames } from './names'
18
23
  import type { ContemberClientSchema } from './entities'
@@ -1 +1 @@
1
- {"version":3,"file":"ContemberClientGenerator.js","sources":["../../../../packages/client-content-generator/src/ContemberClientGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { EnumTypeSchemaGenerator } from './EnumTypeSchemaGenerator'\nimport { EntityTypeSchemaGenerator } from './EntityTypeSchemaGenerator'\nimport { NameSchemaGenerator } from './NameSchemaGenerator'\n\n\nexport class ContemberClientGenerator {\n\tconstructor(\n\t\tprivate readonly nameSchemaGenerator: NameSchemaGenerator = new NameSchemaGenerator(),\n\t\tprivate readonly enumTypeSchemaGenerator: EnumTypeSchemaGenerator = new EnumTypeSchemaGenerator(),\n\t\tprivate readonly entityTypeSchemaGenerator: EntityTypeSchemaGenerator = new EntityTypeSchemaGenerator(),\n\t) {\n\t}\n\n\tgenerate(model: Model.Schema): Record<string, string> {\n\t\tconst nameSchema = this.nameSchemaGenerator.generate(model)\n\t\tconst enumTypeSchema = this.enumTypeSchemaGenerator.generate(model)\n\t\tconst entityTypeSchema = this.entityTypeSchemaGenerator.generate(model)\n\n\t\tconst namesCode = `import { SchemaNames } from '@contember/client-content'\nexport const ContemberClientNames: SchemaNames = ` + JSON.stringify(nameSchema, null, 2)\n\n\t\tconst indexCode = `\nimport { ContemberClientNames } from './names'\nimport type { ContemberClientSchema } from './entities'\nimport { ContentQueryBuilder, TypedContentQueryBuilder, TypedEntitySelection } from '@contember/client-content'\nexport * from './names'\nexport * from './enums'\nexport * from './entities'\n\nexport const queryBuilder = new ContentQueryBuilder(ContemberClientNames) as unknown as TypedContentQueryBuilder<ContemberClientSchema>\n\nexport type FragmentOf<EntityName extends keyof ContemberClientSchema['entities'] & string, Data = unknown> =\nTypedEntitySelection<ContemberClientSchema, EntityName, ContemberClientSchema['entities'][EntityName], Data>\n\nexport type FragmentType<T extends TypedEntitySelection<any, any, any, any> = any> =\nT extends TypedEntitySelection<any, any, any, infer TFields>\n\t? TFields\n\t: never\n`\n\t\treturn {\n\t\t\t'names.ts': namesCode,\n\t\t\t'enums.ts': enumTypeSchema,\n\t\t\t'entities.ts': entityTypeSchema,\n\t\t\t'index.ts': indexCode,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAMO,MAAM,yBAAyB;AAAA,EACrC,YACkB,sBAA2C,IAAI,uBAC/C,0BAAmD,IAAI,2BACvD,4BAAuD,IAAI,6BAC3E;AAHgB,SAAA,sBAAA;AACA,SAAA,0BAAA;AACA,SAAA,4BAAA;AAAA,EAAA;AAAA,EAIlB,SAAS,OAA6C;AACrD,UAAM,aAAa,KAAK,oBAAoB,SAAS,KAAK;AAC1D,UAAM,iBAAiB,KAAK,wBAAwB,SAAS,KAAK;AAClE,UAAM,mBAAmB,KAAK,0BAA0B,SAAS,KAAK;AAEtE,UAAM,YAAY;AAAA,qDACiC,KAAK,UAAU,YAAY,MAAM,CAAC;AAErF,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBX,WAAA;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,IACb;AAAA,EAAA;AAEF;"}
1
+ {"version":3,"file":"ContemberClientGenerator.js","sources":["../../../../packages/client-content-generator/src/ContemberClientGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { EnumTypeSchemaGenerator } from './EnumTypeSchemaGenerator'\nimport { EntityTypeSchemaGenerator } from './EntityTypeSchemaGenerator'\nimport { NameSchemaGenerator } from './NameSchemaGenerator'\n\nexport class ContemberClientGenerator {\n\tconstructor(\n\t\tprivate readonly nameSchemaGenerator: NameSchemaGenerator = new NameSchemaGenerator(),\n\t\tprivate readonly enumTypeSchemaGenerator: EnumTypeSchemaGenerator = new EnumTypeSchemaGenerator(),\n\t\tprivate readonly entityTypeSchemaGenerator: EntityTypeSchemaGenerator = new EntityTypeSchemaGenerator(),\n\t) {\n\t}\n\n\tgenerate(model: Model.Schema): Record<string, string> {\n\t\tconst nameSchema = this.nameSchemaGenerator.generate(model)\n\t\tconst enumTypeSchema = this.enumTypeSchemaGenerator.generate(model)\n\t\tconst entityTypeSchema = this.entityTypeSchemaGenerator.generate(model)\n\n\t\tconst namesCode = `import type { SchemaNames, SchemaEntityNames } from '@contember/client-content'\nimport type { ContemberClientEntities } from './entities'\nimport type { ContemberClientEnums } from './enums'\nexport const ContemberClientNames = {\n\tentities: ${\n\t\t\tJSON.stringify(nameSchema.entities, null, '\\t').replaceAll('\\n', '\\n\\t')\n\t\t} satisfies {[K in keyof ContemberClientEntities]: SchemaEntityNames<K>},\n\tenums: ${\n\t\t\tJSON.stringify(nameSchema.enums, null, '\\t').replaceAll('\\n', '\\n\\t')\n\t\t} satisfies {[K in keyof ContemberClientEnums]: readonly ContemberClientEnums[K][]},\n} satisfies SchemaNames`\n\n\t\tconst indexCode = `\nimport { ContemberClientNames } from './names'\nimport type { ContemberClientSchema } from './entities'\nimport { ContentQueryBuilder, TypedContentQueryBuilder, TypedEntitySelection } from '@contember/client-content'\nexport * from './names'\nexport * from './enums'\nexport * from './entities'\n\nexport const queryBuilder = new ContentQueryBuilder(ContemberClientNames) as unknown as TypedContentQueryBuilder<ContemberClientSchema>\n\nexport type FragmentOf<EntityName extends keyof ContemberClientSchema['entities'] & string, Data = unknown> =\nTypedEntitySelection<ContemberClientSchema, EntityName, ContemberClientSchema['entities'][EntityName], Data>\n\nexport type FragmentType<T extends TypedEntitySelection<any, any, any, any> = any> =\nT extends TypedEntitySelection<any, any, any, infer TFields>\n\t? TFields\n\t: never\n`\n\t\treturn {\n\t\t\t'names.ts': namesCode,\n\t\t\t'enums.ts': enumTypeSchema,\n\t\t\t'entities.ts': entityTypeSchema,\n\t\t\t'index.ts': indexCode,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,yBAAyB;AAAA,EACrC,YACkB,sBAA2C,IAAI,uBAC/C,0BAAmD,IAAI,2BACvD,4BAAuD,IAAI,6BAC3E;AAHgB,SAAA,sBAAA;AACA,SAAA,0BAAA;AACA,SAAA,4BAAA;AAAA,EAElB;AAAA,EAEA,SAAS,OAA6C;AACrD,UAAM,aAAa,KAAK,oBAAoB,SAAS,KAAK;AAC1D,UAAM,iBAAiB,KAAK,wBAAwB,SAAS,KAAK;AAClE,UAAM,mBAAmB,KAAK,0BAA0B,SAAS,KAAK;AAEtE,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA,aAKjB,KAAK,UAAU,WAAW,UAAU,MAAM,GAAI,EAAE,WAAW,MAAM,KAAM,CACxE;AAAA,UAEC,KAAK,UAAU,WAAW,OAAO,MAAM,GAAI,EAAE,WAAW,MAAM,KAAM,CACrE;AAAA;AAGA,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBlB,WAAO;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,EAEd;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityTypeSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/EntityTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor, acceptFieldVisitor } from '@contember/schema-utils'\n\nimport { getEnumTypeName } from './utils'\n\nexport class EntityTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `import type { ${getEnumTypeName(enumName)} } from './enums'\\n`\n\t\t}\n\n\t\tcode += `\nexport type JSONPrimitive = string | number | boolean | null\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray\nexport type JSONObject = { readonly [K in string]?: JSONValue }\nexport type JSONArray = readonly JSONValue[]\n\n`\n\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += this.generateTypeEntityCode(model, entity)\n\t\t}\n\t\tcode += '\\n'\n\t\tcode += `export type ContemberClientEntities = {\\n`\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += `\\t${entity.name}: ${entity.name}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\tcode += `export type ContemberClientSchema = {\\n`\n\t\tcode += '\\tentities: ContemberClientEntities\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate generateTypeEntityCode(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = `export type ${entity.name} <OverRelation extends string | never = never> = {\\n`\n\t\tcode += '\\tname: \\'' + entity.name + '\\'\\n'\n\t\tcode += '\\tunique:\\n'\n\t\tcode += this.formatUniqueFields(model, entity)\n\t\tlet columnsCode = ''\n\t\tlet hasOneCode = ''\n\t\tlet hasManyCode = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitHasMany: ctx => {\n\t\t\t\thasManyCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}${ctx.targetRelation?.type === Model.RelationType.ManyHasOne ? `<'${ctx.targetRelation.name}'>` : ''}\\n`\n\t\t\t},\n\t\t\tvisitHasOne: ctx => {\n\t\t\t\thasOneCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}\\n`\n\t\t\t},\n\t\t\tvisitColumn: ctx => {\n\t\t\t\tcolumnsCode += `\\t\\t${ctx.column.name}: ${columnToTsType(ctx.column)}${ctx.column.nullable ? ` | null` : ''}\\n`\n\t\t\t},\n\t\t})\n\n\t\tcode += '\\tcolumns: {\\n'\n\t\tcode += columnsCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasOne: {\\n'\n\t\tcode += hasOneCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasMany: {\\n'\n\t\tcode += hasManyCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasManyBy: {\\n'\n\t\tcode += this.formatReducedFields(model, entity)\n\t\tcode += '\\t}\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate formatReducedFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\tif (!targetRelation) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst uniqueConstraints = getFieldsForUniqueWhere(model, targetEntity)\n\t\t\t\tconst composedUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 2) //todo support all uniques\n\t\t\t\t\t.filter(fields => fields.includes(targetRelation.name))\n\t\t\t\t\t.map(fields => fields.filter(it => it !== targetRelation.name))\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\tconst singleUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 1 && fields[0] !== targetEntity.primary)\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\t\t.filter(it => it !== targetRelation.name)\n\n\t\t\t\t;[...composedUnique, ...singleUnique].forEach(fieldName => {\n\t\t\t\t\tconst capitalizeFirstLetter = (value: string) => {\n\t\t\t\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1)\n\t\t\t\t\t}\n\t\t\t\t\tconst name = `${relation.name}By${capitalizeFirstLetter(fieldName)}`\n\n\t\t\t\t\tconst targetUnique = targetEntity.fields[fieldName]\n\n\t\t\t\t\tcode += `\\t\\t${name}: { entity: ${targetEntity.name}; by: {${fieldName}: ${uniqueType(model, targetEntity, targetUnique)}} }\\n`\n\n\t\t\t\t})\n\t\t\t},\n\t\t\tvisitColumn: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: () => {\n\t\t\t},\n\t\t\tvisitManyHasOne: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: () => {\n\t\t\t},\n\t\t})\n\t\treturn code\n\t}\n\n\tprivate formatUniqueFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tconst fields = getFieldsForUniqueWhere(model, entity)\n\t\tlet code = ''\n\t\tfor (const field of fields) {\n\t\t\tcode += '\\t\\t| Omit<{ '\n\t\t\tcode += field.map(it => `${it}: ${uniqueType(model, entity, entity.fields[it])}`).join(', ')\n\t\t\tcode += '}, OverRelation>\\n'\n\t\t}\n\t\treturn code\n\t}\n}\n\n\nconst uniqueType = (model: Model.Schema, entity: Model.Entity, field: Model.AnyField): string => {\n\treturn acceptFieldVisitor(model, entity, field, {\n\t\tvisitColumn: ctx => {\n\t\t\treturn columnToTsType(ctx.column)\n\t\t},\n\t\tvisitRelation: ctx => {\n\t\t\treturn ctx.targetEntity.name + `['unique']`\n\t\t},\n\t})\n}\n\n\nconst columnToTsType = (column: Model.AnyColumn): string => {\n\tconst baseType = (() => {\n\t\tswitch (column.type) {\n\t\t\tcase Model.ColumnType.Enum:\n\t\t\t\treturn getEnumTypeName(column.columnType)\n\t\t\tcase Model.ColumnType.String:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Int:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Double:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Bool:\n\t\t\t\treturn 'boolean'\n\t\t\tcase Model.ColumnType.DateTime:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Time:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Date:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Json:\n\t\t\t\treturn 'JSONValue'\n\t\t\tcase Model.ColumnType.Uuid:\n\t\t\t\treturn 'string'\n\t\t\tdefault:\n\t\t\t\t((_: never) => {\n\t\t\t\t\tthrow new Error(`Unknown type ${_}`)\n\t\t\t\t})(column.type)\n\t\t}\n\t})()\n\treturn column.list ? `readonly ${baseType}[]` : baseType\n}\n\nconst getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Entity): readonly (readonly string[])[] => {\n\tconst relations = Object.values(\n\t\tacceptEveryFieldVisitor<undefined | [string]>(schema, entity, {\n\t\t\tvisitColumn: () => undefined,\n\t\t\tvisitManyHasManyInverse: () => undefined,\n\t\t\tvisitManyHasManyOwning: () => undefined,\n\t\t\tvisitOneHasMany: ({ relation }) => [relation.name],\n\t\t\tvisitManyHasOne: () => undefined,\n\t\t\tvisitOneHasOneInverse: ({ relation }) => [relation.name],\n\t\t\tvisitOneHasOneOwning: ({ relation }) => [relation.name],\n\t\t}),\n\t).filter((it): it is [string] => !!it)\n\n\treturn [[entity.primary], ...Object.values(entity.unique).map(it => it.fields), ...relations]\n}\n"],"names":["getEnumTypeName","acceptEveryFieldVisitor","Model","entity","acceptFieldVisitor","schema"],"mappings":"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"}
1
+ {"version":3,"file":"EntityTypeSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/EntityTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor, acceptFieldVisitor } from '@contember/schema-utils'\n\nimport { getEnumTypeName } from './utils'\n\nexport class EntityTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `import type { ${getEnumTypeName(enumName)} } from './enums'\\n`\n\t\t}\n\n\t\tcode += `\nexport type JSONPrimitive = string | number | boolean | null\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray\nexport type JSONObject = { readonly [K in string]?: JSONValue }\nexport type JSONArray = readonly JSONValue[]\n\n`\n\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += this.generateTypeEntityCode(model, entity)\n\t\t}\n\t\tcode += '\\n'\n\t\tcode += `export type ContemberClientEntities = {\\n`\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += `\\t${entity.name}: ${entity.name}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\tcode += `export type ContemberClientSchema = {\\n`\n\t\tcode += '\\tentities: ContemberClientEntities\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate generateTypeEntityCode(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = `export type ${entity.name} <OverRelation extends string | never = never> = {\\n`\n\t\tcode += \"\\tname: '\" + entity.name + \"'\\n\"\n\t\tcode += '\\tunique:\\n'\n\t\tcode += this.formatUniqueFields(model, entity)\n\t\tlet columnsCode = ''\n\t\tlet hasOneCode = ''\n\t\tlet hasManyCode = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitHasMany: ctx => {\n\t\t\t\thasManyCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}${\n\t\t\t\t\tctx.targetRelation?.type === Model.RelationType.ManyHasOne ? `<'${ctx.targetRelation.name}'>` : ''\n\t\t\t\t}\\n`\n\t\t\t},\n\t\t\tvisitHasOne: ctx => {\n\t\t\t\thasOneCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}\\n`\n\t\t\t},\n\t\t\tvisitColumn: ctx => {\n\t\t\t\tcolumnsCode += `\\t\\t${ctx.column.name}: ${columnToTsType(ctx.column)}${ctx.column.nullable ? ` | null` : ''}\\n`\n\t\t\t},\n\t\t})\n\n\t\tcode += '\\tcolumns: {\\n'\n\t\tcode += columnsCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasOne: {\\n'\n\t\tcode += hasOneCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasMany: {\\n'\n\t\tcode += hasManyCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasManyBy: {\\n'\n\t\tcode += this.formatReducedFields(model, entity)\n\t\tcode += '\\t}\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate formatReducedFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\tif (!targetRelation) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst uniqueConstraints = getFieldsForUniqueWhere(model, targetEntity)\n\t\t\t\tconst composedUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 2) // todo support all uniques\n\t\t\t\t\t.filter(fields => fields.includes(targetRelation.name))\n\t\t\t\t\t.map(fields => fields.filter(it => it !== targetRelation.name))\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\tconst singleUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 1 && fields[0] !== targetEntity.primary)\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\t\t.filter(it => it !== targetRelation.name)\n\t\t\t\t;[...composedUnique, ...singleUnique].forEach(fieldName => {\n\t\t\t\t\tconst capitalizeFirstLetter = (value: string) => {\n\t\t\t\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1)\n\t\t\t\t\t}\n\t\t\t\t\tconst name = `${relation.name}By${capitalizeFirstLetter(fieldName)}`\n\n\t\t\t\t\tconst targetUnique = targetEntity.fields[fieldName]\n\n\t\t\t\t\tcode += `\\t\\t${name}: { entity: ${targetEntity.name}; by: {${fieldName}: ${uniqueType(model, targetEntity, targetUnique)}} }\\n`\n\t\t\t\t})\n\t\t\t},\n\t\t\tvisitColumn: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: () => {\n\t\t\t},\n\t\t\tvisitManyHasOne: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: () => {\n\t\t\t},\n\t\t})\n\t\treturn code\n\t}\n\n\tprivate formatUniqueFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tconst fields = getFieldsForUniqueWhere(model, entity)\n\t\tlet code = ''\n\t\tfor (const field of fields) {\n\t\t\tcode += '\\t\\t| Omit<{ '\n\t\t\tcode += field.map(it => `${it}: ${uniqueType(model, entity, entity.fields[it])}`).join(', ')\n\t\t\tcode += '}, OverRelation>\\n'\n\t\t}\n\t\treturn code\n\t}\n}\n\nconst uniqueType = (model: Model.Schema, entity: Model.Entity, field: Model.AnyField): string => {\n\treturn acceptFieldVisitor(model, entity, field, {\n\t\tvisitColumn: ctx => {\n\t\t\treturn columnToTsType(ctx.column)\n\t\t},\n\t\tvisitRelation: ctx => {\n\t\t\treturn ctx.targetEntity.name + `['unique']`\n\t\t},\n\t})\n}\n\nconst columnToTsType = (column: Model.AnyColumn): string => {\n\tconst baseType = (() => {\n\t\tswitch (column.type) {\n\t\t\tcase Model.ColumnType.Enum:\n\t\t\t\treturn getEnumTypeName(column.columnType)\n\t\t\tcase Model.ColumnType.String:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Int:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Double:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Bool:\n\t\t\t\treturn 'boolean'\n\t\t\tcase Model.ColumnType.DateTime:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Time:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Date:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Json:\n\t\t\t\treturn 'JSONValue'\n\t\t\tcase Model.ColumnType.Uuid:\n\t\t\t\treturn 'string'\n\t\t\tdefault:\n\t\t\t\t;((_: never) => {\n\t\t\t\t\tthrow new Error(`Unknown type ${_}`)\n\t\t\t\t})(column.type)\n\t\t}\n\t})()\n\treturn column.list ? `readonly ${baseType}[]` : baseType\n}\n\nconst getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Entity): readonly (readonly string[])[] => {\n\tconst relations = Object.values(\n\t\tacceptEveryFieldVisitor<undefined | [string]>(schema, entity, {\n\t\t\tvisitColumn: () => undefined,\n\t\t\tvisitManyHasManyInverse: () => undefined,\n\t\t\tvisitManyHasManyOwning: () => undefined,\n\t\t\tvisitOneHasMany: ({ relation }) => [relation.name],\n\t\t\tvisitManyHasOne: () => undefined,\n\t\t\tvisitOneHasOneInverse: ({ relation }) => [relation.name],\n\t\t\tvisitOneHasOneOwning: ({ relation }) => [relation.name],\n\t\t}),\n\t).filter((it): it is [string] => !!it)\n\n\treturn [[entity.primary], ...Object.values(entity.unique).map(it => it.fields), ...relations]\n}\n"],"names":["getEnumTypeName","acceptEveryFieldVisitor","Model","entity","acceptFieldVisitor","schema"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityTypeSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/EntityTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor, acceptFieldVisitor } from '@contember/schema-utils'\n\nimport { getEnumTypeName } from './utils'\n\nexport class EntityTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `import type { ${getEnumTypeName(enumName)} } from './enums'\\n`\n\t\t}\n\n\t\tcode += `\nexport type JSONPrimitive = string | number | boolean | null\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray\nexport type JSONObject = { readonly [K in string]?: JSONValue }\nexport type JSONArray = readonly JSONValue[]\n\n`\n\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += this.generateTypeEntityCode(model, entity)\n\t\t}\n\t\tcode += '\\n'\n\t\tcode += `export type ContemberClientEntities = {\\n`\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += `\\t${entity.name}: ${entity.name}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\tcode += `export type ContemberClientSchema = {\\n`\n\t\tcode += '\\tentities: ContemberClientEntities\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate generateTypeEntityCode(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = `export type ${entity.name} <OverRelation extends string | never = never> = {\\n`\n\t\tcode += '\\tname: \\'' + entity.name + '\\'\\n'\n\t\tcode += '\\tunique:\\n'\n\t\tcode += this.formatUniqueFields(model, entity)\n\t\tlet columnsCode = ''\n\t\tlet hasOneCode = ''\n\t\tlet hasManyCode = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitHasMany: ctx => {\n\t\t\t\thasManyCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}${ctx.targetRelation?.type === Model.RelationType.ManyHasOne ? `<'${ctx.targetRelation.name}'>` : ''}\\n`\n\t\t\t},\n\t\t\tvisitHasOne: ctx => {\n\t\t\t\thasOneCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}\\n`\n\t\t\t},\n\t\t\tvisitColumn: ctx => {\n\t\t\t\tcolumnsCode += `\\t\\t${ctx.column.name}: ${columnToTsType(ctx.column)}${ctx.column.nullable ? ` | null` : ''}\\n`\n\t\t\t},\n\t\t})\n\n\t\tcode += '\\tcolumns: {\\n'\n\t\tcode += columnsCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasOne: {\\n'\n\t\tcode += hasOneCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasMany: {\\n'\n\t\tcode += hasManyCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasManyBy: {\\n'\n\t\tcode += this.formatReducedFields(model, entity)\n\t\tcode += '\\t}\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate formatReducedFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\tif (!targetRelation) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst uniqueConstraints = getFieldsForUniqueWhere(model, targetEntity)\n\t\t\t\tconst composedUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 2) //todo support all uniques\n\t\t\t\t\t.filter(fields => fields.includes(targetRelation.name))\n\t\t\t\t\t.map(fields => fields.filter(it => it !== targetRelation.name))\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\tconst singleUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 1 && fields[0] !== targetEntity.primary)\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\t\t.filter(it => it !== targetRelation.name)\n\n\t\t\t\t;[...composedUnique, ...singleUnique].forEach(fieldName => {\n\t\t\t\t\tconst capitalizeFirstLetter = (value: string) => {\n\t\t\t\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1)\n\t\t\t\t\t}\n\t\t\t\t\tconst name = `${relation.name}By${capitalizeFirstLetter(fieldName)}`\n\n\t\t\t\t\tconst targetUnique = targetEntity.fields[fieldName]\n\n\t\t\t\t\tcode += `\\t\\t${name}: { entity: ${targetEntity.name}; by: {${fieldName}: ${uniqueType(model, targetEntity, targetUnique)}} }\\n`\n\n\t\t\t\t})\n\t\t\t},\n\t\t\tvisitColumn: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: () => {\n\t\t\t},\n\t\t\tvisitManyHasOne: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: () => {\n\t\t\t},\n\t\t})\n\t\treturn code\n\t}\n\n\tprivate formatUniqueFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tconst fields = getFieldsForUniqueWhere(model, entity)\n\t\tlet code = ''\n\t\tfor (const field of fields) {\n\t\t\tcode += '\\t\\t| Omit<{ '\n\t\t\tcode += field.map(it => `${it}: ${uniqueType(model, entity, entity.fields[it])}`).join(', ')\n\t\t\tcode += '}, OverRelation>\\n'\n\t\t}\n\t\treturn code\n\t}\n}\n\n\nconst uniqueType = (model: Model.Schema, entity: Model.Entity, field: Model.AnyField): string => {\n\treturn acceptFieldVisitor(model, entity, field, {\n\t\tvisitColumn: ctx => {\n\t\t\treturn columnToTsType(ctx.column)\n\t\t},\n\t\tvisitRelation: ctx => {\n\t\t\treturn ctx.targetEntity.name + `['unique']`\n\t\t},\n\t})\n}\n\n\nconst columnToTsType = (column: Model.AnyColumn): string => {\n\tconst baseType = (() => {\n\t\tswitch (column.type) {\n\t\t\tcase Model.ColumnType.Enum:\n\t\t\t\treturn getEnumTypeName(column.columnType)\n\t\t\tcase Model.ColumnType.String:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Int:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Double:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Bool:\n\t\t\t\treturn 'boolean'\n\t\t\tcase Model.ColumnType.DateTime:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Time:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Date:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Json:\n\t\t\t\treturn 'JSONValue'\n\t\t\tcase Model.ColumnType.Uuid:\n\t\t\t\treturn 'string'\n\t\t\tdefault:\n\t\t\t\t((_: never) => {\n\t\t\t\t\tthrow new Error(`Unknown type ${_}`)\n\t\t\t\t})(column.type)\n\t\t}\n\t})()\n\treturn column.list ? `readonly ${baseType}[]` : baseType\n}\n\nconst getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Entity): readonly (readonly string[])[] => {\n\tconst relations = Object.values(\n\t\tacceptEveryFieldVisitor<undefined | [string]>(schema, entity, {\n\t\t\tvisitColumn: () => undefined,\n\t\t\tvisitManyHasManyInverse: () => undefined,\n\t\t\tvisitManyHasManyOwning: () => undefined,\n\t\t\tvisitOneHasMany: ({ relation }) => [relation.name],\n\t\t\tvisitManyHasOne: () => undefined,\n\t\t\tvisitOneHasOneInverse: ({ relation }) => [relation.name],\n\t\t\tvisitOneHasOneOwning: ({ relation }) => [relation.name],\n\t\t}),\n\t).filter((it): it is [string] => !!it)\n\n\treturn [[entity.primary], ...Object.values(entity.unique).map(it => it.fields), ...relations]\n}\n"],"names":["entity"],"mappings":"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"}
1
+ {"version":3,"file":"EntityTypeSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/EntityTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor, acceptFieldVisitor } from '@contember/schema-utils'\n\nimport { getEnumTypeName } from './utils'\n\nexport class EntityTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `import type { ${getEnumTypeName(enumName)} } from './enums'\\n`\n\t\t}\n\n\t\tcode += `\nexport type JSONPrimitive = string | number | boolean | null\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray\nexport type JSONObject = { readonly [K in string]?: JSONValue }\nexport type JSONArray = readonly JSONValue[]\n\n`\n\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += this.generateTypeEntityCode(model, entity)\n\t\t}\n\t\tcode += '\\n'\n\t\tcode += `export type ContemberClientEntities = {\\n`\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += `\\t${entity.name}: ${entity.name}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\tcode += `export type ContemberClientSchema = {\\n`\n\t\tcode += '\\tentities: ContemberClientEntities\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate generateTypeEntityCode(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = `export type ${entity.name} <OverRelation extends string | never = never> = {\\n`\n\t\tcode += \"\\tname: '\" + entity.name + \"'\\n\"\n\t\tcode += '\\tunique:\\n'\n\t\tcode += this.formatUniqueFields(model, entity)\n\t\tlet columnsCode = ''\n\t\tlet hasOneCode = ''\n\t\tlet hasManyCode = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitHasMany: ctx => {\n\t\t\t\thasManyCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}${\n\t\t\t\t\tctx.targetRelation?.type === Model.RelationType.ManyHasOne ? `<'${ctx.targetRelation.name}'>` : ''\n\t\t\t\t}\\n`\n\t\t\t},\n\t\t\tvisitHasOne: ctx => {\n\t\t\t\thasOneCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}\\n`\n\t\t\t},\n\t\t\tvisitColumn: ctx => {\n\t\t\t\tcolumnsCode += `\\t\\t${ctx.column.name}: ${columnToTsType(ctx.column)}${ctx.column.nullable ? ` | null` : ''}\\n`\n\t\t\t},\n\t\t})\n\n\t\tcode += '\\tcolumns: {\\n'\n\t\tcode += columnsCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasOne: {\\n'\n\t\tcode += hasOneCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasMany: {\\n'\n\t\tcode += hasManyCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasManyBy: {\\n'\n\t\tcode += this.formatReducedFields(model, entity)\n\t\tcode += '\\t}\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate formatReducedFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\tif (!targetRelation) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst uniqueConstraints = getFieldsForUniqueWhere(model, targetEntity)\n\t\t\t\tconst composedUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 2) // todo support all uniques\n\t\t\t\t\t.filter(fields => fields.includes(targetRelation.name))\n\t\t\t\t\t.map(fields => fields.filter(it => it !== targetRelation.name))\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\tconst singleUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 1 && fields[0] !== targetEntity.primary)\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\t\t.filter(it => it !== targetRelation.name)\n\t\t\t\t;[...composedUnique, ...singleUnique].forEach(fieldName => {\n\t\t\t\t\tconst capitalizeFirstLetter = (value: string) => {\n\t\t\t\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1)\n\t\t\t\t\t}\n\t\t\t\t\tconst name = `${relation.name}By${capitalizeFirstLetter(fieldName)}`\n\n\t\t\t\t\tconst targetUnique = targetEntity.fields[fieldName]\n\n\t\t\t\t\tcode += `\\t\\t${name}: { entity: ${targetEntity.name}; by: {${fieldName}: ${uniqueType(model, targetEntity, targetUnique)}} }\\n`\n\t\t\t\t})\n\t\t\t},\n\t\t\tvisitColumn: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: () => {\n\t\t\t},\n\t\t\tvisitManyHasOne: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: () => {\n\t\t\t},\n\t\t})\n\t\treturn code\n\t}\n\n\tprivate formatUniqueFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tconst fields = getFieldsForUniqueWhere(model, entity)\n\t\tlet code = ''\n\t\tfor (const field of fields) {\n\t\t\tcode += '\\t\\t| Omit<{ '\n\t\t\tcode += field.map(it => `${it}: ${uniqueType(model, entity, entity.fields[it])}`).join(', ')\n\t\t\tcode += '}, OverRelation>\\n'\n\t\t}\n\t\treturn code\n\t}\n}\n\nconst uniqueType = (model: Model.Schema, entity: Model.Entity, field: Model.AnyField): string => {\n\treturn acceptFieldVisitor(model, entity, field, {\n\t\tvisitColumn: ctx => {\n\t\t\treturn columnToTsType(ctx.column)\n\t\t},\n\t\tvisitRelation: ctx => {\n\t\t\treturn ctx.targetEntity.name + `['unique']`\n\t\t},\n\t})\n}\n\nconst columnToTsType = (column: Model.AnyColumn): string => {\n\tconst baseType = (() => {\n\t\tswitch (column.type) {\n\t\t\tcase Model.ColumnType.Enum:\n\t\t\t\treturn getEnumTypeName(column.columnType)\n\t\t\tcase Model.ColumnType.String:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Int:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Double:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Bool:\n\t\t\t\treturn 'boolean'\n\t\t\tcase Model.ColumnType.DateTime:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Time:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Date:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Json:\n\t\t\t\treturn 'JSONValue'\n\t\t\tcase Model.ColumnType.Uuid:\n\t\t\t\treturn 'string'\n\t\t\tdefault:\n\t\t\t\t;((_: never) => {\n\t\t\t\t\tthrow new Error(`Unknown type ${_}`)\n\t\t\t\t})(column.type)\n\t\t}\n\t})()\n\treturn column.list ? `readonly ${baseType}[]` : baseType\n}\n\nconst getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Entity): readonly (readonly string[])[] => {\n\tconst relations = Object.values(\n\t\tacceptEveryFieldVisitor<undefined | [string]>(schema, entity, {\n\t\t\tvisitColumn: () => undefined,\n\t\t\tvisitManyHasManyInverse: () => undefined,\n\t\t\tvisitManyHasManyOwning: () => undefined,\n\t\t\tvisitOneHasMany: ({ relation }) => [relation.name],\n\t\t\tvisitManyHasOne: () => undefined,\n\t\t\tvisitOneHasOneInverse: ({ relation }) => [relation.name],\n\t\t\tvisitOneHasOneOwning: ({ relation }) => [relation.name],\n\t\t}),\n\t).filter((it): it is [string] => !!it)\n\n\treturn [[entity.primary], ...Object.values(entity.unique).map(it => it.fields), ...relations]\n}\n"],"names":["entity"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EnumTypeSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/EnumTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { getEnumTypeName } from './utils'\n\nexport class EnumTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const [enumName, values] of Object.entries(model.enums)) {\n\t\t\tcode += `export type ${getEnumTypeName(enumName)} = ${values.map(it => '\\n\\t | ' + JSON.stringify(it)).join('')}\\n`\n\t\t}\n\t\tcode += `export type ContemberClientEnums = {\\n`\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `\\t${enumName}: ${getEnumTypeName(enumName)}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\treturn code\n\t}\n}\n"],"names":["getEnumTypeName"],"mappings":";;;AAGO,MAAM,wBAAwB;AAAA,EACpC,SAAS,OAA6B;AACrC,QAAI,OAAO;AACA,eAAA,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AAC7D,cAAQ,eAAeA,MAAgB,gBAAA,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAA,OAAM,WAAY,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,IAAA;AAExG,YAAA;AAAA;AACR,eAAW,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG;AAChD,cAAQ,IAAK,QAAQ,KAAKA,MAAAA,gBAAgB,QAAQ,CAAC;AAAA;AAAA,IAAA;AAE5C,YAAA;AACD,WAAA;AAAA,EAAA;AAET;;"}
1
+ {"version":3,"file":"EnumTypeSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/EnumTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { getEnumTypeName } from './utils'\n\nexport class EnumTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const [enumName, values] of Object.entries(model.enums)) {\n\t\t\tcode += `export type ${getEnumTypeName(enumName)} = ${values.map(it => '\\n\\t | ' + JSON.stringify(it)).join('')}\\n`\n\t\t}\n\t\tcode += `export type ContemberClientEnums = {\\n`\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `\\t${enumName}: ${getEnumTypeName(enumName)}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\treturn code\n\t}\n}\n"],"names":["getEnumTypeName"],"mappings":";;;AAGO,MAAM,wBAAwB;AAAA,EACpC,SAAS,OAA6B;AACrC,QAAI,OAAO;AACX,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AAC7D,cAAQ,eAAeA,MAAAA,gBAAgB,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAA,OAAM,WAAY,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,IAChH;AACA,YAAQ;AAAA;AACR,eAAW,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG;AAChD,cAAQ,IAAK,QAAQ,KAAKA,MAAAA,gBAAgB,QAAQ,CAAC;AAAA;AAAA,IACpD;AACA,YAAQ;AACR,WAAO;AAAA,EACR;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"EnumTypeSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/EnumTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { getEnumTypeName } from './utils'\n\nexport class EnumTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const [enumName, values] of Object.entries(model.enums)) {\n\t\t\tcode += `export type ${getEnumTypeName(enumName)} = ${values.map(it => '\\n\\t | ' + JSON.stringify(it)).join('')}\\n`\n\t\t}\n\t\tcode += `export type ContemberClientEnums = {\\n`\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `\\t${enumName}: ${getEnumTypeName(enumName)}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\treturn code\n\t}\n}\n"],"names":[],"mappings":";AAGO,MAAM,wBAAwB;AAAA,EACpC,SAAS,OAA6B;AACrC,QAAI,OAAO;AACA,eAAA,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AAC7D,cAAQ,eAAe,gBAAgB,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAA,OAAM,WAAY,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,IAAA;AAExG,YAAA;AAAA;AACR,eAAW,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG;AAChD,cAAQ,IAAK,QAAQ,KAAK,gBAAgB,QAAQ,CAAC;AAAA;AAAA,IAAA;AAE5C,YAAA;AACD,WAAA;AAAA,EAAA;AAET;"}
1
+ {"version":3,"file":"EnumTypeSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/EnumTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { getEnumTypeName } from './utils'\n\nexport class EnumTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const [enumName, values] of Object.entries(model.enums)) {\n\t\t\tcode += `export type ${getEnumTypeName(enumName)} = ${values.map(it => '\\n\\t | ' + JSON.stringify(it)).join('')}\\n`\n\t\t}\n\t\tcode += `export type ContemberClientEnums = {\\n`\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `\\t${enumName}: ${getEnumTypeName(enumName)}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\treturn code\n\t}\n}\n"],"names":[],"mappings":";AAGO,MAAM,wBAAwB;AAAA,EACpC,SAAS,OAA6B;AACrC,QAAI,OAAO;AACX,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AAC7D,cAAQ,eAAe,gBAAgB,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAA,OAAM,WAAY,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,IAChH;AACA,YAAQ;AAAA;AACR,eAAW,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG;AAChD,cAAQ,IAAK,QAAQ,KAAK,gBAAgB,QAAQ,CAAC;AAAA;AAAA,IACpD;AACA,YAAQ;AACR,WAAO;AAAA,EACR;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"NameSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/NameSchemaGenerator.ts"],"sourcesContent":["import { SchemaNames, SchemaEntityNames } from '@contember/client-content'\nimport { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor } from '@contember/schema-utils'\n\nexport class NameSchemaGenerator {\n\tgenerate(model: Model.Schema): SchemaNames {\n\t\treturn {\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.values(model.entities).map(entity => {\n\t\t\t\t\tconst fields: Record<string, SchemaEntityNames<any>['fields'][string]> = {}\n\t\t\t\t\tconst scalars: string[] = []\n\n\t\t\t\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\t\t\t\tvisitHasOne: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'one',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitHasMany: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'many',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitColumn: ctx => {\n\t\t\t\t\t\t\tscalars.push(ctx.column.name)\n\t\t\t\t\t\t\tfields[ctx.column.name] = {\n\t\t\t\t\t\t\t\ttype: 'column',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\treturn [entity.name, { name: entity.name, fields, scalars }]\n\t\t\t\t}),\n\t\t\t),\n\t\t\tenums: Object.fromEntries(\n\t\t\t\tObject.entries(model.enums).map(([name, enumType]) => [name, enumType]),\n\t\t\t),\n\t\t}\n\t}\n}\n\n\n"],"names":["acceptEveryFieldVisitor"],"mappings":";;;AAIO,MAAM,oBAAoB;AAAA,EAChC,SAAS,OAAkC;AACnC,WAAA;AAAA,MACN,UAAU,OAAO;AAAA,QAChB,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAU,WAAA;AAC3C,gBAAM,SAAmE,CAAC;AAC1E,gBAAM,UAAoB,CAAC;AAE3BA,sBAAA,wBAAwB,OAAO,QAAQ;AAAA,YACtC,aAAa,CAAO,QAAA;AACZ,qBAAA,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAC1B;AAAA,YACD;AAAA,YACA,cAAc,CAAO,QAAA;AACb,qBAAA,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAC1B;AAAA,YACD;AAAA,YACA,aAAa,CAAO,QAAA;AACX,sBAAA,KAAK,IAAI,OAAO,IAAI;AACrB,qBAAA,IAAI,OAAO,IAAI,IAAI;AAAA,gBACzB,MAAM;AAAA,cACP;AAAA,YAAA;AAAA,UACD,CACA;AAEM,iBAAA,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS;AAAA,QAC3D,CAAA;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAA;AAAA,IAExE;AAAA,EAAA;AAEF;;"}
1
+ {"version":3,"file":"NameSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/NameSchemaGenerator.ts"],"sourcesContent":["import { SchemaEntityNames, SchemaNames } from '@contember/client-content'\nimport { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor } from '@contember/schema-utils'\n\nexport class NameSchemaGenerator {\n\tgenerate(model: Model.Schema): SchemaNames {\n\t\treturn {\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.values(model.entities).map(entity => {\n\t\t\t\t\tconst fields: Record<string, SchemaEntityNames<any>['fields'][string]> = {}\n\t\t\t\t\tconst scalars: string[] = []\n\n\t\t\t\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\t\t\t\tvisitHasOne: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'one',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitHasMany: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'many',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitColumn: ctx => {\n\t\t\t\t\t\t\tscalars.push(ctx.column.name)\n\t\t\t\t\t\t\tfields[ctx.column.name] = {\n\t\t\t\t\t\t\t\ttype: 'column',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\treturn [entity.name, { name: entity.name, fields, scalars }]\n\t\t\t\t}),\n\t\t\t),\n\t\t\tenums: Object.fromEntries(\n\t\t\t\tObject.entries(model.enums).map(([name, enumType]) => [name, enumType]),\n\t\t\t),\n\t\t}\n\t}\n}\n"],"names":["acceptEveryFieldVisitor"],"mappings":";;;AAIO,MAAM,oBAAoB;AAAA,EAChC,SAAS,OAAkC;AAC1C,WAAO;AAAA,MACN,UAAU,OAAO;AAAA,QAChB,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,WAAU;AAC3C,gBAAM,SAAmE,CAAA;AACzE,gBAAM,UAAoB,CAAA;AAE1BA,sBAAAA,wBAAwB,OAAO,QAAQ;AAAA,YACtC,aAAa,CAAA,QAAO;AACnB,qBAAO,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAAA;AAAA,YAE3B;AAAA,YACA,cAAc,CAAA,QAAO;AACpB,qBAAO,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAAA;AAAA,YAE3B;AAAA,YACA,aAAa,CAAA,QAAO;AACnB,sBAAQ,KAAK,IAAI,OAAO,IAAI;AAC5B,qBAAO,IAAI,OAAO,IAAI,IAAI;AAAA,gBACzB,MAAM;AAAA,cAAA;AAAA,YAER;AAAA,UAAA,CACA;AAED,iBAAO,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS;AAAA,QAC5D,CAAC;AAAA,MAAA;AAAA,MAEF,OAAO,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAA;AAAA,IACvE;AAAA,EAEF;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"NameSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/NameSchemaGenerator.ts"],"sourcesContent":["import { SchemaNames, SchemaEntityNames } from '@contember/client-content'\nimport { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor } from '@contember/schema-utils'\n\nexport class NameSchemaGenerator {\n\tgenerate(model: Model.Schema): SchemaNames {\n\t\treturn {\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.values(model.entities).map(entity => {\n\t\t\t\t\tconst fields: Record<string, SchemaEntityNames<any>['fields'][string]> = {}\n\t\t\t\t\tconst scalars: string[] = []\n\n\t\t\t\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\t\t\t\tvisitHasOne: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'one',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitHasMany: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'many',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitColumn: ctx => {\n\t\t\t\t\t\t\tscalars.push(ctx.column.name)\n\t\t\t\t\t\t\tfields[ctx.column.name] = {\n\t\t\t\t\t\t\t\ttype: 'column',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\treturn [entity.name, { name: entity.name, fields, scalars }]\n\t\t\t\t}),\n\t\t\t),\n\t\t\tenums: Object.fromEntries(\n\t\t\t\tObject.entries(model.enums).map(([name, enumType]) => [name, enumType]),\n\t\t\t),\n\t\t}\n\t}\n}\n\n\n"],"names":[],"mappings":";AAIO,MAAM,oBAAoB;AAAA,EAChC,SAAS,OAAkC;AACnC,WAAA;AAAA,MACN,UAAU,OAAO;AAAA,QAChB,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAU,WAAA;AAC3C,gBAAM,SAAmE,CAAC;AAC1E,gBAAM,UAAoB,CAAC;AAE3B,kCAAwB,OAAO,QAAQ;AAAA,YACtC,aAAa,CAAO,QAAA;AACZ,qBAAA,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAC1B;AAAA,YACD;AAAA,YACA,cAAc,CAAO,QAAA;AACb,qBAAA,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAC1B;AAAA,YACD;AAAA,YACA,aAAa,CAAO,QAAA;AACX,sBAAA,KAAK,IAAI,OAAO,IAAI;AACrB,qBAAA,IAAI,OAAO,IAAI,IAAI;AAAA,gBACzB,MAAM;AAAA,cACP;AAAA,YAAA;AAAA,UACD,CACA;AAEM,iBAAA,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS;AAAA,QAC3D,CAAA;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAA;AAAA,IAExE;AAAA,EAAA;AAEF;"}
1
+ {"version":3,"file":"NameSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/NameSchemaGenerator.ts"],"sourcesContent":["import { SchemaEntityNames, SchemaNames } from '@contember/client-content'\nimport { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor } from '@contember/schema-utils'\n\nexport class NameSchemaGenerator {\n\tgenerate(model: Model.Schema): SchemaNames {\n\t\treturn {\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.values(model.entities).map(entity => {\n\t\t\t\t\tconst fields: Record<string, SchemaEntityNames<any>['fields'][string]> = {}\n\t\t\t\t\tconst scalars: string[] = []\n\n\t\t\t\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\t\t\t\tvisitHasOne: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'one',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitHasMany: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'many',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitColumn: ctx => {\n\t\t\t\t\t\t\tscalars.push(ctx.column.name)\n\t\t\t\t\t\t\tfields[ctx.column.name] = {\n\t\t\t\t\t\t\t\ttype: 'column',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\treturn [entity.name, { name: entity.name, fields, scalars }]\n\t\t\t\t}),\n\t\t\t),\n\t\t\tenums: Object.fromEntries(\n\t\t\t\tObject.entries(model.enums).map(([name, enumType]) => [name, enumType]),\n\t\t\t),\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,oBAAoB;AAAA,EAChC,SAAS,OAAkC;AAC1C,WAAO;AAAA,MACN,UAAU,OAAO;AAAA,QAChB,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,WAAU;AAC3C,gBAAM,SAAmE,CAAA;AACzE,gBAAM,UAAoB,CAAA;AAE1B,kCAAwB,OAAO,QAAQ;AAAA,YACtC,aAAa,CAAA,QAAO;AACnB,qBAAO,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAAA;AAAA,YAE3B;AAAA,YACA,cAAc,CAAA,QAAO;AACpB,qBAAO,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAAA;AAAA,YAE3B;AAAA,YACA,aAAa,CAAA,QAAO;AACnB,sBAAQ,KAAK,IAAI,OAAO,IAAI;AAC5B,qBAAO,IAAI,OAAO,IAAI,IAAI;AAAA,gBACzB,MAAM;AAAA,cAAA;AAAA,YAER;AAAA,UAAA,CACA;AAED,iBAAO,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS;AAAA,QAC5D,CAAC;AAAA,MAAA;AAAA,MAEF,OAAO,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAA;AAAA,IACvE;AAAA,EAEF;AACD;"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"generate.cjs","sources":["../../../packages/client-content-generator/src/generate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs/promises'\nimport { resolve, join } from 'node:path'\nimport { ContemberClientGenerator } from './ContemberClientGenerator';\n\n(async () => {\n\tconst schemaPath = process.argv[2]\n\tconst outDir = process.argv[3]\n\n\tif (!schemaPath || !outDir) {\n\t\tconsole.error(`Usage:\n\nFrom file:\nyarn contember-client-generator <schema.json> <out-dir>\n\nFrom stdin:\nyarn run --silent contember project:print-schema --format=schema | yarn contember-client-generator - <out-dir>\n`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst sourceData = await (async () => {\n\t\tif (schemaPath === '-') {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tthrow new Error('Cannot read from stdin in TTY mode')\n\t\t\t}\n\t\t\tconst buffer = []\n\t\t\tfor await (const chunk of process.stdin) {\n\t\t\t\tbuffer.push(chunk)\n\t\t\t}\n\t\t\treturn Buffer.concat(buffer).toString('utf8')\n\t\t}\n\t\treturn await fs.readFile(resolve(process.cwd(), process.argv[2]), 'utf8')\n\t})()\n\n\tconst source = JSON.parse(sourceData)\n\n\tconst dir = resolve(process.cwd(), process.argv[3])\n\tconst generator = new ContemberClientGenerator()\n\tconst result = generator.generate(source.model)\n\tawait fs.mkdir(dir, { recursive: true })\n\tfor (const [name, content] of Object.entries(result)) {\n\t\tawait fs.writeFile(join(dir, name), content, 'utf8')\n\t}\n})().catch(e => {\n\tconsole.error(e)\n\tprocess.exit(1)\n})\n\n"],"names":["fs","resolve","ContemberClientGenerator","join"],"mappings":";;;;;;;;;;;;;;;;;;;;;;CAKC,YAAY;AACN,QAAA,aAAa,QAAQ,KAAK,CAAC;AAC3B,QAAA,SAAS,QAAQ,KAAK,CAAC;AAEzB,MAAA,CAAC,cAAc,CAAC,QAAQ;AAC3B,YAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOf;AACC,YAAQ,KAAK,CAAC;AAAA,EAAA;AAGT,QAAA,aAAa,OAAO,YAAY;AACrC,QAAI,eAAe,KAAK;AACnB,UAAA,QAAQ,MAAM,OAAO;AAClB,cAAA,IAAI,MAAM,oCAAoC;AAAA,MAAA;AAErD,YAAM,SAAS,CAAC;AACC,uBAAA,SAAS,QAAQ,OAAO;AACxC,eAAO,KAAK,KAAK;AAAA,MAAA;AAElB,aAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAAA;AAE7C,WAAO,MAAMA,cAAG,SAASC,UAAAA,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EAAA,GACtE;AAEG,QAAA,SAAS,KAAK,MAAM,UAAU;AAE9B,QAAA,MAAMA,kBAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC;AAC5C,QAAA,YAAY,IAAIC,kDAAyB;AAC/C,QAAM,SAAS,UAAU,SAAS,OAAO,KAAK;AAC9C,QAAMF,cAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AACvC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAMA,cAAG,UAAUG,UAAA,KAAK,KAAK,IAAI,GAAG,SAAS,MAAM;AAAA,EAAA;AAErD,KAAK,MAAM,CAAK,MAAA;AACf,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AACf,CAAC;"}
1
+ {"version":3,"file":"generate.cjs","sources":["../../../packages/client-content-generator/src/generate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport { ContemberClientGenerator } from './ContemberClientGenerator'\n;(async () => {\n\tconst schemaPath = process.argv[2]\n\tconst outDir = process.argv[3]\n\n\tif (!schemaPath || !outDir) {\n\t\tconsole.error(`Usage:\n\nFrom file:\nyarn contember-client-generator <schema.json> <out-dir>\n\nFrom stdin:\nyarn run --silent contember project:print-schema --format=schema | yarn contember-client-generator - <out-dir>\n`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst sourceData = await (async () => {\n\t\tif (schemaPath === '-') {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tthrow new Error('Cannot read from stdin in TTY mode')\n\t\t\t}\n\t\t\tconst buffer = []\n\t\t\tfor await (const chunk of process.stdin) {\n\t\t\t\tbuffer.push(chunk)\n\t\t\t}\n\t\t\treturn Buffer.concat(buffer).toString('utf8')\n\t\t}\n\t\treturn await fs.readFile(resolve(process.cwd(), process.argv[2]), 'utf8')\n\t})()\n\n\tconst source = JSON.parse(sourceData)\n\n\tconst dir = resolve(process.cwd(), process.argv[3])\n\tconst generator = new ContemberClientGenerator()\n\tconst result = generator.generate(source.model)\n\tawait fs.mkdir(dir, { recursive: true })\n\tfor (const [name, content] of Object.entries(result)) {\n\t\tawait fs.writeFile(join(dir, name), content, 'utf8')\n\t}\n})().catch(e => {\n\tconsole.error(e)\n\tprocess.exit(1)\n})\n"],"names":["fs","resolve","ContemberClientGenerator","join"],"mappings":";;;;;;;;;;;;;;;;;;;;;;CAIE,YAAY;AACb,QAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,QAAM,SAAS,QAAQ,KAAK,CAAC;AAE7B,MAAI,CAAC,cAAc,CAAC,QAAQ;AAC3B,YAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOf;AACC,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,aAAa,OAAO,YAAY;AACrC,QAAI,eAAe,KAAK;AACvB,UAAI,QAAQ,MAAM,OAAO;AACxB,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACrD;AACA,YAAM,SAAS,CAAA;AACf,uBAAiB,SAAS,QAAQ,OAAO;AACxC,eAAO,KAAK,KAAK;AAAA,MAClB;AACA,aAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAC7C;AACA,WAAO,MAAMA,cAAG,SAASC,UAAAA,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EACzE,GAAA;AAEA,QAAM,SAAS,KAAK,MAAM,UAAU;AAEpC,QAAM,MAAMA,UAAAA,QAAQ,QAAQ,IAAA,GAAO,QAAQ,KAAK,CAAC,CAAC;AAClD,QAAM,YAAY,IAAIC,kDAAA;AACtB,QAAM,SAAS,UAAU,SAAS,OAAO,KAAK;AAC9C,QAAMF,cAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AACvC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAMA,cAAG,UAAUG,UAAAA,KAAK,KAAK,IAAI,GAAG,SAAS,MAAM;AAAA,EACpD;AACD,KAAK,MAAM,CAAA,MAAK;AACf,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AACf,CAAC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sources":["../../../packages/client-content-generator/src/generate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs/promises'\nimport { resolve, join } from 'node:path'\nimport { ContemberClientGenerator } from './ContemberClientGenerator';\n\n(async () => {\n\tconst schemaPath = process.argv[2]\n\tconst outDir = process.argv[3]\n\n\tif (!schemaPath || !outDir) {\n\t\tconsole.error(`Usage:\n\nFrom file:\nyarn contember-client-generator <schema.json> <out-dir>\n\nFrom stdin:\nyarn run --silent contember project:print-schema --format=schema | yarn contember-client-generator - <out-dir>\n`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst sourceData = await (async () => {\n\t\tif (schemaPath === '-') {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tthrow new Error('Cannot read from stdin in TTY mode')\n\t\t\t}\n\t\t\tconst buffer = []\n\t\t\tfor await (const chunk of process.stdin) {\n\t\t\t\tbuffer.push(chunk)\n\t\t\t}\n\t\t\treturn Buffer.concat(buffer).toString('utf8')\n\t\t}\n\t\treturn await fs.readFile(resolve(process.cwd(), process.argv[2]), 'utf8')\n\t})()\n\n\tconst source = JSON.parse(sourceData)\n\n\tconst dir = resolve(process.cwd(), process.argv[3])\n\tconst generator = new ContemberClientGenerator()\n\tconst result = generator.generate(source.model)\n\tawait fs.mkdir(dir, { recursive: true })\n\tfor (const [name, content] of Object.entries(result)) {\n\t\tawait fs.writeFile(join(dir, name), content, 'utf8')\n\t}\n})().catch(e => {\n\tconsole.error(e)\n\tprocess.exit(1)\n})\n\n"],"names":[],"mappings":";;;;CAKC,YAAY;AACN,QAAA,aAAa,QAAQ,KAAK,CAAC;AAC3B,QAAA,SAAS,QAAQ,KAAK,CAAC;AAEzB,MAAA,CAAC,cAAc,CAAC,QAAQ;AAC3B,YAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOf;AACC,YAAQ,KAAK,CAAC;AAAA,EAAA;AAGT,QAAA,aAAa,OAAO,YAAY;AACrC,QAAI,eAAe,KAAK;AACnB,UAAA,QAAQ,MAAM,OAAO;AAClB,cAAA,IAAI,MAAM,oCAAoC;AAAA,MAAA;AAErD,YAAM,SAAS,CAAC;AACC,uBAAA,SAAS,QAAQ,OAAO;AACxC,eAAO,KAAK,KAAK;AAAA,MAAA;AAElB,aAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAAA;AAE7C,WAAO,MAAM,GAAG,SAAS,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EAAA,GACtE;AAEG,QAAA,SAAS,KAAK,MAAM,UAAU;AAE9B,QAAA,MAAM,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC;AAC5C,QAAA,YAAY,IAAI,yBAAyB;AAC/C,QAAM,SAAS,UAAU,SAAS,OAAO,KAAK;AAC9C,QAAM,GAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AACvC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAM,GAAG,UAAU,KAAK,KAAK,IAAI,GAAG,SAAS,MAAM;AAAA,EAAA;AAErD,KAAK,MAAM,CAAK,MAAA;AACf,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AACf,CAAC;"}
1
+ {"version":3,"file":"generate.js","sources":["../../../packages/client-content-generator/src/generate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport { ContemberClientGenerator } from './ContemberClientGenerator'\n;(async () => {\n\tconst schemaPath = process.argv[2]\n\tconst outDir = process.argv[3]\n\n\tif (!schemaPath || !outDir) {\n\t\tconsole.error(`Usage:\n\nFrom file:\nyarn contember-client-generator <schema.json> <out-dir>\n\nFrom stdin:\nyarn run --silent contember project:print-schema --format=schema | yarn contember-client-generator - <out-dir>\n`)\n\t\tprocess.exit(1)\n\t}\n\n\tconst sourceData = await (async () => {\n\t\tif (schemaPath === '-') {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tthrow new Error('Cannot read from stdin in TTY mode')\n\t\t\t}\n\t\t\tconst buffer = []\n\t\t\tfor await (const chunk of process.stdin) {\n\t\t\t\tbuffer.push(chunk)\n\t\t\t}\n\t\t\treturn Buffer.concat(buffer).toString('utf8')\n\t\t}\n\t\treturn await fs.readFile(resolve(process.cwd(), process.argv[2]), 'utf8')\n\t})()\n\n\tconst source = JSON.parse(sourceData)\n\n\tconst dir = resolve(process.cwd(), process.argv[3])\n\tconst generator = new ContemberClientGenerator()\n\tconst result = generator.generate(source.model)\n\tawait fs.mkdir(dir, { recursive: true })\n\tfor (const [name, content] of Object.entries(result)) {\n\t\tawait fs.writeFile(join(dir, name), content, 'utf8')\n\t}\n})().catch(e => {\n\tconsole.error(e)\n\tprocess.exit(1)\n})\n"],"names":[],"mappings":";;;;CAIE,YAAY;AACb,QAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,QAAM,SAAS,QAAQ,KAAK,CAAC;AAE7B,MAAI,CAAC,cAAc,CAAC,QAAQ;AAC3B,YAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOf;AACC,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,aAAa,OAAO,YAAY;AACrC,QAAI,eAAe,KAAK;AACvB,UAAI,QAAQ,MAAM,OAAO;AACxB,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACrD;AACA,YAAM,SAAS,CAAA;AACf,uBAAiB,SAAS,QAAQ,OAAO;AACxC,eAAO,KAAK,KAAK;AAAA,MAClB;AACA,aAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAC7C;AACA,WAAO,MAAM,GAAG,SAAS,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EACzE,GAAA;AAEA,QAAM,SAAS,KAAK,MAAM,UAAU;AAEpC,QAAM,MAAM,QAAQ,QAAQ,IAAA,GAAO,QAAQ,KAAK,CAAC,CAAC;AAClD,QAAM,YAAY,IAAI,yBAAA;AACtB,QAAM,SAAS,UAAU,SAAS,OAAO,KAAK;AAC9C,QAAM,GAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AACvC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,UAAM,GAAG,UAAU,KAAK,KAAK,IAAI,GAAG,SAAS,MAAM;AAAA,EACpD;AACD,KAAK,MAAM,CAAA,MAAK;AACf,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AACf,CAAC;"}
@@ -13,8 +13,13 @@ class ContemberClientGenerator {
13
13
  const nameSchema = this.nameSchemaGenerator.generate(model);
14
14
  const enumTypeSchema = this.enumTypeSchemaGenerator.generate(model);
15
15
  const entityTypeSchema = this.entityTypeSchemaGenerator.generate(model);
16
- const namesCode = `import { SchemaNames } from '@contember/client-content'
17
- export const ContemberClientNames: SchemaNames = ` + JSON.stringify(nameSchema, null, 2);
16
+ const namesCode = `import type { SchemaNames, SchemaEntityNames } from '@contember/client-content'
17
+ import type { ContemberClientEntities } from './entities'
18
+ import type { ContemberClientEnums } from './enums'
19
+ export const ContemberClientNames = {
20
+ entities: ${JSON.stringify(nameSchema.entities, null, " ").replaceAll("\n", "\n ")} satisfies {[K in keyof ContemberClientEntities]: SchemaEntityNames<K>},
21
+ enums: ${JSON.stringify(nameSchema.enums, null, " ").replaceAll("\n", "\n ")} satisfies {[K in keyof ContemberClientEnums]: readonly ContemberClientEnums[K][]},
22
+ } satisfies SchemaNames`;
18
23
  const indexCode = `
19
24
  import { ContemberClientNames } from './names'
20
25
  import type { ContemberClientSchema } from './entities'
@@ -1 +1 @@
1
- {"version":3,"file":"ContemberClientGenerator.cjs","sources":["../../../../packages/client-content-generator/src/ContemberClientGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { EnumTypeSchemaGenerator } from './EnumTypeSchemaGenerator'\nimport { EntityTypeSchemaGenerator } from './EntityTypeSchemaGenerator'\nimport { NameSchemaGenerator } from './NameSchemaGenerator'\n\n\nexport class ContemberClientGenerator {\n\tconstructor(\n\t\tprivate readonly nameSchemaGenerator: NameSchemaGenerator = new NameSchemaGenerator(),\n\t\tprivate readonly enumTypeSchemaGenerator: EnumTypeSchemaGenerator = new EnumTypeSchemaGenerator(),\n\t\tprivate readonly entityTypeSchemaGenerator: EntityTypeSchemaGenerator = new EntityTypeSchemaGenerator(),\n\t) {\n\t}\n\n\tgenerate(model: Model.Schema): Record<string, string> {\n\t\tconst nameSchema = this.nameSchemaGenerator.generate(model)\n\t\tconst enumTypeSchema = this.enumTypeSchemaGenerator.generate(model)\n\t\tconst entityTypeSchema = this.entityTypeSchemaGenerator.generate(model)\n\n\t\tconst namesCode = `import { SchemaNames } from '@contember/client-content'\nexport const ContemberClientNames: SchemaNames = ` + JSON.stringify(nameSchema, null, 2)\n\n\t\tconst indexCode = `\nimport { ContemberClientNames } from './names'\nimport type { ContemberClientSchema } from './entities'\nimport { ContentQueryBuilder, TypedContentQueryBuilder, TypedEntitySelection } from '@contember/client-content'\nexport * from './names'\nexport * from './enums'\nexport * from './entities'\n\nexport const queryBuilder = new ContentQueryBuilder(ContemberClientNames) as unknown as TypedContentQueryBuilder<ContemberClientSchema>\n\nexport type FragmentOf<EntityName extends keyof ContemberClientSchema['entities'] & string, Data = unknown> =\nTypedEntitySelection<ContemberClientSchema, EntityName, ContemberClientSchema['entities'][EntityName], Data>\n\nexport type FragmentType<T extends TypedEntitySelection<any, any, any, any> = any> =\nT extends TypedEntitySelection<any, any, any, infer TFields>\n\t? TFields\n\t: never\n`\n\t\treturn {\n\t\t\t'names.ts': namesCode,\n\t\t\t'enums.ts': enumTypeSchema,\n\t\t\t'entities.ts': entityTypeSchema,\n\t\t\t'index.ts': indexCode,\n\t\t}\n\t}\n}\n"],"names":["NameSchemaGenerator","EnumTypeSchemaGenerator","EntityTypeSchemaGenerator"],"mappings":";;;;;AAMO,MAAM,yBAAyB;AAAA,EACrC,YACkB,sBAA2C,IAAIA,oBAAAA,uBAC/C,0BAAmD,IAAIC,wBAAAA,2BACvD,4BAAuD,IAAIC,0BAAAA,6BAC3E;AAHgB,SAAA,sBAAA;AACA,SAAA,0BAAA;AACA,SAAA,4BAAA;AAAA,EAAA;AAAA,EAIlB,SAAS,OAA6C;AACrD,UAAM,aAAa,KAAK,oBAAoB,SAAS,KAAK;AAC1D,UAAM,iBAAiB,KAAK,wBAAwB,SAAS,KAAK;AAClE,UAAM,mBAAmB,KAAK,0BAA0B,SAAS,KAAK;AAEtE,UAAM,YAAY;AAAA,qDACiC,KAAK,UAAU,YAAY,MAAM,CAAC;AAErF,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBX,WAAA;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,IACb;AAAA,EAAA;AAEF;;"}
1
+ {"version":3,"file":"ContemberClientGenerator.cjs","sources":["../../../../packages/client-content-generator/src/ContemberClientGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { EnumTypeSchemaGenerator } from './EnumTypeSchemaGenerator'\nimport { EntityTypeSchemaGenerator } from './EntityTypeSchemaGenerator'\nimport { NameSchemaGenerator } from './NameSchemaGenerator'\n\nexport class ContemberClientGenerator {\n\tconstructor(\n\t\tprivate readonly nameSchemaGenerator: NameSchemaGenerator = new NameSchemaGenerator(),\n\t\tprivate readonly enumTypeSchemaGenerator: EnumTypeSchemaGenerator = new EnumTypeSchemaGenerator(),\n\t\tprivate readonly entityTypeSchemaGenerator: EntityTypeSchemaGenerator = new EntityTypeSchemaGenerator(),\n\t) {\n\t}\n\n\tgenerate(model: Model.Schema): Record<string, string> {\n\t\tconst nameSchema = this.nameSchemaGenerator.generate(model)\n\t\tconst enumTypeSchema = this.enumTypeSchemaGenerator.generate(model)\n\t\tconst entityTypeSchema = this.entityTypeSchemaGenerator.generate(model)\n\n\t\tconst namesCode = `import type { SchemaNames, SchemaEntityNames } from '@contember/client-content'\nimport type { ContemberClientEntities } from './entities'\nimport type { ContemberClientEnums } from './enums'\nexport const ContemberClientNames = {\n\tentities: ${\n\t\t\tJSON.stringify(nameSchema.entities, null, '\\t').replaceAll('\\n', '\\n\\t')\n\t\t} satisfies {[K in keyof ContemberClientEntities]: SchemaEntityNames<K>},\n\tenums: ${\n\t\t\tJSON.stringify(nameSchema.enums, null, '\\t').replaceAll('\\n', '\\n\\t')\n\t\t} satisfies {[K in keyof ContemberClientEnums]: readonly ContemberClientEnums[K][]},\n} satisfies SchemaNames`\n\n\t\tconst indexCode = `\nimport { ContemberClientNames } from './names'\nimport type { ContemberClientSchema } from './entities'\nimport { ContentQueryBuilder, TypedContentQueryBuilder, TypedEntitySelection } from '@contember/client-content'\nexport * from './names'\nexport * from './enums'\nexport * from './entities'\n\nexport const queryBuilder = new ContentQueryBuilder(ContemberClientNames) as unknown as TypedContentQueryBuilder<ContemberClientSchema>\n\nexport type FragmentOf<EntityName extends keyof ContemberClientSchema['entities'] & string, Data = unknown> =\nTypedEntitySelection<ContemberClientSchema, EntityName, ContemberClientSchema['entities'][EntityName], Data>\n\nexport type FragmentType<T extends TypedEntitySelection<any, any, any, any> = any> =\nT extends TypedEntitySelection<any, any, any, infer TFields>\n\t? TFields\n\t: never\n`\n\t\treturn {\n\t\t\t'names.ts': namesCode,\n\t\t\t'enums.ts': enumTypeSchema,\n\t\t\t'entities.ts': entityTypeSchema,\n\t\t\t'index.ts': indexCode,\n\t\t}\n\t}\n}\n"],"names":["NameSchemaGenerator","EnumTypeSchemaGenerator","EntityTypeSchemaGenerator"],"mappings":";;;;;AAKO,MAAM,yBAAyB;AAAA,EACrC,YACkB,sBAA2C,IAAIA,oBAAAA,uBAC/C,0BAAmD,IAAIC,wBAAAA,2BACvD,4BAAuD,IAAIC,0BAAAA,6BAC3E;AAHgB,SAAA,sBAAA;AACA,SAAA,0BAAA;AACA,SAAA,4BAAA;AAAA,EAElB;AAAA,EAEA,SAAS,OAA6C;AACrD,UAAM,aAAa,KAAK,oBAAoB,SAAS,KAAK;AAC1D,UAAM,iBAAiB,KAAK,wBAAwB,SAAS,KAAK;AAClE,UAAM,mBAAmB,KAAK,0BAA0B,SAAS,KAAK;AAEtE,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA,aAKjB,KAAK,UAAU,WAAW,UAAU,MAAM,GAAI,EAAE,WAAW,MAAM,KAAM,CACxE;AAAA,UAEC,KAAK,UAAU,WAAW,OAAO,MAAM,GAAI,EAAE,WAAW,MAAM,KAAM,CACrE;AAAA;AAGA,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBlB,WAAO;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,EAEd;AACD;;"}
@@ -11,8 +11,13 @@ class ContemberClientGenerator {
11
11
  const nameSchema = this.nameSchemaGenerator.generate(model);
12
12
  const enumTypeSchema = this.enumTypeSchemaGenerator.generate(model);
13
13
  const entityTypeSchema = this.entityTypeSchemaGenerator.generate(model);
14
- const namesCode = `import { SchemaNames } from '@contember/client-content'
15
- export const ContemberClientNames: SchemaNames = ` + JSON.stringify(nameSchema, null, 2);
14
+ const namesCode = `import type { SchemaNames, SchemaEntityNames } from '@contember/client-content'
15
+ import type { ContemberClientEntities } from './entities'
16
+ import type { ContemberClientEnums } from './enums'
17
+ export const ContemberClientNames = {
18
+ entities: ${JSON.stringify(nameSchema.entities, null, " ").replaceAll("\n", "\n ")} satisfies {[K in keyof ContemberClientEntities]: SchemaEntityNames<K>},
19
+ enums: ${JSON.stringify(nameSchema.enums, null, " ").replaceAll("\n", "\n ")} satisfies {[K in keyof ContemberClientEnums]: readonly ContemberClientEnums[K][]},
20
+ } satisfies SchemaNames`;
16
21
  const indexCode = `
17
22
  import { ContemberClientNames } from './names'
18
23
  import type { ContemberClientSchema } from './entities'
@@ -1 +1 @@
1
- {"version":3,"file":"ContemberClientGenerator.js","sources":["../../../../packages/client-content-generator/src/ContemberClientGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { EnumTypeSchemaGenerator } from './EnumTypeSchemaGenerator'\nimport { EntityTypeSchemaGenerator } from './EntityTypeSchemaGenerator'\nimport { NameSchemaGenerator } from './NameSchemaGenerator'\n\n\nexport class ContemberClientGenerator {\n\tconstructor(\n\t\tprivate readonly nameSchemaGenerator: NameSchemaGenerator = new NameSchemaGenerator(),\n\t\tprivate readonly enumTypeSchemaGenerator: EnumTypeSchemaGenerator = new EnumTypeSchemaGenerator(),\n\t\tprivate readonly entityTypeSchemaGenerator: EntityTypeSchemaGenerator = new EntityTypeSchemaGenerator(),\n\t) {\n\t}\n\n\tgenerate(model: Model.Schema): Record<string, string> {\n\t\tconst nameSchema = this.nameSchemaGenerator.generate(model)\n\t\tconst enumTypeSchema = this.enumTypeSchemaGenerator.generate(model)\n\t\tconst entityTypeSchema = this.entityTypeSchemaGenerator.generate(model)\n\n\t\tconst namesCode = `import { SchemaNames } from '@contember/client-content'\nexport const ContemberClientNames: SchemaNames = ` + JSON.stringify(nameSchema, null, 2)\n\n\t\tconst indexCode = `\nimport { ContemberClientNames } from './names'\nimport type { ContemberClientSchema } from './entities'\nimport { ContentQueryBuilder, TypedContentQueryBuilder, TypedEntitySelection } from '@contember/client-content'\nexport * from './names'\nexport * from './enums'\nexport * from './entities'\n\nexport const queryBuilder = new ContentQueryBuilder(ContemberClientNames) as unknown as TypedContentQueryBuilder<ContemberClientSchema>\n\nexport type FragmentOf<EntityName extends keyof ContemberClientSchema['entities'] & string, Data = unknown> =\nTypedEntitySelection<ContemberClientSchema, EntityName, ContemberClientSchema['entities'][EntityName], Data>\n\nexport type FragmentType<T extends TypedEntitySelection<any, any, any, any> = any> =\nT extends TypedEntitySelection<any, any, any, infer TFields>\n\t? TFields\n\t: never\n`\n\t\treturn {\n\t\t\t'names.ts': namesCode,\n\t\t\t'enums.ts': enumTypeSchema,\n\t\t\t'entities.ts': entityTypeSchema,\n\t\t\t'index.ts': indexCode,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAMO,MAAM,yBAAyB;AAAA,EACrC,YACkB,sBAA2C,IAAI,uBAC/C,0BAAmD,IAAI,2BACvD,4BAAuD,IAAI,6BAC3E;AAHgB,SAAA,sBAAA;AACA,SAAA,0BAAA;AACA,SAAA,4BAAA;AAAA,EAAA;AAAA,EAIlB,SAAS,OAA6C;AACrD,UAAM,aAAa,KAAK,oBAAoB,SAAS,KAAK;AAC1D,UAAM,iBAAiB,KAAK,wBAAwB,SAAS,KAAK;AAClE,UAAM,mBAAmB,KAAK,0BAA0B,SAAS,KAAK;AAEtE,UAAM,YAAY;AAAA,qDACiC,KAAK,UAAU,YAAY,MAAM,CAAC;AAErF,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBX,WAAA;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,IACb;AAAA,EAAA;AAEF;"}
1
+ {"version":3,"file":"ContemberClientGenerator.js","sources":["../../../../packages/client-content-generator/src/ContemberClientGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { EnumTypeSchemaGenerator } from './EnumTypeSchemaGenerator'\nimport { EntityTypeSchemaGenerator } from './EntityTypeSchemaGenerator'\nimport { NameSchemaGenerator } from './NameSchemaGenerator'\n\nexport class ContemberClientGenerator {\n\tconstructor(\n\t\tprivate readonly nameSchemaGenerator: NameSchemaGenerator = new NameSchemaGenerator(),\n\t\tprivate readonly enumTypeSchemaGenerator: EnumTypeSchemaGenerator = new EnumTypeSchemaGenerator(),\n\t\tprivate readonly entityTypeSchemaGenerator: EntityTypeSchemaGenerator = new EntityTypeSchemaGenerator(),\n\t) {\n\t}\n\n\tgenerate(model: Model.Schema): Record<string, string> {\n\t\tconst nameSchema = this.nameSchemaGenerator.generate(model)\n\t\tconst enumTypeSchema = this.enumTypeSchemaGenerator.generate(model)\n\t\tconst entityTypeSchema = this.entityTypeSchemaGenerator.generate(model)\n\n\t\tconst namesCode = `import type { SchemaNames, SchemaEntityNames } from '@contember/client-content'\nimport type { ContemberClientEntities } from './entities'\nimport type { ContemberClientEnums } from './enums'\nexport const ContemberClientNames = {\n\tentities: ${\n\t\t\tJSON.stringify(nameSchema.entities, null, '\\t').replaceAll('\\n', '\\n\\t')\n\t\t} satisfies {[K in keyof ContemberClientEntities]: SchemaEntityNames<K>},\n\tenums: ${\n\t\t\tJSON.stringify(nameSchema.enums, null, '\\t').replaceAll('\\n', '\\n\\t')\n\t\t} satisfies {[K in keyof ContemberClientEnums]: readonly ContemberClientEnums[K][]},\n} satisfies SchemaNames`\n\n\t\tconst indexCode = `\nimport { ContemberClientNames } from './names'\nimport type { ContemberClientSchema } from './entities'\nimport { ContentQueryBuilder, TypedContentQueryBuilder, TypedEntitySelection } from '@contember/client-content'\nexport * from './names'\nexport * from './enums'\nexport * from './entities'\n\nexport const queryBuilder = new ContentQueryBuilder(ContemberClientNames) as unknown as TypedContentQueryBuilder<ContemberClientSchema>\n\nexport type FragmentOf<EntityName extends keyof ContemberClientSchema['entities'] & string, Data = unknown> =\nTypedEntitySelection<ContemberClientSchema, EntityName, ContemberClientSchema['entities'][EntityName], Data>\n\nexport type FragmentType<T extends TypedEntitySelection<any, any, any, any> = any> =\nT extends TypedEntitySelection<any, any, any, infer TFields>\n\t? TFields\n\t: never\n`\n\t\treturn {\n\t\t\t'names.ts': namesCode,\n\t\t\t'enums.ts': enumTypeSchema,\n\t\t\t'entities.ts': entityTypeSchema,\n\t\t\t'index.ts': indexCode,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,yBAAyB;AAAA,EACrC,YACkB,sBAA2C,IAAI,uBAC/C,0BAAmD,IAAI,2BACvD,4BAAuD,IAAI,6BAC3E;AAHgB,SAAA,sBAAA;AACA,SAAA,0BAAA;AACA,SAAA,4BAAA;AAAA,EAElB;AAAA,EAEA,SAAS,OAA6C;AACrD,UAAM,aAAa,KAAK,oBAAoB,SAAS,KAAK;AAC1D,UAAM,iBAAiB,KAAK,wBAAwB,SAAS,KAAK;AAClE,UAAM,mBAAmB,KAAK,0BAA0B,SAAS,KAAK;AAEtE,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA,aAKjB,KAAK,UAAU,WAAW,UAAU,MAAM,GAAI,EAAE,WAAW,MAAM,KAAM,CACxE;AAAA,UAEC,KAAK,UAAU,WAAW,OAAO,MAAM,GAAI,EAAE,WAAW,MAAM,KAAM,CACrE;AAAA;AAGA,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBlB,WAAO;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,EAEd;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityTypeSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/EntityTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor, acceptFieldVisitor } from '@contember/schema-utils'\n\nimport { getEnumTypeName } from './utils'\n\nexport class EntityTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `import type { ${getEnumTypeName(enumName)} } from './enums'\\n`\n\t\t}\n\n\t\tcode += `\nexport type JSONPrimitive = string | number | boolean | null\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray\nexport type JSONObject = { readonly [K in string]?: JSONValue }\nexport type JSONArray = readonly JSONValue[]\n\n`\n\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += this.generateTypeEntityCode(model, entity)\n\t\t}\n\t\tcode += '\\n'\n\t\tcode += `export type ContemberClientEntities = {\\n`\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += `\\t${entity.name}: ${entity.name}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\tcode += `export type ContemberClientSchema = {\\n`\n\t\tcode += '\\tentities: ContemberClientEntities\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate generateTypeEntityCode(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = `export type ${entity.name} <OverRelation extends string | never = never> = {\\n`\n\t\tcode += '\\tname: \\'' + entity.name + '\\'\\n'\n\t\tcode += '\\tunique:\\n'\n\t\tcode += this.formatUniqueFields(model, entity)\n\t\tlet columnsCode = ''\n\t\tlet hasOneCode = ''\n\t\tlet hasManyCode = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitHasMany: ctx => {\n\t\t\t\thasManyCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}${ctx.targetRelation?.type === Model.RelationType.ManyHasOne ? `<'${ctx.targetRelation.name}'>` : ''}\\n`\n\t\t\t},\n\t\t\tvisitHasOne: ctx => {\n\t\t\t\thasOneCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}\\n`\n\t\t\t},\n\t\t\tvisitColumn: ctx => {\n\t\t\t\tcolumnsCode += `\\t\\t${ctx.column.name}: ${columnToTsType(ctx.column)}${ctx.column.nullable ? ` | null` : ''}\\n`\n\t\t\t},\n\t\t})\n\n\t\tcode += '\\tcolumns: {\\n'\n\t\tcode += columnsCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasOne: {\\n'\n\t\tcode += hasOneCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasMany: {\\n'\n\t\tcode += hasManyCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasManyBy: {\\n'\n\t\tcode += this.formatReducedFields(model, entity)\n\t\tcode += '\\t}\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate formatReducedFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\tif (!targetRelation) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst uniqueConstraints = getFieldsForUniqueWhere(model, targetEntity)\n\t\t\t\tconst composedUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 2) //todo support all uniques\n\t\t\t\t\t.filter(fields => fields.includes(targetRelation.name))\n\t\t\t\t\t.map(fields => fields.filter(it => it !== targetRelation.name))\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\tconst singleUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 1 && fields[0] !== targetEntity.primary)\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\t\t.filter(it => it !== targetRelation.name)\n\n\t\t\t\t;[...composedUnique, ...singleUnique].forEach(fieldName => {\n\t\t\t\t\tconst capitalizeFirstLetter = (value: string) => {\n\t\t\t\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1)\n\t\t\t\t\t}\n\t\t\t\t\tconst name = `${relation.name}By${capitalizeFirstLetter(fieldName)}`\n\n\t\t\t\t\tconst targetUnique = targetEntity.fields[fieldName]\n\n\t\t\t\t\tcode += `\\t\\t${name}: { entity: ${targetEntity.name}; by: {${fieldName}: ${uniqueType(model, targetEntity, targetUnique)}} }\\n`\n\n\t\t\t\t})\n\t\t\t},\n\t\t\tvisitColumn: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: () => {\n\t\t\t},\n\t\t\tvisitManyHasOne: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: () => {\n\t\t\t},\n\t\t})\n\t\treturn code\n\t}\n\n\tprivate formatUniqueFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tconst fields = getFieldsForUniqueWhere(model, entity)\n\t\tlet code = ''\n\t\tfor (const field of fields) {\n\t\t\tcode += '\\t\\t| Omit<{ '\n\t\t\tcode += field.map(it => `${it}: ${uniqueType(model, entity, entity.fields[it])}`).join(', ')\n\t\t\tcode += '}, OverRelation>\\n'\n\t\t}\n\t\treturn code\n\t}\n}\n\n\nconst uniqueType = (model: Model.Schema, entity: Model.Entity, field: Model.AnyField): string => {\n\treturn acceptFieldVisitor(model, entity, field, {\n\t\tvisitColumn: ctx => {\n\t\t\treturn columnToTsType(ctx.column)\n\t\t},\n\t\tvisitRelation: ctx => {\n\t\t\treturn ctx.targetEntity.name + `['unique']`\n\t\t},\n\t})\n}\n\n\nconst columnToTsType = (column: Model.AnyColumn): string => {\n\tconst baseType = (() => {\n\t\tswitch (column.type) {\n\t\t\tcase Model.ColumnType.Enum:\n\t\t\t\treturn getEnumTypeName(column.columnType)\n\t\t\tcase Model.ColumnType.String:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Int:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Double:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Bool:\n\t\t\t\treturn 'boolean'\n\t\t\tcase Model.ColumnType.DateTime:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Time:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Date:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Json:\n\t\t\t\treturn 'JSONValue'\n\t\t\tcase Model.ColumnType.Uuid:\n\t\t\t\treturn 'string'\n\t\t\tdefault:\n\t\t\t\t((_: never) => {\n\t\t\t\t\tthrow new Error(`Unknown type ${_}`)\n\t\t\t\t})(column.type)\n\t\t}\n\t})()\n\treturn column.list ? `readonly ${baseType}[]` : baseType\n}\n\nconst getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Entity): readonly (readonly string[])[] => {\n\tconst relations = Object.values(\n\t\tacceptEveryFieldVisitor<undefined | [string]>(schema, entity, {\n\t\t\tvisitColumn: () => undefined,\n\t\t\tvisitManyHasManyInverse: () => undefined,\n\t\t\tvisitManyHasManyOwning: () => undefined,\n\t\t\tvisitOneHasMany: ({ relation }) => [relation.name],\n\t\t\tvisitManyHasOne: () => undefined,\n\t\t\tvisitOneHasOneInverse: ({ relation }) => [relation.name],\n\t\t\tvisitOneHasOneOwning: ({ relation }) => [relation.name],\n\t\t}),\n\t).filter((it): it is [string] => !!it)\n\n\treturn [[entity.primary], ...Object.values(entity.unique).map(it => it.fields), ...relations]\n}\n"],"names":["getEnumTypeName","acceptEveryFieldVisitor","Model","entity","acceptFieldVisitor","schema"],"mappings":"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"}
1
+ {"version":3,"file":"EntityTypeSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/EntityTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor, acceptFieldVisitor } from '@contember/schema-utils'\n\nimport { getEnumTypeName } from './utils'\n\nexport class EntityTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `import type { ${getEnumTypeName(enumName)} } from './enums'\\n`\n\t\t}\n\n\t\tcode += `\nexport type JSONPrimitive = string | number | boolean | null\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray\nexport type JSONObject = { readonly [K in string]?: JSONValue }\nexport type JSONArray = readonly JSONValue[]\n\n`\n\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += this.generateTypeEntityCode(model, entity)\n\t\t}\n\t\tcode += '\\n'\n\t\tcode += `export type ContemberClientEntities = {\\n`\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += `\\t${entity.name}: ${entity.name}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\tcode += `export type ContemberClientSchema = {\\n`\n\t\tcode += '\\tentities: ContemberClientEntities\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate generateTypeEntityCode(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = `export type ${entity.name} <OverRelation extends string | never = never> = {\\n`\n\t\tcode += \"\\tname: '\" + entity.name + \"'\\n\"\n\t\tcode += '\\tunique:\\n'\n\t\tcode += this.formatUniqueFields(model, entity)\n\t\tlet columnsCode = ''\n\t\tlet hasOneCode = ''\n\t\tlet hasManyCode = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitHasMany: ctx => {\n\t\t\t\thasManyCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}${\n\t\t\t\t\tctx.targetRelation?.type === Model.RelationType.ManyHasOne ? `<'${ctx.targetRelation.name}'>` : ''\n\t\t\t\t}\\n`\n\t\t\t},\n\t\t\tvisitHasOne: ctx => {\n\t\t\t\thasOneCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}\\n`\n\t\t\t},\n\t\t\tvisitColumn: ctx => {\n\t\t\t\tcolumnsCode += `\\t\\t${ctx.column.name}: ${columnToTsType(ctx.column)}${ctx.column.nullable ? ` | null` : ''}\\n`\n\t\t\t},\n\t\t})\n\n\t\tcode += '\\tcolumns: {\\n'\n\t\tcode += columnsCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasOne: {\\n'\n\t\tcode += hasOneCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasMany: {\\n'\n\t\tcode += hasManyCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasManyBy: {\\n'\n\t\tcode += this.formatReducedFields(model, entity)\n\t\tcode += '\\t}\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate formatReducedFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\tif (!targetRelation) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst uniqueConstraints = getFieldsForUniqueWhere(model, targetEntity)\n\t\t\t\tconst composedUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 2) // todo support all uniques\n\t\t\t\t\t.filter(fields => fields.includes(targetRelation.name))\n\t\t\t\t\t.map(fields => fields.filter(it => it !== targetRelation.name))\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\tconst singleUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 1 && fields[0] !== targetEntity.primary)\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\t\t.filter(it => it !== targetRelation.name)\n\t\t\t\t;[...composedUnique, ...singleUnique].forEach(fieldName => {\n\t\t\t\t\tconst capitalizeFirstLetter = (value: string) => {\n\t\t\t\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1)\n\t\t\t\t\t}\n\t\t\t\t\tconst name = `${relation.name}By${capitalizeFirstLetter(fieldName)}`\n\n\t\t\t\t\tconst targetUnique = targetEntity.fields[fieldName]\n\n\t\t\t\t\tcode += `\\t\\t${name}: { entity: ${targetEntity.name}; by: {${fieldName}: ${uniqueType(model, targetEntity, targetUnique)}} }\\n`\n\t\t\t\t})\n\t\t\t},\n\t\t\tvisitColumn: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: () => {\n\t\t\t},\n\t\t\tvisitManyHasOne: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: () => {\n\t\t\t},\n\t\t})\n\t\treturn code\n\t}\n\n\tprivate formatUniqueFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tconst fields = getFieldsForUniqueWhere(model, entity)\n\t\tlet code = ''\n\t\tfor (const field of fields) {\n\t\t\tcode += '\\t\\t| Omit<{ '\n\t\t\tcode += field.map(it => `${it}: ${uniqueType(model, entity, entity.fields[it])}`).join(', ')\n\t\t\tcode += '}, OverRelation>\\n'\n\t\t}\n\t\treturn code\n\t}\n}\n\nconst uniqueType = (model: Model.Schema, entity: Model.Entity, field: Model.AnyField): string => {\n\treturn acceptFieldVisitor(model, entity, field, {\n\t\tvisitColumn: ctx => {\n\t\t\treturn columnToTsType(ctx.column)\n\t\t},\n\t\tvisitRelation: ctx => {\n\t\t\treturn ctx.targetEntity.name + `['unique']`\n\t\t},\n\t})\n}\n\nconst columnToTsType = (column: Model.AnyColumn): string => {\n\tconst baseType = (() => {\n\t\tswitch (column.type) {\n\t\t\tcase Model.ColumnType.Enum:\n\t\t\t\treturn getEnumTypeName(column.columnType)\n\t\t\tcase Model.ColumnType.String:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Int:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Double:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Bool:\n\t\t\t\treturn 'boolean'\n\t\t\tcase Model.ColumnType.DateTime:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Time:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Date:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Json:\n\t\t\t\treturn 'JSONValue'\n\t\t\tcase Model.ColumnType.Uuid:\n\t\t\t\treturn 'string'\n\t\t\tdefault:\n\t\t\t\t;((_: never) => {\n\t\t\t\t\tthrow new Error(`Unknown type ${_}`)\n\t\t\t\t})(column.type)\n\t\t}\n\t})()\n\treturn column.list ? `readonly ${baseType}[]` : baseType\n}\n\nconst getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Entity): readonly (readonly string[])[] => {\n\tconst relations = Object.values(\n\t\tacceptEveryFieldVisitor<undefined | [string]>(schema, entity, {\n\t\t\tvisitColumn: () => undefined,\n\t\t\tvisitManyHasManyInverse: () => undefined,\n\t\t\tvisitManyHasManyOwning: () => undefined,\n\t\t\tvisitOneHasMany: ({ relation }) => [relation.name],\n\t\t\tvisitManyHasOne: () => undefined,\n\t\t\tvisitOneHasOneInverse: ({ relation }) => [relation.name],\n\t\t\tvisitOneHasOneOwning: ({ relation }) => [relation.name],\n\t\t}),\n\t).filter((it): it is [string] => !!it)\n\n\treturn [[entity.primary], ...Object.values(entity.unique).map(it => it.fields), ...relations]\n}\n"],"names":["getEnumTypeName","acceptEveryFieldVisitor","Model","entity","acceptFieldVisitor","schema"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityTypeSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/EntityTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor, acceptFieldVisitor } from '@contember/schema-utils'\n\nimport { getEnumTypeName } from './utils'\n\nexport class EntityTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `import type { ${getEnumTypeName(enumName)} } from './enums'\\n`\n\t\t}\n\n\t\tcode += `\nexport type JSONPrimitive = string | number | boolean | null\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray\nexport type JSONObject = { readonly [K in string]?: JSONValue }\nexport type JSONArray = readonly JSONValue[]\n\n`\n\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += this.generateTypeEntityCode(model, entity)\n\t\t}\n\t\tcode += '\\n'\n\t\tcode += `export type ContemberClientEntities = {\\n`\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += `\\t${entity.name}: ${entity.name}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\tcode += `export type ContemberClientSchema = {\\n`\n\t\tcode += '\\tentities: ContemberClientEntities\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate generateTypeEntityCode(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = `export type ${entity.name} <OverRelation extends string | never = never> = {\\n`\n\t\tcode += '\\tname: \\'' + entity.name + '\\'\\n'\n\t\tcode += '\\tunique:\\n'\n\t\tcode += this.formatUniqueFields(model, entity)\n\t\tlet columnsCode = ''\n\t\tlet hasOneCode = ''\n\t\tlet hasManyCode = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitHasMany: ctx => {\n\t\t\t\thasManyCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}${ctx.targetRelation?.type === Model.RelationType.ManyHasOne ? `<'${ctx.targetRelation.name}'>` : ''}\\n`\n\t\t\t},\n\t\t\tvisitHasOne: ctx => {\n\t\t\t\thasOneCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}\\n`\n\t\t\t},\n\t\t\tvisitColumn: ctx => {\n\t\t\t\tcolumnsCode += `\\t\\t${ctx.column.name}: ${columnToTsType(ctx.column)}${ctx.column.nullable ? ` | null` : ''}\\n`\n\t\t\t},\n\t\t})\n\n\t\tcode += '\\tcolumns: {\\n'\n\t\tcode += columnsCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasOne: {\\n'\n\t\tcode += hasOneCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasMany: {\\n'\n\t\tcode += hasManyCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasManyBy: {\\n'\n\t\tcode += this.formatReducedFields(model, entity)\n\t\tcode += '\\t}\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate formatReducedFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\tif (!targetRelation) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst uniqueConstraints = getFieldsForUniqueWhere(model, targetEntity)\n\t\t\t\tconst composedUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 2) //todo support all uniques\n\t\t\t\t\t.filter(fields => fields.includes(targetRelation.name))\n\t\t\t\t\t.map(fields => fields.filter(it => it !== targetRelation.name))\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\tconst singleUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 1 && fields[0] !== targetEntity.primary)\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\t\t.filter(it => it !== targetRelation.name)\n\n\t\t\t\t;[...composedUnique, ...singleUnique].forEach(fieldName => {\n\t\t\t\t\tconst capitalizeFirstLetter = (value: string) => {\n\t\t\t\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1)\n\t\t\t\t\t}\n\t\t\t\t\tconst name = `${relation.name}By${capitalizeFirstLetter(fieldName)}`\n\n\t\t\t\t\tconst targetUnique = targetEntity.fields[fieldName]\n\n\t\t\t\t\tcode += `\\t\\t${name}: { entity: ${targetEntity.name}; by: {${fieldName}: ${uniqueType(model, targetEntity, targetUnique)}} }\\n`\n\n\t\t\t\t})\n\t\t\t},\n\t\t\tvisitColumn: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: () => {\n\t\t\t},\n\t\t\tvisitManyHasOne: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: () => {\n\t\t\t},\n\t\t})\n\t\treturn code\n\t}\n\n\tprivate formatUniqueFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tconst fields = getFieldsForUniqueWhere(model, entity)\n\t\tlet code = ''\n\t\tfor (const field of fields) {\n\t\t\tcode += '\\t\\t| Omit<{ '\n\t\t\tcode += field.map(it => `${it}: ${uniqueType(model, entity, entity.fields[it])}`).join(', ')\n\t\t\tcode += '}, OverRelation>\\n'\n\t\t}\n\t\treturn code\n\t}\n}\n\n\nconst uniqueType = (model: Model.Schema, entity: Model.Entity, field: Model.AnyField): string => {\n\treturn acceptFieldVisitor(model, entity, field, {\n\t\tvisitColumn: ctx => {\n\t\t\treturn columnToTsType(ctx.column)\n\t\t},\n\t\tvisitRelation: ctx => {\n\t\t\treturn ctx.targetEntity.name + `['unique']`\n\t\t},\n\t})\n}\n\n\nconst columnToTsType = (column: Model.AnyColumn): string => {\n\tconst baseType = (() => {\n\t\tswitch (column.type) {\n\t\t\tcase Model.ColumnType.Enum:\n\t\t\t\treturn getEnumTypeName(column.columnType)\n\t\t\tcase Model.ColumnType.String:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Int:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Double:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Bool:\n\t\t\t\treturn 'boolean'\n\t\t\tcase Model.ColumnType.DateTime:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Time:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Date:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Json:\n\t\t\t\treturn 'JSONValue'\n\t\t\tcase Model.ColumnType.Uuid:\n\t\t\t\treturn 'string'\n\t\t\tdefault:\n\t\t\t\t((_: never) => {\n\t\t\t\t\tthrow new Error(`Unknown type ${_}`)\n\t\t\t\t})(column.type)\n\t\t}\n\t})()\n\treturn column.list ? `readonly ${baseType}[]` : baseType\n}\n\nconst getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Entity): readonly (readonly string[])[] => {\n\tconst relations = Object.values(\n\t\tacceptEveryFieldVisitor<undefined | [string]>(schema, entity, {\n\t\t\tvisitColumn: () => undefined,\n\t\t\tvisitManyHasManyInverse: () => undefined,\n\t\t\tvisitManyHasManyOwning: () => undefined,\n\t\t\tvisitOneHasMany: ({ relation }) => [relation.name],\n\t\t\tvisitManyHasOne: () => undefined,\n\t\t\tvisitOneHasOneInverse: ({ relation }) => [relation.name],\n\t\t\tvisitOneHasOneOwning: ({ relation }) => [relation.name],\n\t\t}),\n\t).filter((it): it is [string] => !!it)\n\n\treturn [[entity.primary], ...Object.values(entity.unique).map(it => it.fields), ...relations]\n}\n"],"names":["entity"],"mappings":"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"}
1
+ {"version":3,"file":"EntityTypeSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/EntityTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor, acceptFieldVisitor } from '@contember/schema-utils'\n\nimport { getEnumTypeName } from './utils'\n\nexport class EntityTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `import type { ${getEnumTypeName(enumName)} } from './enums'\\n`\n\t\t}\n\n\t\tcode += `\nexport type JSONPrimitive = string | number | boolean | null\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray\nexport type JSONObject = { readonly [K in string]?: JSONValue }\nexport type JSONArray = readonly JSONValue[]\n\n`\n\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += this.generateTypeEntityCode(model, entity)\n\t\t}\n\t\tcode += '\\n'\n\t\tcode += `export type ContemberClientEntities = {\\n`\n\t\tfor (const entity of Object.values(model.entities)) {\n\t\t\tcode += `\\t${entity.name}: ${entity.name}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\tcode += `export type ContemberClientSchema = {\\n`\n\t\tcode += '\\tentities: ContemberClientEntities\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate generateTypeEntityCode(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = `export type ${entity.name} <OverRelation extends string | never = never> = {\\n`\n\t\tcode += \"\\tname: '\" + entity.name + \"'\\n\"\n\t\tcode += '\\tunique:\\n'\n\t\tcode += this.formatUniqueFields(model, entity)\n\t\tlet columnsCode = ''\n\t\tlet hasOneCode = ''\n\t\tlet hasManyCode = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitHasMany: ctx => {\n\t\t\t\thasManyCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}${\n\t\t\t\t\tctx.targetRelation?.type === Model.RelationType.ManyHasOne ? `<'${ctx.targetRelation.name}'>` : ''\n\t\t\t\t}\\n`\n\t\t\t},\n\t\t\tvisitHasOne: ctx => {\n\t\t\t\thasOneCode += `\\t\\t${ctx.relation.name}: ${ctx.targetEntity.name}\\n`\n\t\t\t},\n\t\t\tvisitColumn: ctx => {\n\t\t\t\tcolumnsCode += `\\t\\t${ctx.column.name}: ${columnToTsType(ctx.column)}${ctx.column.nullable ? ` | null` : ''}\\n`\n\t\t\t},\n\t\t})\n\n\t\tcode += '\\tcolumns: {\\n'\n\t\tcode += columnsCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasOne: {\\n'\n\t\tcode += hasOneCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasMany: {\\n'\n\t\tcode += hasManyCode\n\t\tcode += '\\t}\\n'\n\t\tcode += '\\thasManyBy: {\\n'\n\t\tcode += this.formatReducedFields(model, entity)\n\t\tcode += '\\t}\\n'\n\t\tcode += '}\\n'\n\t\treturn code\n\t}\n\n\tprivate formatReducedFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tlet code = ''\n\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\tif (!targetRelation) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst uniqueConstraints = getFieldsForUniqueWhere(model, targetEntity)\n\t\t\t\tconst composedUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 2) // todo support all uniques\n\t\t\t\t\t.filter(fields => fields.includes(targetRelation.name))\n\t\t\t\t\t.map(fields => fields.filter(it => it !== targetRelation.name))\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\tconst singleUnique = uniqueConstraints\n\t\t\t\t\t.filter(fields => fields.length === 1 && fields[0] !== targetEntity.primary)\n\t\t\t\t\t.map(fields => fields[0])\n\t\t\t\t\t.filter(it => it !== targetRelation.name)\n\t\t\t\t;[...composedUnique, ...singleUnique].forEach(fieldName => {\n\t\t\t\t\tconst capitalizeFirstLetter = (value: string) => {\n\t\t\t\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1)\n\t\t\t\t\t}\n\t\t\t\t\tconst name = `${relation.name}By${capitalizeFirstLetter(fieldName)}`\n\n\t\t\t\t\tconst targetUnique = targetEntity.fields[fieldName]\n\n\t\t\t\t\tcode += `\\t\\t${name}: { entity: ${targetEntity.name}; by: {${fieldName}: ${uniqueType(model, targetEntity, targetUnique)}} }\\n`\n\t\t\t\t})\n\t\t\t},\n\t\t\tvisitColumn: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: () => {\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: () => {\n\t\t\t},\n\t\t\tvisitManyHasOne: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: () => {\n\t\t\t},\n\t\t})\n\t\treturn code\n\t}\n\n\tprivate formatUniqueFields(model: Model.Schema, entity: Model.Entity): string {\n\t\tconst fields = getFieldsForUniqueWhere(model, entity)\n\t\tlet code = ''\n\t\tfor (const field of fields) {\n\t\t\tcode += '\\t\\t| Omit<{ '\n\t\t\tcode += field.map(it => `${it}: ${uniqueType(model, entity, entity.fields[it])}`).join(', ')\n\t\t\tcode += '}, OverRelation>\\n'\n\t\t}\n\t\treturn code\n\t}\n}\n\nconst uniqueType = (model: Model.Schema, entity: Model.Entity, field: Model.AnyField): string => {\n\treturn acceptFieldVisitor(model, entity, field, {\n\t\tvisitColumn: ctx => {\n\t\t\treturn columnToTsType(ctx.column)\n\t\t},\n\t\tvisitRelation: ctx => {\n\t\t\treturn ctx.targetEntity.name + `['unique']`\n\t\t},\n\t})\n}\n\nconst columnToTsType = (column: Model.AnyColumn): string => {\n\tconst baseType = (() => {\n\t\tswitch (column.type) {\n\t\t\tcase Model.ColumnType.Enum:\n\t\t\t\treturn getEnumTypeName(column.columnType)\n\t\t\tcase Model.ColumnType.String:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Int:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Double:\n\t\t\t\treturn 'number'\n\t\t\tcase Model.ColumnType.Bool:\n\t\t\t\treturn 'boolean'\n\t\t\tcase Model.ColumnType.DateTime:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Time:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Date:\n\t\t\t\treturn 'string'\n\t\t\tcase Model.ColumnType.Json:\n\t\t\t\treturn 'JSONValue'\n\t\t\tcase Model.ColumnType.Uuid:\n\t\t\t\treturn 'string'\n\t\t\tdefault:\n\t\t\t\t;((_: never) => {\n\t\t\t\t\tthrow new Error(`Unknown type ${_}`)\n\t\t\t\t})(column.type)\n\t\t}\n\t})()\n\treturn column.list ? `readonly ${baseType}[]` : baseType\n}\n\nconst getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Entity): readonly (readonly string[])[] => {\n\tconst relations = Object.values(\n\t\tacceptEveryFieldVisitor<undefined | [string]>(schema, entity, {\n\t\t\tvisitColumn: () => undefined,\n\t\t\tvisitManyHasManyInverse: () => undefined,\n\t\t\tvisitManyHasManyOwning: () => undefined,\n\t\t\tvisitOneHasMany: ({ relation }) => [relation.name],\n\t\t\tvisitManyHasOne: () => undefined,\n\t\t\tvisitOneHasOneInverse: ({ relation }) => [relation.name],\n\t\t\tvisitOneHasOneOwning: ({ relation }) => [relation.name],\n\t\t}),\n\t).filter((it): it is [string] => !!it)\n\n\treturn [[entity.primary], ...Object.values(entity.unique).map(it => it.fields), ...relations]\n}\n"],"names":["entity"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EnumTypeSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/EnumTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { getEnumTypeName } from './utils'\n\nexport class EnumTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const [enumName, values] of Object.entries(model.enums)) {\n\t\t\tcode += `export type ${getEnumTypeName(enumName)} = ${values.map(it => '\\n\\t | ' + JSON.stringify(it)).join('')}\\n`\n\t\t}\n\t\tcode += `export type ContemberClientEnums = {\\n`\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `\\t${enumName}: ${getEnumTypeName(enumName)}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\treturn code\n\t}\n}\n"],"names":["getEnumTypeName"],"mappings":";;;AAGO,MAAM,wBAAwB;AAAA,EACpC,SAAS,OAA6B;AACrC,QAAI,OAAO;AACA,eAAA,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AAC7D,cAAQ,eAAeA,MAAgB,gBAAA,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAA,OAAM,WAAY,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,IAAA;AAExG,YAAA;AAAA;AACR,eAAW,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG;AAChD,cAAQ,IAAK,QAAQ,KAAKA,MAAAA,gBAAgB,QAAQ,CAAC;AAAA;AAAA,IAAA;AAE5C,YAAA;AACD,WAAA;AAAA,EAAA;AAET;;"}
1
+ {"version":3,"file":"EnumTypeSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/EnumTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { getEnumTypeName } from './utils'\n\nexport class EnumTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const [enumName, values] of Object.entries(model.enums)) {\n\t\t\tcode += `export type ${getEnumTypeName(enumName)} = ${values.map(it => '\\n\\t | ' + JSON.stringify(it)).join('')}\\n`\n\t\t}\n\t\tcode += `export type ContemberClientEnums = {\\n`\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `\\t${enumName}: ${getEnumTypeName(enumName)}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\treturn code\n\t}\n}\n"],"names":["getEnumTypeName"],"mappings":";;;AAGO,MAAM,wBAAwB;AAAA,EACpC,SAAS,OAA6B;AACrC,QAAI,OAAO;AACX,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AAC7D,cAAQ,eAAeA,MAAAA,gBAAgB,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAA,OAAM,WAAY,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,IAChH;AACA,YAAQ;AAAA;AACR,eAAW,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG;AAChD,cAAQ,IAAK,QAAQ,KAAKA,MAAAA,gBAAgB,QAAQ,CAAC;AAAA;AAAA,IACpD;AACA,YAAQ;AACR,WAAO;AAAA,EACR;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"EnumTypeSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/EnumTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { getEnumTypeName } from './utils'\n\nexport class EnumTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const [enumName, values] of Object.entries(model.enums)) {\n\t\t\tcode += `export type ${getEnumTypeName(enumName)} = ${values.map(it => '\\n\\t | ' + JSON.stringify(it)).join('')}\\n`\n\t\t}\n\t\tcode += `export type ContemberClientEnums = {\\n`\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `\\t${enumName}: ${getEnumTypeName(enumName)}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\treturn code\n\t}\n}\n"],"names":[],"mappings":";AAGO,MAAM,wBAAwB;AAAA,EACpC,SAAS,OAA6B;AACrC,QAAI,OAAO;AACA,eAAA,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AAC7D,cAAQ,eAAe,gBAAgB,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAA,OAAM,WAAY,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,IAAA;AAExG,YAAA;AAAA;AACR,eAAW,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG;AAChD,cAAQ,IAAK,QAAQ,KAAK,gBAAgB,QAAQ,CAAC;AAAA;AAAA,IAAA;AAE5C,YAAA;AACD,WAAA;AAAA,EAAA;AAET;"}
1
+ {"version":3,"file":"EnumTypeSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/EnumTypeSchemaGenerator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { getEnumTypeName } from './utils'\n\nexport class EnumTypeSchemaGenerator {\n\tgenerate(model: Model.Schema): string {\n\t\tlet code = ''\n\t\tfor (const [enumName, values] of Object.entries(model.enums)) {\n\t\t\tcode += `export type ${getEnumTypeName(enumName)} = ${values.map(it => '\\n\\t | ' + JSON.stringify(it)).join('')}\\n`\n\t\t}\n\t\tcode += `export type ContemberClientEnums = {\\n`\n\t\tfor (const enumName of Object.keys(model.enums)) {\n\t\t\tcode += `\\t${enumName}: ${getEnumTypeName(enumName)}\\n`\n\t\t}\n\t\tcode += '}\\n\\n'\n\t\treturn code\n\t}\n}\n"],"names":[],"mappings":";AAGO,MAAM,wBAAwB;AAAA,EACpC,SAAS,OAA6B;AACrC,QAAI,OAAO;AACX,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AAC7D,cAAQ,eAAe,gBAAgB,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAA,OAAM,WAAY,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,IAChH;AACA,YAAQ;AAAA;AACR,eAAW,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG;AAChD,cAAQ,IAAK,QAAQ,KAAK,gBAAgB,QAAQ,CAAC;AAAA;AAAA,IACpD;AACA,YAAQ;AACR,WAAO;AAAA,EACR;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"NameSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/NameSchemaGenerator.ts"],"sourcesContent":["import { SchemaNames, SchemaEntityNames } from '@contember/client-content'\nimport { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor } from '@contember/schema-utils'\n\nexport class NameSchemaGenerator {\n\tgenerate(model: Model.Schema): SchemaNames {\n\t\treturn {\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.values(model.entities).map(entity => {\n\t\t\t\t\tconst fields: Record<string, SchemaEntityNames<any>['fields'][string]> = {}\n\t\t\t\t\tconst scalars: string[] = []\n\n\t\t\t\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\t\t\t\tvisitHasOne: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'one',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitHasMany: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'many',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitColumn: ctx => {\n\t\t\t\t\t\t\tscalars.push(ctx.column.name)\n\t\t\t\t\t\t\tfields[ctx.column.name] = {\n\t\t\t\t\t\t\t\ttype: 'column',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\treturn [entity.name, { name: entity.name, fields, scalars }]\n\t\t\t\t}),\n\t\t\t),\n\t\t\tenums: Object.fromEntries(\n\t\t\t\tObject.entries(model.enums).map(([name, enumType]) => [name, enumType]),\n\t\t\t),\n\t\t}\n\t}\n}\n\n\n"],"names":["acceptEveryFieldVisitor"],"mappings":";;;AAIO,MAAM,oBAAoB;AAAA,EAChC,SAAS,OAAkC;AACnC,WAAA;AAAA,MACN,UAAU,OAAO;AAAA,QAChB,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAU,WAAA;AAC3C,gBAAM,SAAmE,CAAC;AAC1E,gBAAM,UAAoB,CAAC;AAE3BA,sBAAA,wBAAwB,OAAO,QAAQ;AAAA,YACtC,aAAa,CAAO,QAAA;AACZ,qBAAA,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAC1B;AAAA,YACD;AAAA,YACA,cAAc,CAAO,QAAA;AACb,qBAAA,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAC1B;AAAA,YACD;AAAA,YACA,aAAa,CAAO,QAAA;AACX,sBAAA,KAAK,IAAI,OAAO,IAAI;AACrB,qBAAA,IAAI,OAAO,IAAI,IAAI;AAAA,gBACzB,MAAM;AAAA,cACP;AAAA,YAAA;AAAA,UACD,CACA;AAEM,iBAAA,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS;AAAA,QAC3D,CAAA;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAA;AAAA,IAExE;AAAA,EAAA;AAEF;;"}
1
+ {"version":3,"file":"NameSchemaGenerator.cjs","sources":["../../../../packages/client-content-generator/src/NameSchemaGenerator.ts"],"sourcesContent":["import { SchemaEntityNames, SchemaNames } from '@contember/client-content'\nimport { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor } from '@contember/schema-utils'\n\nexport class NameSchemaGenerator {\n\tgenerate(model: Model.Schema): SchemaNames {\n\t\treturn {\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.values(model.entities).map(entity => {\n\t\t\t\t\tconst fields: Record<string, SchemaEntityNames<any>['fields'][string]> = {}\n\t\t\t\t\tconst scalars: string[] = []\n\n\t\t\t\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\t\t\t\tvisitHasOne: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'one',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitHasMany: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'many',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitColumn: ctx => {\n\t\t\t\t\t\t\tscalars.push(ctx.column.name)\n\t\t\t\t\t\t\tfields[ctx.column.name] = {\n\t\t\t\t\t\t\t\ttype: 'column',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\treturn [entity.name, { name: entity.name, fields, scalars }]\n\t\t\t\t}),\n\t\t\t),\n\t\t\tenums: Object.fromEntries(\n\t\t\t\tObject.entries(model.enums).map(([name, enumType]) => [name, enumType]),\n\t\t\t),\n\t\t}\n\t}\n}\n"],"names":["acceptEveryFieldVisitor"],"mappings":";;;AAIO,MAAM,oBAAoB;AAAA,EAChC,SAAS,OAAkC;AAC1C,WAAO;AAAA,MACN,UAAU,OAAO;AAAA,QAChB,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,WAAU;AAC3C,gBAAM,SAAmE,CAAA;AACzE,gBAAM,UAAoB,CAAA;AAE1BA,sBAAAA,wBAAwB,OAAO,QAAQ;AAAA,YACtC,aAAa,CAAA,QAAO;AACnB,qBAAO,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAAA;AAAA,YAE3B;AAAA,YACA,cAAc,CAAA,QAAO;AACpB,qBAAO,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAAA;AAAA,YAE3B;AAAA,YACA,aAAa,CAAA,QAAO;AACnB,sBAAQ,KAAK,IAAI,OAAO,IAAI;AAC5B,qBAAO,IAAI,OAAO,IAAI,IAAI;AAAA,gBACzB,MAAM;AAAA,cAAA;AAAA,YAER;AAAA,UAAA,CACA;AAED,iBAAO,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS;AAAA,QAC5D,CAAC;AAAA,MAAA;AAAA,MAEF,OAAO,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAA;AAAA,IACvE;AAAA,EAEF;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"NameSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/NameSchemaGenerator.ts"],"sourcesContent":["import { SchemaNames, SchemaEntityNames } from '@contember/client-content'\nimport { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor } from '@contember/schema-utils'\n\nexport class NameSchemaGenerator {\n\tgenerate(model: Model.Schema): SchemaNames {\n\t\treturn {\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.values(model.entities).map(entity => {\n\t\t\t\t\tconst fields: Record<string, SchemaEntityNames<any>['fields'][string]> = {}\n\t\t\t\t\tconst scalars: string[] = []\n\n\t\t\t\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\t\t\t\tvisitHasOne: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'one',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitHasMany: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'many',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitColumn: ctx => {\n\t\t\t\t\t\t\tscalars.push(ctx.column.name)\n\t\t\t\t\t\t\tfields[ctx.column.name] = {\n\t\t\t\t\t\t\t\ttype: 'column',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\treturn [entity.name, { name: entity.name, fields, scalars }]\n\t\t\t\t}),\n\t\t\t),\n\t\t\tenums: Object.fromEntries(\n\t\t\t\tObject.entries(model.enums).map(([name, enumType]) => [name, enumType]),\n\t\t\t),\n\t\t}\n\t}\n}\n\n\n"],"names":[],"mappings":";AAIO,MAAM,oBAAoB;AAAA,EAChC,SAAS,OAAkC;AACnC,WAAA;AAAA,MACN,UAAU,OAAO;AAAA,QAChB,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAU,WAAA;AAC3C,gBAAM,SAAmE,CAAC;AAC1E,gBAAM,UAAoB,CAAC;AAE3B,kCAAwB,OAAO,QAAQ;AAAA,YACtC,aAAa,CAAO,QAAA;AACZ,qBAAA,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAC1B;AAAA,YACD;AAAA,YACA,cAAc,CAAO,QAAA;AACb,qBAAA,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAC1B;AAAA,YACD;AAAA,YACA,aAAa,CAAO,QAAA;AACX,sBAAA,KAAK,IAAI,OAAO,IAAI;AACrB,qBAAA,IAAI,OAAO,IAAI,IAAI;AAAA,gBACzB,MAAM;AAAA,cACP;AAAA,YAAA;AAAA,UACD,CACA;AAEM,iBAAA,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS;AAAA,QAC3D,CAAA;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAA;AAAA,IAExE;AAAA,EAAA;AAEF;"}
1
+ {"version":3,"file":"NameSchemaGenerator.js","sources":["../../../../packages/client-content-generator/src/NameSchemaGenerator.ts"],"sourcesContent":["import { SchemaEntityNames, SchemaNames } from '@contember/client-content'\nimport { Model } from '@contember/schema'\nimport { acceptEveryFieldVisitor } from '@contember/schema-utils'\n\nexport class NameSchemaGenerator {\n\tgenerate(model: Model.Schema): SchemaNames {\n\t\treturn {\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.values(model.entities).map(entity => {\n\t\t\t\t\tconst fields: Record<string, SchemaEntityNames<any>['fields'][string]> = {}\n\t\t\t\t\tconst scalars: string[] = []\n\n\t\t\t\t\tacceptEveryFieldVisitor(model, entity, {\n\t\t\t\t\t\tvisitHasOne: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'one',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitHasMany: ctx => {\n\t\t\t\t\t\t\tfields[ctx.relation.name] = {\n\t\t\t\t\t\t\t\ttype: 'many',\n\t\t\t\t\t\t\t\tentity: ctx.targetEntity.name,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvisitColumn: ctx => {\n\t\t\t\t\t\t\tscalars.push(ctx.column.name)\n\t\t\t\t\t\t\tfields[ctx.column.name] = {\n\t\t\t\t\t\t\t\ttype: 'column',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\treturn [entity.name, { name: entity.name, fields, scalars }]\n\t\t\t\t}),\n\t\t\t),\n\t\t\tenums: Object.fromEntries(\n\t\t\t\tObject.entries(model.enums).map(([name, enumType]) => [name, enumType]),\n\t\t\t),\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,oBAAoB;AAAA,EAChC,SAAS,OAAkC;AAC1C,WAAO;AAAA,MACN,UAAU,OAAO;AAAA,QAChB,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,WAAU;AAC3C,gBAAM,SAAmE,CAAA;AACzE,gBAAM,UAAoB,CAAA;AAE1B,kCAAwB,OAAO,QAAQ;AAAA,YACtC,aAAa,CAAA,QAAO;AACnB,qBAAO,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAAA;AAAA,YAE3B;AAAA,YACA,cAAc,CAAA,QAAO;AACpB,qBAAO,IAAI,SAAS,IAAI,IAAI;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ,IAAI,aAAa;AAAA,cAAA;AAAA,YAE3B;AAAA,YACA,aAAa,CAAA,QAAO;AACnB,sBAAQ,KAAK,IAAI,OAAO,IAAI;AAC5B,qBAAO,IAAI,OAAO,IAAI,IAAI;AAAA,gBACzB,MAAM;AAAA,cAAA;AAAA,YAER;AAAA,UAAA,CACA;AAED,iBAAO,CAAC,OAAO,MAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS;AAAA,QAC5D,CAAC;AAAA,MAAA;AAAA,MAEF,OAAO,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAA;AAAA,IACvE;AAAA,EAEF;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ContemberClientGenerator.d.ts","sourceRoot":"","sources":["../../src/ContemberClientGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAG3D,qBAAa,wBAAwB;IAEnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;gBAFzB,mBAAmB,GAAE,mBAA+C,EACpE,uBAAuB,GAAE,uBAAuD,EAChF,yBAAyB,GAAE,yBAA2D;IAIxG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAiCrD"}
1
+ {"version":3,"file":"ContemberClientGenerator.d.ts","sourceRoot":"","sources":["../../src/ContemberClientGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,qBAAa,wBAAwB;IAEnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;gBAFzB,mBAAmB,GAAE,mBAA+C,EACpE,uBAAuB,GAAE,uBAAuD,EAChF,yBAAyB,GAAE,yBAA2D;IAIxG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CA0CrD"}