@contember/schema-utils 2.0.2 → 2.1.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs +0 -1
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +1 -2
- package/dist/development/src/dataUtils.cjs +9 -9
- package/dist/development/src/dataUtils.cjs.map +1 -1
- package/dist/development/src/dataUtils.js +10 -10
- package/dist/development/src/dataUtils.js.map +1 -1
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs +1 -0
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.js +1 -0
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
- package/dist/development/src/model/modelUtils.cjs +1 -1
- package/dist/development/src/model/modelUtils.cjs.map +1 -1
- package/dist/development/src/model/modelUtils.js +1 -1
- package/dist/development/src/model/modelUtils.js.map +1 -1
- package/dist/development/src/model/resolveDefaultColumnType.cjs +2 -0
- package/dist/development/src/model/resolveDefaultColumnType.cjs.map +1 -1
- package/dist/development/src/model/resolveDefaultColumnType.js +2 -0
- package/dist/development/src/model/resolveDefaultColumnType.js.map +1 -1
- package/dist/development/src/schemaNormalizer.cjs +2 -0
- package/dist/development/src/schemaNormalizer.cjs.map +1 -1
- package/dist/development/src/schemaNormalizer.js +2 -0
- package/dist/development/src/schemaNormalizer.js.map +1 -1
- package/dist/development/src/type-schema/acl.cjs +3 -1
- package/dist/development/src/type-schema/acl.cjs.map +1 -1
- package/dist/development/src/type-schema/acl.js +3 -1
- package/dist/development/src/type-schema/acl.js.map +1 -1
- package/dist/development/src/type-schema/condition.cjs +2 -0
- package/dist/development/src/type-schema/condition.cjs.map +1 -1
- package/dist/development/src/type-schema/condition.js +2 -0
- package/dist/development/src/type-schema/condition.js.map +1 -1
- package/dist/development/src/type-schema/model.cjs +25 -8
- package/dist/development/src/type-schema/model.cjs.map +1 -1
- package/dist/development/src/type-schema/model.js +25 -8
- package/dist/development/src/type-schema/model.js.map +1 -1
- package/dist/development/src/type-schema/settings.cjs +2 -1
- package/dist/development/src/type-schema/settings.cjs.map +1 -1
- package/dist/development/src/type-schema/settings.js +2 -1
- package/dist/development/src/type-schema/settings.js.map +1 -1
- package/dist/development/src/validation/ModelValidator.cjs +10 -10
- package/dist/development/src/validation/ModelValidator.cjs.map +1 -1
- package/dist/development/src/validation/ModelValidator.js +11 -11
- package/dist/development/src/validation/ModelValidator.js.map +1 -1
- package/dist/development/src/validation/errors.cjs.map +1 -1
- package/dist/development/src/validation/errors.js.map +1 -1
- package/dist/production/index.cjs +0 -1
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +1 -2
- package/dist/production/src/dataUtils.cjs +9 -9
- package/dist/production/src/dataUtils.cjs.map +1 -1
- package/dist/production/src/dataUtils.js +10 -10
- package/dist/production/src/dataUtils.js.map +1 -1
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs +1 -0
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.js +1 -0
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
- package/dist/production/src/model/modelUtils.cjs +1 -1
- package/dist/production/src/model/modelUtils.cjs.map +1 -1
- package/dist/production/src/model/modelUtils.js +1 -1
- package/dist/production/src/model/modelUtils.js.map +1 -1
- package/dist/production/src/model/resolveDefaultColumnType.cjs +2 -0
- package/dist/production/src/model/resolveDefaultColumnType.cjs.map +1 -1
- package/dist/production/src/model/resolveDefaultColumnType.js +2 -0
- package/dist/production/src/model/resolveDefaultColumnType.js.map +1 -1
- package/dist/production/src/schemaNormalizer.cjs +2 -0
- package/dist/production/src/schemaNormalizer.cjs.map +1 -1
- package/dist/production/src/schemaNormalizer.js +2 -0
- package/dist/production/src/schemaNormalizer.js.map +1 -1
- package/dist/production/src/type-schema/acl.cjs +3 -1
- package/dist/production/src/type-schema/acl.cjs.map +1 -1
- package/dist/production/src/type-schema/acl.js +3 -1
- package/dist/production/src/type-schema/acl.js.map +1 -1
- package/dist/production/src/type-schema/condition.cjs +2 -0
- package/dist/production/src/type-schema/condition.cjs.map +1 -1
- package/dist/production/src/type-schema/condition.js +2 -0
- package/dist/production/src/type-schema/condition.js.map +1 -1
- package/dist/production/src/type-schema/model.cjs +25 -8
- package/dist/production/src/type-schema/model.cjs.map +1 -1
- package/dist/production/src/type-schema/model.js +25 -8
- package/dist/production/src/type-schema/model.js.map +1 -1
- package/dist/production/src/type-schema/settings.cjs +2 -1
- package/dist/production/src/type-schema/settings.cjs.map +1 -1
- package/dist/production/src/type-schema/settings.js +2 -1
- package/dist/production/src/type-schema/settings.js.map +1 -1
- package/dist/production/src/validation/ModelValidator.cjs +10 -10
- package/dist/production/src/validation/ModelValidator.cjs.map +1 -1
- package/dist/production/src/validation/ModelValidator.js +11 -11
- package/dist/production/src/validation/ModelValidator.js.map +1 -1
- package/dist/production/src/validation/errors.cjs.map +1 -1
- package/dist/production/src/validation/errors.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/acl/schemaUtils.d.ts.map +1 -1
- package/dist/types/dataUtils.d.ts +7 -4
- package/dist/types/dataUtils.d.ts.map +1 -1
- package/dist/types/model/modelUtils.d.ts.map +1 -1
- package/dist/types/model/resolveDefaultColumnType.d.ts.map +1 -1
- package/dist/types/schemaChecksum.d.ts.map +1 -1
- package/dist/types/schemaFilter.d.ts.map +1 -1
- package/dist/types/schemaNormalizer.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/type-schema/acl.d.ts.map +1 -1
- package/dist/types/type-schema/condition.d.ts.map +1 -1
- package/dist/types/type-schema/model.d.ts +1 -1
- package/dist/types/type-schema/model.d.ts.map +1 -1
- package/dist/types/type-schema/settings.d.ts +3 -0
- package/dist/types/type-schema/settings.d.ts.map +1 -1
- package/dist/types/type-schema/where.d.ts.map +1 -1
- package/dist/types/utils/deepCompare.d.ts.map +1 -1
- package/dist/types/utils/isIt.d.ts.map +1 -1
- package/dist/types/utils/printJsValue.d.ts.map +1 -1
- package/dist/types/validation/ModelValidator.d.ts.map +1 -1
- package/dist/types/validation/errors.d.ts +1 -1
- package/dist/types/validation/errors.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/dataUtils.ts +12 -9
- package/src/definition-generator/DefinitionCodeGenerator.ts +2 -1
- package/src/model/modelUtils.ts +1 -1
- package/src/model/resolveDefaultColumnType.ts +2 -0
- package/src/schemaNormalizer.ts +2 -0
- package/src/type-schema/acl.ts +2 -0
- package/src/type-schema/condition.ts +1 -0
- package/src/type-schema/model.ts +25 -6
- package/src/type-schema/settings.ts +1 -0
- package/src/validation/ModelValidator.ts +11 -11
- package/src/validation/errors.ts +2 -0
- package/tests/cases/unit/modelValidator.test.ts +19 -0
|
@@ -91,7 +91,6 @@ exports.getRoleVariables = schemaUtils.getRoleVariables;
|
|
|
91
91
|
exports.NoDataError = dataUtils.NoDataError;
|
|
92
92
|
exports.resolveColumnValue = dataUtils.resolveColumnValue;
|
|
93
93
|
exports.resolveDefaultValue = dataUtils.resolveDefaultValue;
|
|
94
|
-
exports.resolvePrimaryGenerator = dataUtils.resolvePrimaryGenerator;
|
|
95
94
|
exports.AclValidator = AclValidator.AclValidator;
|
|
96
95
|
exports.ModelValidator = ModelValidator.ModelValidator;
|
|
97
96
|
exports.ValidationValidator = ValidationValidator.ValidationValidator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../packages/schema-utils/src/index.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { emptyModelSchema } from './model'\nimport * as Typesafe from '@contember/typesafe'\nimport { aclSchema, modelSchema, validationSchema, settingsSchema } from './type-schema'\nimport { actionsSchema } from './type-schema/actions'\n\nexport * from './definition-generator'\nexport * from './lax'\nexport * from './model'\nexport * from './acl'\nexport * from './dataUtils'\nexport * from './validation'\nexport * from './schemaNormalizer'\nexport * from './schemaFilter'\nexport * from './schemaChecksum'\nexport { deepCompare, compareArraysIgnoreOrder } from './utils'\n\nexport const emptySchema: Schema = {\n\tmodel: emptyModelSchema,\n\tacl: { roles: {} },\n\tvalidation: {},\n\tactions: { triggers: {}, targets: {} },\n\tsettings: {},\n}\n\nexport const schemaType: Typesafe.Type<Schema> = Typesafe.object({\n\tmodel: modelSchema,\n\tacl: aclSchema,\n\tvalidation: validationSchema,\n\tactions: Typesafe.coalesce(actionsSchema, { triggers: {}, targets: {} }),\n\tsettings: Typesafe.coalesce(settingsSchema, {}),\n})\n"],"names":["emptyModelSchema","Typesafe","modelSchema","aclSchema","validationSchema","actionsSchema","settingsSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,MAAM,cAAsB;AAAA,EAClC,OAAOA,WAAA;AAAA,EACP,KAAK,EAAE,OAAO,GAAG;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,SAAS,EAAE,UAAU,IAAI,SAAS,CAAA,EAAG;AAAA,EACrC,UAAU,CAAA;AACX;AAEa,MAAA,aAAoCC,oBAAS,OAAO;AAAA,EAChE,OAAOC,MAAA;AAAA,EACP,KAAKC,IAAA;AAAA,EACL,YAAYC,WAAA;AAAA,EACZ,SAASH,oBAAS,SAASI,QAAe,eAAA,EAAE,UAAU,CAAI,GAAA,SAAS,CAAA,GAAI;AAAA,EACvE,UAAUJ,oBAAS,SAASK,SAAAA,gBAAgB,CAAE,CAAA;AAC/C,CAAC
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../packages/schema-utils/src/index.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { emptyModelSchema } from './model'\nimport * as Typesafe from '@contember/typesafe'\nimport { aclSchema, modelSchema, validationSchema, settingsSchema } from './type-schema'\nimport { actionsSchema } from './type-schema/actions'\n\nexport * from './definition-generator'\nexport * from './lax'\nexport * from './model'\nexport * from './acl'\nexport * from './dataUtils'\nexport * from './validation'\nexport * from './schemaNormalizer'\nexport * from './schemaFilter'\nexport * from './schemaChecksum'\nexport { deepCompare, compareArraysIgnoreOrder } from './utils'\n\nexport const emptySchema: Schema = {\n\tmodel: emptyModelSchema,\n\tacl: { roles: {} },\n\tvalidation: {},\n\tactions: { triggers: {}, targets: {} },\n\tsettings: {},\n}\n\nexport const schemaType: Typesafe.Type<Schema> = Typesafe.object({\n\tmodel: modelSchema,\n\tacl: aclSchema,\n\tvalidation: validationSchema,\n\tactions: Typesafe.coalesce(actionsSchema, { triggers: {}, targets: {} }),\n\tsettings: Typesafe.coalesce(settingsSchema, {}),\n})\n"],"names":["emptyModelSchema","Typesafe","modelSchema","aclSchema","validationSchema","actionsSchema","settingsSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,MAAM,cAAsB;AAAA,EAClC,OAAOA,WAAA;AAAA,EACP,KAAK,EAAE,OAAO,GAAG;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,SAAS,EAAE,UAAU,IAAI,SAAS,CAAA,EAAG;AAAA,EACrC,UAAU,CAAA;AACX;AAEa,MAAA,aAAoCC,oBAAS,OAAO;AAAA,EAChE,OAAOC,MAAA;AAAA,EACP,KAAKC,IAAA;AAAA,EACL,YAAYC,WAAA;AAAA,EACZ,SAASH,oBAAS,SAASI,QAAe,eAAA,EAAE,UAAU,CAAI,GAAA,SAAS,CAAA,GAAI;AAAA,EACvE,UAAUJ,oBAAS,SAASK,SAAAA,gBAAgB,CAAE,CAAA;AAC/C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -18,7 +18,7 @@ import { LaxSchemaConverter } from "./src/lax/LaxSchemaConverter.js";
|
|
|
18
18
|
import { AllowAllPermissionFactory } from "./src/acl/AllowAllPermissionFactory.js";
|
|
19
19
|
import { PredicateDefinitionProcessor } from "./src/acl/PredicateDefinitionProcessor.js";
|
|
20
20
|
import { getRoleVariables } from "./src/acl/schemaUtils.js";
|
|
21
|
-
import { NoDataError, resolveColumnValue, resolveDefaultValue
|
|
21
|
+
import { NoDataError, resolveColumnValue, resolveDefaultValue } from "./src/dataUtils.js";
|
|
22
22
|
import { AclValidator } from "./src/validation/AclValidator.js";
|
|
23
23
|
import { ModelValidator } from "./src/validation/ModelValidator.js";
|
|
24
24
|
import { ValidationValidator } from "./src/validation/ValidationValidator.js";
|
|
@@ -88,7 +88,6 @@ export {
|
|
|
88
88
|
resolveColumnValue,
|
|
89
89
|
resolveDefaultColumnType,
|
|
90
90
|
resolveDefaultValue,
|
|
91
|
-
resolvePrimaryGenerator,
|
|
92
91
|
schemaType,
|
|
93
92
|
tryGetColumnName
|
|
94
93
|
};
|
|
@@ -19,9 +19,13 @@ const resolveDefaultValue = (column, providers) => {
|
|
|
19
19
|
break;
|
|
20
20
|
case schema.Model.ColumnType.DateTime:
|
|
21
21
|
case schema.Model.ColumnType.Date:
|
|
22
|
+
case schema.Model.ColumnType.Time:
|
|
22
23
|
if (column.default === "now") {
|
|
23
24
|
return providers.now().toISOString();
|
|
24
25
|
}
|
|
26
|
+
if (typeof column.default !== "undefined") {
|
|
27
|
+
return column.default;
|
|
28
|
+
}
|
|
25
29
|
break;
|
|
26
30
|
case schema.Model.ColumnType.Uuid:
|
|
27
31
|
break;
|
|
@@ -31,22 +35,19 @@ const resolveDefaultValue = (column, providers) => {
|
|
|
31
35
|
}
|
|
32
36
|
throw new NoDataError(`No data for column ${column.name}`);
|
|
33
37
|
};
|
|
34
|
-
const resolvePrimaryGenerator = (column, providers) => {
|
|
35
|
-
if (column.type === schema.Model.ColumnType.Uuid) {
|
|
36
|
-
return providers.uuid;
|
|
37
|
-
}
|
|
38
|
-
return () => void 0;
|
|
39
|
-
};
|
|
40
38
|
const resolveColumnValue = ({
|
|
41
39
|
entity,
|
|
42
40
|
column,
|
|
43
41
|
input
|
|
44
|
-
}, providers) => {
|
|
42
|
+
}, providers, options) => {
|
|
45
43
|
if (input !== void 0) {
|
|
46
44
|
return input;
|
|
47
45
|
}
|
|
48
46
|
if (entity.primary === column.name) {
|
|
49
|
-
|
|
47
|
+
if (column.type === schema.Model.ColumnType.Uuid) {
|
|
48
|
+
return providers.uuid({ version: options.uuidVersion });
|
|
49
|
+
}
|
|
50
|
+
return void 0;
|
|
50
51
|
}
|
|
51
52
|
return resolveDefaultValue(column, providers);
|
|
52
53
|
};
|
|
@@ -55,5 +56,4 @@ class NoDataError extends Error {
|
|
|
55
56
|
exports.NoDataError = NoDataError;
|
|
56
57
|
exports.resolveColumnValue = resolveColumnValue;
|
|
57
58
|
exports.resolveDefaultValue = resolveDefaultValue;
|
|
58
|
-
exports.resolvePrimaryGenerator = resolvePrimaryGenerator;
|
|
59
59
|
//# sourceMappingURL=dataUtils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataUtils.cjs","sources":["../../../../packages/schema-utils/src/dataUtils.ts"],"sourcesContent":["import { Input, Model, Value } from '@contember/schema'\n\nexport interface Providers {\n\tuuid: () => string\n\tnow: () => Date\n}\n\nexport const resolveDefaultValue = (column: Model.AnyColumn, providers: Pick<Providers, 'now'>) => {\n\tconst type = column.type\n\n\tif (type === Model.ColumnType.Int && column.sequence) {\n\t\treturn undefined\n\t}\n\n\tswitch (type) {\n\t\tcase Model.ColumnType.String:\n\t\tcase Model.ColumnType.Int:\n\t\tcase Model.ColumnType.Enum:\n\t\tcase Model.ColumnType.Double:\n\t\tcase Model.ColumnType.Bool:\n\t\tcase Model.ColumnType.Json:\n\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\treturn column.default\n\t\t\t}\n\t\t\tbreak\n\t\tcase Model.ColumnType.DateTime:\n\t\tcase Model.ColumnType.Date:\n\t\t\tif (column.default === 'now') {\n\t\t\t\treturn providers.now().toISOString()\n\t\t\t}\n\t\t\tbreak\n\t\tcase Model.ColumnType.Uuid:\n\t\t\tbreak\n\t\tdefault:\n\t\t\t((x: never) => {})(type)\n\t}\n\n\tif (column.nullable) {\n\t\treturn null\n\t}\n\n\tthrow new NoDataError(`No data for column ${column.name}`)\n}\n\nexport const
|
|
1
|
+
{"version":3,"file":"dataUtils.cjs","sources":["../../../../packages/schema-utils/src/dataUtils.ts"],"sourcesContent":["import { Input, Model, Value } from '@contember/schema'\n\nexport interface Providers {\n\tuuid: (args?: { version?: 4 | 7 }) => string\n\tnow: () => Date\n}\n\nexport const resolveDefaultValue = (column: Model.AnyColumn, providers: Pick<Providers, 'now'>) => {\n\tconst type = column.type\n\n\tif (type === Model.ColumnType.Int && column.sequence) {\n\t\treturn undefined\n\t}\n\n\tswitch (type) {\n\t\tcase Model.ColumnType.String:\n\t\tcase Model.ColumnType.Int:\n\t\tcase Model.ColumnType.Enum:\n\t\tcase Model.ColumnType.Double:\n\t\tcase Model.ColumnType.Bool:\n\t\tcase Model.ColumnType.Json:\n\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\treturn column.default\n\t\t\t}\n\t\t\tbreak\n\t\tcase Model.ColumnType.DateTime:\n\t\tcase Model.ColumnType.Date:\n\t\tcase Model.ColumnType.Time:\n\t\t\tif (column.default === 'now') {\n\t\t\t\treturn providers.now().toISOString()\n\t\t\t}\n\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\treturn column.default\n\t\t\t}\n\t\t\tbreak\n\t\tcase Model.ColumnType.Uuid:\n\t\t\tbreak\n\t\tdefault:\n\t\t\t((x: never) => {})(type)\n\t}\n\n\tif (column.nullable) {\n\t\treturn null\n\t}\n\n\tthrow new NoDataError(`No data for column ${column.name}`)\n}\n\nexport const resolveColumnValue = (\n\t{\n\t\tentity,\n\t\tcolumn,\n\t\tinput,\n\t}: {\n\t\tentity: Model.Entity\n\t\tcolumn: Model.AnyColumn\n\t\tinput: Input.ColumnValue | undefined\n\t},\n\tproviders: Providers,\n\toptions: {\n\t\tuuidVersion?: 4 | 7\n\t},\n): Value.FieldValue | undefined => {\n\tif (input !== undefined) {\n\t\treturn input\n\t}\n\tif (entity.primary === column.name) {\n\t\tif (column.type === Model.ColumnType.Uuid) {\n\t\t\treturn providers.uuid({ version: options.uuidVersion })\n\t\t}\n\t\treturn undefined\n\t}\n\n\treturn resolveDefaultValue(column, providers)\n}\n\nexport class NoDataError extends Error {}\n"],"names":["Model"],"mappings":";;;AAOa,MAAA,sBAAsB,CAAC,QAAyB,cAAsC;AAClG,QAAM,OAAO,OAAO;AAEpB,MAAI,SAASA,OAAAA,MAAM,WAAW,OAAO,OAAO,UAAU;AAC9C,WAAA;AAAA,EAAA;AAGR,UAAQ,MAAM;AAAA,IACb,KAAKA,OAAAA,MAAM,WAAW;AAAA,IACtB,KAAKA,OAAAA,MAAM,WAAW;AAAA,IACtB,KAAKA,OAAAA,MAAM,WAAW;AAAA,IACtB,KAAKA,OAAAA,MAAM,WAAW;AAAA,IACtB,KAAKA,OAAAA,MAAM,WAAW;AAAA,IACtB,KAAKA,OAAAA,MAAM,WAAW;AACjB,UAAA,OAAO,OAAO,YAAY,aAAa;AAC1C,eAAO,OAAO;AAAA,MAAA;AAEf;AAAA,IACD,KAAKA,OAAAA,MAAM,WAAW;AAAA,IACtB,KAAKA,OAAAA,MAAM,WAAW;AAAA,IACtB,KAAKA,OAAAA,MAAM,WAAW;AACjB,UAAA,OAAO,YAAY,OAAO;AACtB,eAAA,UAAU,IAAI,EAAE,YAAY;AAAA,MAAA;AAEhC,UAAA,OAAO,OAAO,YAAY,aAAa;AAC1C,eAAO,OAAO;AAAA,MAAA;AAEf;AAAA,IACD,KAAKA,OAAAA,MAAM,WAAW;AACrB;AAAA,EAEuB;AAGzB,MAAI,OAAO,UAAU;AACb,WAAA;AAAA,EAAA;AAGR,QAAM,IAAI,YAAY,sBAAsB,OAAO,IAAI,EAAE;AAC1D;AAEO,MAAM,qBAAqB,CACjC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACD,GAKA,WACA,YAGkC;AAClC,MAAI,UAAU,QAAW;AACjB,WAAA;AAAA,EAAA;AAEJ,MAAA,OAAO,YAAY,OAAO,MAAM;AACnC,QAAI,OAAO,SAASA,aAAM,WAAW,MAAM;AAC1C,aAAO,UAAU,KAAK,EAAE,SAAS,QAAQ,aAAa;AAAA,IAAA;AAEhD,WAAA;AAAA,EAAA;AAGD,SAAA,oBAAoB,QAAQ,SAAS;AAC7C;AAEO,MAAM,oBAAoB,MAAM;AAAC;;;;"}
|
|
@@ -17,9 +17,13 @@ const resolveDefaultValue = (column, providers) => {
|
|
|
17
17
|
break;
|
|
18
18
|
case Model.ColumnType.DateTime:
|
|
19
19
|
case Model.ColumnType.Date:
|
|
20
|
+
case Model.ColumnType.Time:
|
|
20
21
|
if (column.default === "now") {
|
|
21
22
|
return providers.now().toISOString();
|
|
22
23
|
}
|
|
24
|
+
if (typeof column.default !== "undefined") {
|
|
25
|
+
return column.default;
|
|
26
|
+
}
|
|
23
27
|
break;
|
|
24
28
|
case Model.ColumnType.Uuid:
|
|
25
29
|
break;
|
|
@@ -29,22 +33,19 @@ const resolveDefaultValue = (column, providers) => {
|
|
|
29
33
|
}
|
|
30
34
|
throw new NoDataError(`No data for column ${column.name}`);
|
|
31
35
|
};
|
|
32
|
-
const resolvePrimaryGenerator = (column, providers) => {
|
|
33
|
-
if (column.type === Model.ColumnType.Uuid) {
|
|
34
|
-
return providers.uuid;
|
|
35
|
-
}
|
|
36
|
-
return () => void 0;
|
|
37
|
-
};
|
|
38
36
|
const resolveColumnValue = ({
|
|
39
37
|
entity,
|
|
40
38
|
column,
|
|
41
39
|
input
|
|
42
|
-
}, providers) => {
|
|
40
|
+
}, providers, options) => {
|
|
43
41
|
if (input !== void 0) {
|
|
44
42
|
return input;
|
|
45
43
|
}
|
|
46
44
|
if (entity.primary === column.name) {
|
|
47
|
-
|
|
45
|
+
if (column.type === Model.ColumnType.Uuid) {
|
|
46
|
+
return providers.uuid({ version: options.uuidVersion });
|
|
47
|
+
}
|
|
48
|
+
return void 0;
|
|
48
49
|
}
|
|
49
50
|
return resolveDefaultValue(column, providers);
|
|
50
51
|
};
|
|
@@ -53,7 +54,6 @@ class NoDataError extends Error {
|
|
|
53
54
|
export {
|
|
54
55
|
NoDataError,
|
|
55
56
|
resolveColumnValue,
|
|
56
|
-
resolveDefaultValue
|
|
57
|
-
resolvePrimaryGenerator
|
|
57
|
+
resolveDefaultValue
|
|
58
58
|
};
|
|
59
59
|
//# sourceMappingURL=dataUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataUtils.js","sources":["../../../../packages/schema-utils/src/dataUtils.ts"],"sourcesContent":["import { Input, Model, Value } from '@contember/schema'\n\nexport interface Providers {\n\tuuid: () => string\n\tnow: () => Date\n}\n\nexport const resolveDefaultValue = (column: Model.AnyColumn, providers: Pick<Providers, 'now'>) => {\n\tconst type = column.type\n\n\tif (type === Model.ColumnType.Int && column.sequence) {\n\t\treturn undefined\n\t}\n\n\tswitch (type) {\n\t\tcase Model.ColumnType.String:\n\t\tcase Model.ColumnType.Int:\n\t\tcase Model.ColumnType.Enum:\n\t\tcase Model.ColumnType.Double:\n\t\tcase Model.ColumnType.Bool:\n\t\tcase Model.ColumnType.Json:\n\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\treturn column.default\n\t\t\t}\n\t\t\tbreak\n\t\tcase Model.ColumnType.DateTime:\n\t\tcase Model.ColumnType.Date:\n\t\t\tif (column.default === 'now') {\n\t\t\t\treturn providers.now().toISOString()\n\t\t\t}\n\t\t\tbreak\n\t\tcase Model.ColumnType.Uuid:\n\t\t\tbreak\n\t\tdefault:\n\t\t\t((x: never) => {})(type)\n\t}\n\n\tif (column.nullable) {\n\t\treturn null\n\t}\n\n\tthrow new NoDataError(`No data for column ${column.name}`)\n}\n\nexport const
|
|
1
|
+
{"version":3,"file":"dataUtils.js","sources":["../../../../packages/schema-utils/src/dataUtils.ts"],"sourcesContent":["import { Input, Model, Value } from '@contember/schema'\n\nexport interface Providers {\n\tuuid: (args?: { version?: 4 | 7 }) => string\n\tnow: () => Date\n}\n\nexport const resolveDefaultValue = (column: Model.AnyColumn, providers: Pick<Providers, 'now'>) => {\n\tconst type = column.type\n\n\tif (type === Model.ColumnType.Int && column.sequence) {\n\t\treturn undefined\n\t}\n\n\tswitch (type) {\n\t\tcase Model.ColumnType.String:\n\t\tcase Model.ColumnType.Int:\n\t\tcase Model.ColumnType.Enum:\n\t\tcase Model.ColumnType.Double:\n\t\tcase Model.ColumnType.Bool:\n\t\tcase Model.ColumnType.Json:\n\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\treturn column.default\n\t\t\t}\n\t\t\tbreak\n\t\tcase Model.ColumnType.DateTime:\n\t\tcase Model.ColumnType.Date:\n\t\tcase Model.ColumnType.Time:\n\t\t\tif (column.default === 'now') {\n\t\t\t\treturn providers.now().toISOString()\n\t\t\t}\n\t\t\tif (typeof column.default !== 'undefined') {\n\t\t\t\treturn column.default\n\t\t\t}\n\t\t\tbreak\n\t\tcase Model.ColumnType.Uuid:\n\t\t\tbreak\n\t\tdefault:\n\t\t\t((x: never) => {})(type)\n\t}\n\n\tif (column.nullable) {\n\t\treturn null\n\t}\n\n\tthrow new NoDataError(`No data for column ${column.name}`)\n}\n\nexport const resolveColumnValue = (\n\t{\n\t\tentity,\n\t\tcolumn,\n\t\tinput,\n\t}: {\n\t\tentity: Model.Entity\n\t\tcolumn: Model.AnyColumn\n\t\tinput: Input.ColumnValue | undefined\n\t},\n\tproviders: Providers,\n\toptions: {\n\t\tuuidVersion?: 4 | 7\n\t},\n): Value.FieldValue | undefined => {\n\tif (input !== undefined) {\n\t\treturn input\n\t}\n\tif (entity.primary === column.name) {\n\t\tif (column.type === Model.ColumnType.Uuid) {\n\t\t\treturn providers.uuid({ version: options.uuidVersion })\n\t\t}\n\t\treturn undefined\n\t}\n\n\treturn resolveDefaultValue(column, providers)\n}\n\nexport class NoDataError extends Error {}\n"],"names":[],"mappings":";AAOa,MAAA,sBAAsB,CAAC,QAAyB,cAAsC;AAClG,QAAM,OAAO,OAAO;AAEpB,MAAI,SAAS,MAAM,WAAW,OAAO,OAAO,UAAU;AAC9C,WAAA;AAAA,EAAA;AAGR,UAAQ,MAAM;AAAA,IACb,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AACjB,UAAA,OAAO,OAAO,YAAY,aAAa;AAC1C,eAAO,OAAO;AAAA,MAAA;AAEf;AAAA,IACD,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AACjB,UAAA,OAAO,YAAY,OAAO;AACtB,eAAA,UAAU,IAAI,EAAE,YAAY;AAAA,MAAA;AAEhC,UAAA,OAAO,OAAO,YAAY,aAAa;AAC1C,eAAO,OAAO;AAAA,MAAA;AAEf;AAAA,IACD,KAAK,MAAM,WAAW;AACrB;AAAA,EAEuB;AAGzB,MAAI,OAAO,UAAU;AACb,WAAA;AAAA,EAAA;AAGR,QAAM,IAAI,YAAY,sBAAsB,OAAO,IAAI,EAAE;AAC1D;AAEO,MAAM,qBAAqB,CACjC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACD,GAKA,WACA,YAGkC;AAClC,MAAI,UAAU,QAAW;AACjB,WAAA;AAAA,EAAA;AAEJ,MAAA,OAAO,YAAY,OAAO,MAAM;AACnC,QAAI,OAAO,SAAS,MAAM,WAAW,MAAM;AAC1C,aAAO,UAAU,KAAK,EAAE,SAAS,QAAQ,aAAa;AAAA,IAAA;AAEhD,WAAA;AAAA,EAAA;AAGD,SAAA,oBAAoB,QAAQ,SAAS;AAC7C;AAEO,MAAM,oBAAoB,MAAM;AAAC;"}
|
|
@@ -207,6 +207,7 @@ const ColumnToMethodMapping = {
|
|
|
207
207
|
[schema.Model.ColumnType.Bool]: "boolColumn",
|
|
208
208
|
[schema.Model.ColumnType.Date]: "dateColumn",
|
|
209
209
|
[schema.Model.ColumnType.DateTime]: "dateTimeColumn",
|
|
210
|
+
[schema.Model.ColumnType.Time]: "timeColumn",
|
|
210
211
|
[schema.Model.ColumnType.Json]: "jsonColumn",
|
|
211
212
|
[schema.Model.ColumnType.Double]: "doubleColumn",
|
|
212
213
|
[schema.Model.ColumnType.Uuid]: "uuidColumn",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefinitionCodeGenerator.cjs","sources":["../../../../../packages/schema-utils/src/definition-generator/DefinitionCodeGenerator.ts"],"sourcesContent":["import { Model, Schema, Writable } from '@contember/schema'\nimport {\n\tacceptFieldVisitor,\n\tDefaultNamingConventions,\n\tisInverseRelation,\n\tNamingConventions,\n\tresolveDefaultColumnType,\n} from '../model'\nimport { printJsValue } from '../utils/printJsValue'\nimport { DefinitionNamingConventions } from './DefinitionNamingConventions'\nimport { AclDefinitionCodeGenerator } from './AclDefinitionCodeGenerator'\n\n\nexport class DefinitionCodeGenerator {\n\tconstructor(\n\t\tprivate readonly schemaNamingConventions: NamingConventions = new DefaultNamingConventions(),\n\t\tprivate readonly definitionNamingConventions = new DefinitionNamingConventions(),\n\t\tprivate readonly aclGenerator = new AclDefinitionCodeGenerator(),\n\t) {\n\t}\n\n\tpublic generate(schema: Schema) {\n\t\tconst roles = this.aclGenerator.generateRoles({ acl: schema.acl })\n\t\tconst aclVariables = this.aclGenerator.generateAclVariables({ acl: schema.acl })\n\t\tconst enums = Object.entries(schema.model.enums).map(([name, values]) => this.generateEnum({ name, values })).join('')\n\t\tconst entities = Object.values(schema.model.entities).map(entity => this.generateEntity({ entity, schema })).join('')\n\n\t\treturn `import { c } from '@contember/schema-definition'\\n${roles}${aclVariables}${enums}${entities}`\n\t}\n\n\tprivate generateEnum({ name, values }: { name: string; values: readonly string[] }): string {\n\t\treturn `\\nexport const ${this.formatIdentifier(name)} = c.createEnum(${values.map(it => printJsValue(it)).join(', ')})\\n`\n\t}\n\n\tpublic generateEntity({ entity, schema }: { entity: Model.Entity; schema: Schema }): string {\n\t\tconst uniqueConstraints = Object.values(entity.unique).map(constraint => this.generateUniqueConstraint({ entity, constraint }))\n\t\tconst indexes = Object.values(entity.indexes).map(index => this.generateIndex({ entity, index }))\n\t\tconst views = this.generateView({ entity })\n\n\t\tconst decorators = [...uniqueConstraints, ...indexes, views].filter(it => !!it).map(it => `${it}\\n`).join('')\n\t\tconst acl = this.aclGenerator.generateEntityAcl({ entity, schema })\n\n\t\treturn `\\n${decorators}${acl}export class ${this.formatIdentifier(entity.name)} {\n${Object.values(entity.fields).map(field => this.generateField({ field, entity, schema })).filter(it => !!it).join('\\n')}\n}\\n`\n\t}\n\n\tprivate generateUniqueConstraint({ entity, constraint }: { entity: Model.Entity; constraint: Model.UniqueConstraint }): string {\n\t\tconst fieldsList = `${constraint.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Unique(${fieldsList})`\n\t}\n\n\tprivate generateIndex({ entity, index }: { entity: Model.Entity; index: Model.Index }): string {\n\t\tconst fieldsList = `${index.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Index(${fieldsList})`\n\t}\n\n\n\tprivate generateView({ entity }: { entity: Model.Entity }): string | undefined {\n\t\tif (!entity.view) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst dependenciesExpr = (entity.view.dependencies?.length ?? 0) > 0\n\t\t\t? `, {\\n\\tdependencies: () => [${entity.view.dependencies?.map(it => this.formatIdentifier(it))}]\\n}`\n\t\t\t: ''\n\n\t\treturn `@c.View(\\`${entity.view.sql}\\`${dependenciesExpr})`\n\t}\n\n\tpublic generateField({ entity, field, schema }: { entity: Model.Entity; field: Model.AnyField; schema: Schema }): string | undefined {\n\t\tconst formatRelationFactory = (method: string, relation: Model.AnyRelation) => {\n\t\t\tconst otherSide = isInverseRelation(relation) ? relation.ownedBy : relation.inversedBy\n\t\t\tconst otherSideFormatted = otherSide ? `, ${printJsValue(otherSide)}` : ''\n\t\t\treturn `${method}(${this.formatIdentifier(relation.target)}${otherSideFormatted})`\n\t\t}\n\t\tconst formatEnumRef = (enumName: string, enumValues: Record<string, string>, providedValue?: string, defaultValue?: string): string | undefined => {\n\t\t\tif (!providedValue || providedValue === defaultValue) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst enumValueKey = Object.entries(Model.OrderDirection).find(dir => dir[1] === providedValue)?.[0]\n\t\t\tif (!enumValueKey) {\n\t\t\t\tthrow new Error(`Value ${providedValue} is not defined in enum ${enumName}`)\n\t\t\t}\n\t\t\treturn `${enumName}.${enumValueKey}`\n\n\t\t}\n\t\tconst formatOrderBy = (orderBy?: readonly Model.OrderBy[]) => {\n\t\t\treturn orderBy?.map(it => {\n\t\t\t\tconst enumExpr = formatEnumRef(`Model.OrderDirection`, Model.OrderDirection, it.direction, Model.OrderDirection.asc)\n\t\t\t\treturn `orderBy(${printJsValue(it.path)}${enumExpr ? `, ${enumExpr}` : ''})`\n\t\t\t}) ?? []\n\t\t}\n\t\tconst formatOnDelete = (onDelete?: Model.OnDelete): string | undefined => {\n\t\t\tif (onDelete === Model.OnDelete.cascade) {\n\t\t\t\treturn 'cascadeOnDelete()'\n\t\t\t}\n\t\t\tif (onDelete === Model.OnDelete.setNull) {\n\t\t\t\treturn 'setNullOnDelete()'\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\tconst formatJoiningColumn = (joiningColumnName: string, fieldName: string): string | undefined => {\n\t\t\tconst defaultJoiningColumn = this.schemaNamingConventions.getJoiningColumnName(fieldName)\n\t\t\tif (defaultJoiningColumn === joiningColumnName) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn `joiningColumn(${printJsValue(joiningColumnName)})`\n\t\t}\n\t\tconst definition = acceptFieldVisitor<(string | undefined)[]>(schema.model, entity, field, {\n\t\t\tvisitColumn: ctx => {\n\t\t\t\treturn this.generateColumn(ctx)\n\t\t\t},\n\t\t\tvisitOneHasMany: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOneInverse', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t\trelation.orphanRemoval ? 'removeOrphan()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\tconst columnNames = this.schemaNamingConventions.getJoiningTableColumnNames(\n\t\t\t\t\tentity.name,\n\t\t\t\t\trelation.name,\n\t\t\t\t\trelation.target,\n\t\t\t\t\trelation.inversedBy,\n\t\t\t\t)\n\t\t\t\tconst defaultJoiningTable = this.schemaNamingConventions.getJoiningTableName(entity.name, relation.name)\n\t\t\t\tconst joiningTable: Writable<Partial<Model.JoiningTable>> = {}\n\t\t\t\tif (relation.joiningTable.tableName !== defaultJoiningTable) {\n\t\t\t\t\tjoiningTable.tableName = relation.joiningTable.tableName\n\t\t\t\t}\n\t\t\t\tif (!relation.joiningTable.eventLog.enabled) {\n\t\t\t\t\tjoiningTable.eventLog = { enabled: false }\n\t\t\t\t}\n\t\t\t\tif (columnNames[0] !== relation.joiningTable.joiningColumn.columnName || relation.joiningTable.joiningColumn.onDelete !== Model.OnDelete.cascade) {\n\t\t\t\t\tjoiningTable.joiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.joiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (columnNames[1] !== relation.joiningTable.inverseJoiningColumn.columnName || relation.joiningTable.inverseJoiningColumn.onDelete !== Model.OnDelete.cascade) {\n\t\t\t\t\tjoiningTable.inverseJoiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.inverseJoiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t\tObject.keys(joiningTable).length > 0 ? `joiningTable(${printJsValue(joiningTable)})` : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasManyInverse', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t})\n\t\tconst definitionCode = definition.filter(it => !!it).join('.')\n\t\tif (field.name === 'id' && definitionCode === 'uuidColumn().notNull()') {\n\t\t\treturn undefined\n\t\t}\n\t\treturn `\\t${this.formatIdentifier(field.name)} = c.${definitionCode}`\n\t}\n\n\tprivate generateColumn({ entity, column }: { entity: Model.Entity; column: Model.AnyColumn }): string[] {\n\t\tlet parts: string[] = []\n\t\tif (column.type === Model.ColumnType.Enum) {\n\t\t\tparts.push(`enumColumn(${column.columnType})`)\n\t\t} else {\n\t\t\tparts.push(`${ColumnToMethodMapping[column.type]}()`)\n\t\t\tconst defaultColumnType = resolveDefaultColumnType(column.type)\n\t\t\tif (defaultColumnType !== column.columnType) {\n\t\t\t\tparts.push(`columnType(${printJsValue(column.columnType)})`)\n\t\t\t}\n\t\t}\n\t\tconst defaultColumnName = this.schemaNamingConventions.getColumnName(column.name)\n\t\tif (defaultColumnName !== column.columnName) {\n\t\t\tparts.push(`columnName(${printJsValue(column.columnName)})`)\n\t\t}\n\t\tif (!column.nullable) {\n\t\t\tparts.push('notNull()')\n\t\t}\n\t\tif (column.default !== undefined) {\n\t\t\tparts.push(`default(${printJsValue(column.default)})`)\n\t\t}\n\t\tif (column.typeAlias) {\n\t\t\tparts.push(`typeAlias(${printJsValue(column.typeAlias)})`)\n\t\t}\n\n\n\t\t// todo: sequence\n\t\t// todo: maybe single column unique()\n\n\t\treturn parts\n\t}\n\n\tprivate formatIdentifier(id: string): string {\n\t\treturn this.definitionNamingConventions.formatIdentifier(id)\n\t}\n}\n\n\nconst ColumnToMethodMapping: {\n\t[K in Exclude<Model.ColumnType, Model.ColumnType.Enum>]: string\n} = {\n\t[Model.ColumnType.Bool]: 'boolColumn',\n\t[Model.ColumnType.Date]: 'dateColumn',\n\t[Model.ColumnType.DateTime]: 'dateTimeColumn',\n\t[Model.ColumnType.Json]: 'jsonColumn',\n\t[Model.ColumnType.Double]: 'doubleColumn',\n\t[Model.ColumnType.Uuid]: 'uuidColumn',\n\t[Model.ColumnType.Int]: 'intColumn',\n\t[Model.ColumnType.String]: 'stringColumn',\n}\n"],"names":["DefaultNamingConventions","DefinitionNamingConventions","AclDefinitionCodeGenerator","schema","printJsValue","isInverseRelation","Model","acceptFieldVisitor","entity","resolveDefaultColumnType"],"mappings":";;;;;;;;;AAaO,MAAM,wBAAwB;AAAA,EACpC,YACkB,0BAA6C,IAAIA,kBAAAA,4BACjD,8BAA8B,IAAIC,4BAAAA,+BAClC,eAAe,IAAIC,2BAAAA,8BACnC;AAHgB,SAAA,0BAAA;AACA,SAAA,8BAAA;AACA,SAAA,eAAA;AAAA,EAAA;AAAA,EAIX,SAASC,SAAgB;AACzB,UAAA,QAAQ,KAAK,aAAa,cAAc,EAAE,KAAKA,QAAO,KAAK;AAC3D,UAAA,eAAe,KAAK,aAAa,qBAAqB,EAAE,KAAKA,QAAO,KAAK;AACzE,UAAA,QAAQ,OAAO,QAAQA,QAAO,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE;AACrH,UAAM,WAAW,OAAO,OAAOA,QAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,WAAU,KAAK,eAAe,EAAE,QAAQ,QAAAA,QAAA,CAAQ,CAAC,EAAE,KAAK,EAAE;AAE7G,WAAA;AAAA,EAAqD,KAAK,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ;AAAA,EAAA;AAAA,EAG5F,aAAa,EAAE,MAAM,UAA+D;AACpF,WAAA;AAAA,eAAkB,KAAK,iBAAiB,IAAI,CAAC,mBAAmB,OAAO,IAAI,CAAM,OAAAC,aAAA,aAAa,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,EAAA;AAAA,EAG9G,eAAe,EAAE,QAAQ,QAAAD,WAA4D;AAC3F,UAAM,oBAAoB,OAAO,OAAO,OAAO,MAAM,EAAE,IAAI,CAAc,eAAA,KAAK,yBAAyB,EAAE,QAAQ,WAAY,CAAA,CAAC;AAC9H,UAAM,UAAU,OAAO,OAAO,OAAO,OAAO,EAAE,IAAI,CAAS,UAAA,KAAK,cAAc,EAAE,QAAQ,MAAO,CAAA,CAAC;AAChG,UAAM,QAAQ,KAAK,aAAa,EAAE,QAAQ;AAE1C,UAAM,aAAa,CAAC,GAAG,mBAAmB,GAAG,SAAS,KAAK,EAAE,OAAO,CAAA,OAAM,CAAC,CAAC,EAAE,EAAE,IAAI,CAAA,OAAM,GAAG,EAAE;AAAA,CAAI,EAAE,KAAK,EAAE;AAC5G,UAAM,MAAM,KAAK,aAAa,kBAAkB,EAAE,QAAQ,QAAAA,SAAQ;AAE3D,WAAA;AAAA,EAAK,UAAU,GAAG,GAAG,gBAAgB,KAAK,iBAAiB,OAAO,IAAI,CAAC;AAAA,EAC9E,OAAO,OAAO,OAAO,MAAM,EAAE,IAAI,CAAS,UAAA,KAAK,cAAc,EAAE,OAAO,QAAQ,QAAAA,SAAQ,CAAC,EAAE,OAAO,CAAM,OAAA,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAAA;AAAA,EAI/G,yBAAyB,EAAE,QAAQ,cAAoF;AAC9H,UAAM,aAAa,GAAG,WAAW,OAAO,IAAI,CAAA,OAAMC,aAAAA,aAAa,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;AAE9E,WAAO,aAAa,UAAU;AAAA,EAAA;AAAA,EAGvB,cAAc,EAAE,QAAQ,SAA+D;AAC9F,UAAM,aAAa,GAAG,MAAM,OAAO,IAAI,CAAA,OAAMA,aAAAA,aAAa,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;AAEzE,WAAO,YAAY,UAAU;AAAA,EAAA;AAAA,EAItB,aAAa,EAAE,UAAwD;AAC1E,QAAA,CAAC,OAAO,MAAM;AACV,aAAA;AAAA,IAAA;AAGR,UAAM,oBAAoB,OAAO,KAAK,cAAc,UAAU,KAAK,IAChE;AAAA,wBAA+B,OAAO,KAAK,cAAc,IAAI,QAAM,KAAK,iBAAiB,EAAE,CAAC,CAAC;AAAA,KAC7F;AAEH,WAAO,aAAa,OAAO,KAAK,GAAG,KAAK,gBAAgB;AAAA,EAAA;AAAA,EAGlD,cAAc,EAAE,QAAQ,OAAA,QAAOD,YAA+F;AAC9H,UAAA,wBAAwB,CAAC,QAAgB,aAAgC;AAC9E,YAAM,YAAYE,WAAAA,kBAAkB,QAAQ,IAAI,SAAS,UAAU,SAAS;AAC5E,YAAM,qBAAqB,YAAY,KAAKD,aAAAA,aAAa,SAAS,CAAC,KAAK;AACjE,aAAA,GAAG,MAAM,IAAI,KAAK,iBAAiB,SAAS,MAAM,CAAC,GAAG,kBAAkB;AAAA,IAChF;AACA,UAAM,gBAAgB,CAAC,UAAkB,YAAoC,eAAwB,iBAA8C;AAC9I,UAAA,CAAC,iBAAiB,kBAAkB,cAAc;AAC9C,eAAA;AAAA,MAAA;AAER,YAAM,eAAe,OAAO,QAAQE,OAAA,MAAM,cAAc,EAAE,KAAK,CAAA,QAAO,IAAI,CAAC,MAAM,aAAa,IAAI,CAAC;AACnG,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,SAAS,aAAa,2BAA2B,QAAQ,EAAE;AAAA,MAAA;AAErE,aAAA,GAAG,QAAQ,IAAI,YAAY;AAAA,IAEnC;AACM,UAAA,gBAAgB,CAAC,YAAuC;AACtD,aAAA,SAAS,IAAI,CAAM,OAAA;AACnB,cAAA,WAAW,cAAc,wBAAwBA,OAAA,MAAM,gBAAgB,GAAG,WAAWA,aAAM,eAAe,GAAG;AAC5G,eAAA,WAAWF,aAAAA,aAAa,GAAG,IAAI,CAAC,GAAG,WAAW,KAAK,QAAQ,KAAK,EAAE;AAAA,MACzE,CAAA,KAAK,CAAC;AAAA,IACR;AACM,UAAA,iBAAiB,CAAC,aAAkD;AACrE,UAAA,aAAaE,OAAAA,MAAM,SAAS,SAAS;AACjC,eAAA;AAAA,MAAA;AAEJ,UAAA,aAAaA,OAAAA,MAAM,SAAS,SAAS;AACjC,eAAA;AAAA,MAAA;AAED,aAAA;AAAA,IACR;AACM,UAAA,sBAAsB,CAAC,mBAA2B,cAA0C;AACjG,YAAM,uBAAuB,KAAK,wBAAwB,qBAAqB,SAAS;AACxF,UAAI,yBAAyB,mBAAmB;AACxC,eAAA;AAAA,MAAA;AAED,aAAA,iBAAiBF,aAAAA,aAAa,iBAAiB,CAAC;AAAA,IACxD;AACA,UAAM,aAAaG,WAAAA,mBAA2CJ,SAAO,OAAO,QAAQ,OAAO;AAAA,MAC1F,aAAa,CAAO,QAAA;AACZ,eAAA,KAAK,eAAe,GAAG;AAAA,MAC/B;AAAA,MACA,iBAAiB,CAAC,EAAE,eAAe;AAC3B,eAAA;AAAA,UACN,sBAAsB,cAAc,QAAQ;AAAA,UAC5C,GAAG,cAAc,SAAS,OAAO;AAAA,QAClC;AAAA,MACD;AAAA,MACA,iBAAiB,CAAC,EAAE,eAAe;AAC3B,eAAA;AAAA,UACN,sBAAsB,cAAc,QAAQ;AAAA,UAC5C,CAAC,SAAS,WAAW,cAAc;AAAA,UACnC,eAAe,SAAS,cAAc,QAAQ;AAAA,UAC9C,oBAAoB,SAAS,cAAc,YAAY,SAAS,IAAI;AAAA,QACrE;AAAA,MACD;AAAA,MACA,uBAAuB,CAAC,EAAE,eAAe;AACjC,eAAA;AAAA,UACN,sBAAsB,oBAAoB,QAAQ;AAAA,UAClD,CAAC,SAAS,WAAW,cAAc;AAAA,QACpC;AAAA,MACD;AAAA,MACA,sBAAsB,CAAC,EAAE,eAAe;AAChC,eAAA;AAAA,UACN,sBAAsB,aAAa,QAAQ;AAAA,UAC3C,CAAC,SAAS,WAAW,cAAc;AAAA,UACnC,eAAe,SAAS,cAAc,QAAQ;AAAA,UAC9C,oBAAoB,SAAS,cAAc,YAAY,SAAS,IAAI;AAAA,UACpE,SAAS,gBAAgB,mBAAmB;AAAA,QAC7C;AAAA,MACD;AAAA,MACA,wBAAwB,CAAC,EAAE,QAAAK,SAAQ,eAAe;AAC3C,cAAA,cAAc,KAAK,wBAAwB;AAAA,UAChDA,QAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACV;AACA,cAAM,sBAAsB,KAAK,wBAAwB,oBAAoBA,QAAO,MAAM,SAAS,IAAI;AACvG,cAAM,eAAsD,CAAC;AACzD,YAAA,SAAS,aAAa,cAAc,qBAAqB;AAC/C,uBAAA,YAAY,SAAS,aAAa;AAAA,QAAA;AAEhD,YAAI,CAAC,SAAS,aAAa,SAAS,SAAS;AAC/B,uBAAA,WAAW,EAAE,SAAS,MAAM;AAAA,QAAA;AAE1C,YAAI,YAAY,CAAC,MAAM,SAAS,aAAa,cAAc,cAAc,SAAS,aAAa,cAAc,aAAaF,OAAAA,MAAM,SAAS,SAAS;AACjJ,uBAAa,gBAAgB;AAAA,YAC5B,YAAY,SAAS,aAAa,cAAc;AAAA,YAChD,UAAU,SAAS,aAAa,cAAc;AAAA,UAC/C;AAAA,QAAA;AAED,YAAI,YAAY,CAAC,MAAM,SAAS,aAAa,qBAAqB,cAAc,SAAS,aAAa,qBAAqB,aAAaA,OAAAA,MAAM,SAAS,SAAS;AAC/J,uBAAa,uBAAuB;AAAA,YACnC,YAAY,SAAS,aAAa,qBAAqB;AAAA,YACvD,UAAU,SAAS,aAAa,qBAAqB;AAAA,UACtD;AAAA,QAAA;AAGM,eAAA;AAAA,UACN,sBAAsB,eAAe,QAAQ;AAAA,UAC7C,GAAG,cAAc,SAAS,OAAO;AAAA,UACjC,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,gBAAgBF,0BAAa,YAAY,CAAC,MAAM;AAAA,QACxF;AAAA,MACD;AAAA,MACA,yBAAyB,CAAC,EAAE,eAAe;AACnC,eAAA;AAAA,UACN,sBAAsB,sBAAsB,QAAQ;AAAA,UACpD,GAAG,cAAc,SAAS,OAAO;AAAA,QAClC;AAAA,MAAA;AAAA,IACD,CACA;AACK,UAAA,iBAAiB,WAAW,OAAO,CAAA,OAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC7D,QAAI,MAAM,SAAS,QAAQ,mBAAmB,0BAA0B;AAChE,aAAA;AAAA,IAAA;AAER,WAAO,IAAK,KAAK,iBAAiB,MAAM,IAAI,CAAC,QAAQ,cAAc;AAAA,EAAA;AAAA,EAG5D,eAAe,EAAE,QAAQ,UAAuE;AACvG,QAAI,QAAkB,CAAC;AACvB,QAAI,OAAO,SAASE,aAAM,WAAW,MAAM;AAC1C,YAAM,KAAK,cAAc,OAAO,UAAU,GAAG;AAAA,IAAA,OACvC;AACN,YAAM,KAAK,GAAG,sBAAsB,OAAO,IAAI,CAAC,IAAI;AAC9C,YAAA,oBAAoBG,yBAAAA,yBAAyB,OAAO,IAAI;AAC1D,UAAA,sBAAsB,OAAO,YAAY;AAC5C,cAAM,KAAK,cAAcL,aAAAA,aAAa,OAAO,UAAU,CAAC,GAAG;AAAA,MAAA;AAAA,IAC5D;AAED,UAAM,oBAAoB,KAAK,wBAAwB,cAAc,OAAO,IAAI;AAC5E,QAAA,sBAAsB,OAAO,YAAY;AAC5C,YAAM,KAAK,cAAcA,aAAAA,aAAa,OAAO,UAAU,CAAC,GAAG;AAAA,IAAA;AAExD,QAAA,CAAC,OAAO,UAAU;AACrB,YAAM,KAAK,WAAW;AAAA,IAAA;AAEnB,QAAA,OAAO,YAAY,QAAW;AACjC,YAAM,KAAK,WAAWA,aAAAA,aAAa,OAAO,OAAO,CAAC,GAAG;AAAA,IAAA;AAEtD,QAAI,OAAO,WAAW;AACrB,YAAM,KAAK,aAAaA,aAAAA,aAAa,OAAO,SAAS,CAAC,GAAG;AAAA,IAAA;AAOnD,WAAA;AAAA,EAAA;AAAA,EAGA,iBAAiB,IAAoB;AACrC,WAAA,KAAK,4BAA4B,iBAAiB,EAAE;AAAA,EAAA;AAE7D;AAGA,MAAM,wBAEF;AAAA,EACH,CAACE,OAAA,MAAM,WAAW,IAAI,GAAG;AAAA,EACzB,CAACA,OAAA,MAAM,WAAW,IAAI,GAAG;AAAA,EACzB,CAACA,OAAA,MAAM,WAAW,QAAQ,GAAG;AAAA,EAC7B,CAACA,OAAA,MAAM,WAAW,IAAI,GAAG;AAAA,EACzB,CAACA,OAAA,MAAM,WAAW,MAAM,GAAG;AAAA,EAC3B,CAACA,OAAA,MAAM,WAAW,IAAI,GAAG;AAAA,EACzB,CAACA,OAAA,MAAM,WAAW,GAAG,GAAG;AAAA,EACxB,CAACA,OAAA,MAAM,WAAW,MAAM,GAAG;AAC5B;;"}
|
|
1
|
+
{"version":3,"file":"DefinitionCodeGenerator.cjs","sources":["../../../../../packages/schema-utils/src/definition-generator/DefinitionCodeGenerator.ts"],"sourcesContent":["import { Model, Schema, Writable } from '@contember/schema'\nimport {\n\tacceptFieldVisitor,\n\tDefaultNamingConventions,\n\tisInverseRelation,\n\tNamingConventions,\n\tresolveDefaultColumnType,\n} from '../model'\nimport { printJsValue } from '../utils/printJsValue'\nimport { DefinitionNamingConventions } from './DefinitionNamingConventions'\nimport { AclDefinitionCodeGenerator } from './AclDefinitionCodeGenerator'\n\n\nexport class DefinitionCodeGenerator {\n\tconstructor(\n\t\tprivate readonly schemaNamingConventions: NamingConventions = new DefaultNamingConventions(),\n\t\tprivate readonly definitionNamingConventions = new DefinitionNamingConventions(),\n\t\tprivate readonly aclGenerator = new AclDefinitionCodeGenerator(),\n\t) {\n\t}\n\n\tpublic generate(schema: Schema) {\n\t\tconst roles = this.aclGenerator.generateRoles({ acl: schema.acl })\n\t\tconst aclVariables = this.aclGenerator.generateAclVariables({ acl: schema.acl })\n\t\tconst enums = Object.entries(schema.model.enums).map(([name, values]) => this.generateEnum({ name, values })).join('')\n\t\tconst entities = Object.values(schema.model.entities).map(entity => this.generateEntity({ entity, schema })).join('')\n\n\t\treturn `import { c } from '@contember/schema-definition'\\n${roles}${aclVariables}${enums}${entities}`\n\t}\n\n\tprivate generateEnum({ name, values }: { name: string; values: readonly string[] }): string {\n\t\treturn `\\nexport const ${this.formatIdentifier(name)} = c.createEnum(${values.map(it => printJsValue(it)).join(', ')})\\n`\n\t}\n\n\tpublic generateEntity({ entity, schema }: { entity: Model.Entity; schema: Schema }): string {\n\t\tconst uniqueConstraints = Object.values(entity.unique).map(constraint => this.generateUniqueConstraint({ entity, constraint }))\n\t\tconst indexes = Object.values(entity.indexes).map(index => this.generateIndex({ entity, index }))\n\t\tconst views = this.generateView({ entity })\n\n\t\tconst decorators = [...uniqueConstraints, ...indexes, views].filter(it => !!it).map(it => `${it}\\n`).join('')\n\t\tconst acl = this.aclGenerator.generateEntityAcl({ entity, schema })\n\n\t\treturn `\\n${decorators}${acl}export class ${this.formatIdentifier(entity.name)} {\n${Object.values(entity.fields).map(field => this.generateField({ field, entity, schema })).filter(it => !!it).join('\\n')}\n}\\n`\n\t}\n\n\tprivate generateUniqueConstraint({ entity, constraint }: { entity: Model.Entity; constraint: Model.UniqueConstraint | Model.UniqueIndex }): string {\n\t\tconst fieldsList = `${constraint.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Unique(${fieldsList})`\n\t}\n\n\tprivate generateIndex({ entity, index }: { entity: Model.Entity; index: Model.Index }): string {\n\t\tconst fieldsList = `${index.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Index(${fieldsList})`\n\t}\n\n\n\tprivate generateView({ entity }: { entity: Model.Entity }): string | undefined {\n\t\tif (!entity.view) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst dependenciesExpr = (entity.view.dependencies?.length ?? 0) > 0\n\t\t\t? `, {\\n\\tdependencies: () => [${entity.view.dependencies?.map(it => this.formatIdentifier(it))}]\\n}`\n\t\t\t: ''\n\n\t\treturn `@c.View(\\`${entity.view.sql}\\`${dependenciesExpr})`\n\t}\n\n\tpublic generateField({ entity, field, schema }: { entity: Model.Entity; field: Model.AnyField; schema: Schema }): string | undefined {\n\t\tconst formatRelationFactory = (method: string, relation: Model.AnyRelation) => {\n\t\t\tconst otherSide = isInverseRelation(relation) ? relation.ownedBy : relation.inversedBy\n\t\t\tconst otherSideFormatted = otherSide ? `, ${printJsValue(otherSide)}` : ''\n\t\t\treturn `${method}(${this.formatIdentifier(relation.target)}${otherSideFormatted})`\n\t\t}\n\t\tconst formatEnumRef = (enumName: string, enumValues: Record<string, string>, providedValue?: string, defaultValue?: string): string | undefined => {\n\t\t\tif (!providedValue || providedValue === defaultValue) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst enumValueKey = Object.entries(Model.OrderDirection).find(dir => dir[1] === providedValue)?.[0]\n\t\t\tif (!enumValueKey) {\n\t\t\t\tthrow new Error(`Value ${providedValue} is not defined in enum ${enumName}`)\n\t\t\t}\n\t\t\treturn `${enumName}.${enumValueKey}`\n\n\t\t}\n\t\tconst formatOrderBy = (orderBy?: readonly Model.OrderBy[]) => {\n\t\t\treturn orderBy?.map(it => {\n\t\t\t\tconst enumExpr = formatEnumRef(`Model.OrderDirection`, Model.OrderDirection, it.direction, Model.OrderDirection.asc)\n\t\t\t\treturn `orderBy(${printJsValue(it.path)}${enumExpr ? `, ${enumExpr}` : ''})`\n\t\t\t}) ?? []\n\t\t}\n\t\tconst formatOnDelete = (onDelete?: Model.OnDelete): string | undefined => {\n\t\t\tif (onDelete === Model.OnDelete.cascade) {\n\t\t\t\treturn 'cascadeOnDelete()'\n\t\t\t}\n\t\t\tif (onDelete === Model.OnDelete.setNull) {\n\t\t\t\treturn 'setNullOnDelete()'\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\tconst formatJoiningColumn = (joiningColumnName: string, fieldName: string): string | undefined => {\n\t\t\tconst defaultJoiningColumn = this.schemaNamingConventions.getJoiningColumnName(fieldName)\n\t\t\tif (defaultJoiningColumn === joiningColumnName) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn `joiningColumn(${printJsValue(joiningColumnName)})`\n\t\t}\n\t\tconst definition = acceptFieldVisitor<(string | undefined)[]>(schema.model, entity, field, {\n\t\t\tvisitColumn: ctx => {\n\t\t\t\treturn this.generateColumn(ctx)\n\t\t\t},\n\t\t\tvisitOneHasMany: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOneInverse', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t\trelation.orphanRemoval ? 'removeOrphan()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\tconst columnNames = this.schemaNamingConventions.getJoiningTableColumnNames(\n\t\t\t\t\tentity.name,\n\t\t\t\t\trelation.name,\n\t\t\t\t\trelation.target,\n\t\t\t\t\trelation.inversedBy,\n\t\t\t\t)\n\t\t\t\tconst defaultJoiningTable = this.schemaNamingConventions.getJoiningTableName(entity.name, relation.name)\n\t\t\t\tconst joiningTable: Writable<Partial<Model.JoiningTable>> = {}\n\t\t\t\tif (relation.joiningTable.tableName !== defaultJoiningTable) {\n\t\t\t\t\tjoiningTable.tableName = relation.joiningTable.tableName\n\t\t\t\t}\n\t\t\t\tif (!relation.joiningTable.eventLog.enabled) {\n\t\t\t\t\tjoiningTable.eventLog = { enabled: false }\n\t\t\t\t}\n\t\t\t\tif (columnNames[0] !== relation.joiningTable.joiningColumn.columnName || relation.joiningTable.joiningColumn.onDelete !== Model.OnDelete.cascade) {\n\t\t\t\t\tjoiningTable.joiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.joiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (columnNames[1] !== relation.joiningTable.inverseJoiningColumn.columnName || relation.joiningTable.inverseJoiningColumn.onDelete !== Model.OnDelete.cascade) {\n\t\t\t\t\tjoiningTable.inverseJoiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.inverseJoiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t\tObject.keys(joiningTable).length > 0 ? `joiningTable(${printJsValue(joiningTable)})` : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasManyInverse', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t})\n\t\tconst definitionCode = definition.filter(it => !!it).join('.')\n\t\tif (field.name === 'id' && definitionCode === 'uuidColumn().notNull()') {\n\t\t\treturn undefined\n\t\t}\n\t\treturn `\\t${this.formatIdentifier(field.name)} = c.${definitionCode}`\n\t}\n\n\tprivate generateColumn({ entity, column }: { entity: Model.Entity; column: Model.AnyColumn }): string[] {\n\t\tlet parts: string[] = []\n\t\tif (column.type === Model.ColumnType.Enum) {\n\t\t\tparts.push(`enumColumn(${column.columnType})`)\n\t\t} else {\n\t\t\tparts.push(`${ColumnToMethodMapping[column.type]}()`)\n\t\t\tconst defaultColumnType = resolveDefaultColumnType(column.type)\n\t\t\tif (defaultColumnType !== column.columnType) {\n\t\t\t\tparts.push(`columnType(${printJsValue(column.columnType)})`)\n\t\t\t}\n\t\t}\n\t\tconst defaultColumnName = this.schemaNamingConventions.getColumnName(column.name)\n\t\tif (defaultColumnName !== column.columnName) {\n\t\t\tparts.push(`columnName(${printJsValue(column.columnName)})`)\n\t\t}\n\t\tif (!column.nullable) {\n\t\t\tparts.push('notNull()')\n\t\t}\n\t\tif (column.default !== undefined) {\n\t\t\tparts.push(`default(${printJsValue(column.default)})`)\n\t\t}\n\t\tif (column.typeAlias) {\n\t\t\tparts.push(`typeAlias(${printJsValue(column.typeAlias)})`)\n\t\t}\n\n\n\t\t// todo: sequence\n\t\t// todo: maybe single column unique()\n\n\t\treturn parts\n\t}\n\n\tprivate formatIdentifier(id: string): string {\n\t\treturn this.definitionNamingConventions.formatIdentifier(id)\n\t}\n}\n\n\nconst ColumnToMethodMapping: {\n\t[K in Exclude<Model.ColumnType, Model.ColumnType.Enum>]: string\n} = {\n\t[Model.ColumnType.Bool]: 'boolColumn',\n\t[Model.ColumnType.Date]: 'dateColumn',\n\t[Model.ColumnType.DateTime]: 'dateTimeColumn',\n\t[Model.ColumnType.Time]: 'timeColumn',\n\t[Model.ColumnType.Json]: 'jsonColumn',\n\t[Model.ColumnType.Double]: 'doubleColumn',\n\t[Model.ColumnType.Uuid]: 'uuidColumn',\n\t[Model.ColumnType.Int]: 'intColumn',\n\t[Model.ColumnType.String]: 'stringColumn',\n}\n"],"names":["DefaultNamingConventions","DefinitionNamingConventions","AclDefinitionCodeGenerator","schema","printJsValue","isInverseRelation","Model","acceptFieldVisitor","entity","resolveDefaultColumnType"],"mappings":"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"}
|
|
@@ -205,6 +205,7 @@ const ColumnToMethodMapping = {
|
|
|
205
205
|
[Model.ColumnType.Bool]: "boolColumn",
|
|
206
206
|
[Model.ColumnType.Date]: "dateColumn",
|
|
207
207
|
[Model.ColumnType.DateTime]: "dateTimeColumn",
|
|
208
|
+
[Model.ColumnType.Time]: "timeColumn",
|
|
208
209
|
[Model.ColumnType.Json]: "jsonColumn",
|
|
209
210
|
[Model.ColumnType.Double]: "doubleColumn",
|
|
210
211
|
[Model.ColumnType.Uuid]: "uuidColumn",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefinitionCodeGenerator.js","sources":["../../../../../packages/schema-utils/src/definition-generator/DefinitionCodeGenerator.ts"],"sourcesContent":["import { Model, Schema, Writable } from '@contember/schema'\nimport {\n\tacceptFieldVisitor,\n\tDefaultNamingConventions,\n\tisInverseRelation,\n\tNamingConventions,\n\tresolveDefaultColumnType,\n} from '../model'\nimport { printJsValue } from '../utils/printJsValue'\nimport { DefinitionNamingConventions } from './DefinitionNamingConventions'\nimport { AclDefinitionCodeGenerator } from './AclDefinitionCodeGenerator'\n\n\nexport class DefinitionCodeGenerator {\n\tconstructor(\n\t\tprivate readonly schemaNamingConventions: NamingConventions = new DefaultNamingConventions(),\n\t\tprivate readonly definitionNamingConventions = new DefinitionNamingConventions(),\n\t\tprivate readonly aclGenerator = new AclDefinitionCodeGenerator(),\n\t) {\n\t}\n\n\tpublic generate(schema: Schema) {\n\t\tconst roles = this.aclGenerator.generateRoles({ acl: schema.acl })\n\t\tconst aclVariables = this.aclGenerator.generateAclVariables({ acl: schema.acl })\n\t\tconst enums = Object.entries(schema.model.enums).map(([name, values]) => this.generateEnum({ name, values })).join('')\n\t\tconst entities = Object.values(schema.model.entities).map(entity => this.generateEntity({ entity, schema })).join('')\n\n\t\treturn `import { c } from '@contember/schema-definition'\\n${roles}${aclVariables}${enums}${entities}`\n\t}\n\n\tprivate generateEnum({ name, values }: { name: string; values: readonly string[] }): string {\n\t\treturn `\\nexport const ${this.formatIdentifier(name)} = c.createEnum(${values.map(it => printJsValue(it)).join(', ')})\\n`\n\t}\n\n\tpublic generateEntity({ entity, schema }: { entity: Model.Entity; schema: Schema }): string {\n\t\tconst uniqueConstraints = Object.values(entity.unique).map(constraint => this.generateUniqueConstraint({ entity, constraint }))\n\t\tconst indexes = Object.values(entity.indexes).map(index => this.generateIndex({ entity, index }))\n\t\tconst views = this.generateView({ entity })\n\n\t\tconst decorators = [...uniqueConstraints, ...indexes, views].filter(it => !!it).map(it => `${it}\\n`).join('')\n\t\tconst acl = this.aclGenerator.generateEntityAcl({ entity, schema })\n\n\t\treturn `\\n${decorators}${acl}export class ${this.formatIdentifier(entity.name)} {\n${Object.values(entity.fields).map(field => this.generateField({ field, entity, schema })).filter(it => !!it).join('\\n')}\n}\\n`\n\t}\n\n\tprivate generateUniqueConstraint({ entity, constraint }: { entity: Model.Entity; constraint: Model.UniqueConstraint }): string {\n\t\tconst fieldsList = `${constraint.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Unique(${fieldsList})`\n\t}\n\n\tprivate generateIndex({ entity, index }: { entity: Model.Entity; index: Model.Index }): string {\n\t\tconst fieldsList = `${index.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Index(${fieldsList})`\n\t}\n\n\n\tprivate generateView({ entity }: { entity: Model.Entity }): string | undefined {\n\t\tif (!entity.view) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst dependenciesExpr = (entity.view.dependencies?.length ?? 0) > 0\n\t\t\t? `, {\\n\\tdependencies: () => [${entity.view.dependencies?.map(it => this.formatIdentifier(it))}]\\n}`\n\t\t\t: ''\n\n\t\treturn `@c.View(\\`${entity.view.sql}\\`${dependenciesExpr})`\n\t}\n\n\tpublic generateField({ entity, field, schema }: { entity: Model.Entity; field: Model.AnyField; schema: Schema }): string | undefined {\n\t\tconst formatRelationFactory = (method: string, relation: Model.AnyRelation) => {\n\t\t\tconst otherSide = isInverseRelation(relation) ? relation.ownedBy : relation.inversedBy\n\t\t\tconst otherSideFormatted = otherSide ? `, ${printJsValue(otherSide)}` : ''\n\t\t\treturn `${method}(${this.formatIdentifier(relation.target)}${otherSideFormatted})`\n\t\t}\n\t\tconst formatEnumRef = (enumName: string, enumValues: Record<string, string>, providedValue?: string, defaultValue?: string): string | undefined => {\n\t\t\tif (!providedValue || providedValue === defaultValue) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst enumValueKey = Object.entries(Model.OrderDirection).find(dir => dir[1] === providedValue)?.[0]\n\t\t\tif (!enumValueKey) {\n\t\t\t\tthrow new Error(`Value ${providedValue} is not defined in enum ${enumName}`)\n\t\t\t}\n\t\t\treturn `${enumName}.${enumValueKey}`\n\n\t\t}\n\t\tconst formatOrderBy = (orderBy?: readonly Model.OrderBy[]) => {\n\t\t\treturn orderBy?.map(it => {\n\t\t\t\tconst enumExpr = formatEnumRef(`Model.OrderDirection`, Model.OrderDirection, it.direction, Model.OrderDirection.asc)\n\t\t\t\treturn `orderBy(${printJsValue(it.path)}${enumExpr ? `, ${enumExpr}` : ''})`\n\t\t\t}) ?? []\n\t\t}\n\t\tconst formatOnDelete = (onDelete?: Model.OnDelete): string | undefined => {\n\t\t\tif (onDelete === Model.OnDelete.cascade) {\n\t\t\t\treturn 'cascadeOnDelete()'\n\t\t\t}\n\t\t\tif (onDelete === Model.OnDelete.setNull) {\n\t\t\t\treturn 'setNullOnDelete()'\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\tconst formatJoiningColumn = (joiningColumnName: string, fieldName: string): string | undefined => {\n\t\t\tconst defaultJoiningColumn = this.schemaNamingConventions.getJoiningColumnName(fieldName)\n\t\t\tif (defaultJoiningColumn === joiningColumnName) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn `joiningColumn(${printJsValue(joiningColumnName)})`\n\t\t}\n\t\tconst definition = acceptFieldVisitor<(string | undefined)[]>(schema.model, entity, field, {\n\t\t\tvisitColumn: ctx => {\n\t\t\t\treturn this.generateColumn(ctx)\n\t\t\t},\n\t\t\tvisitOneHasMany: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOneInverse', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t\trelation.orphanRemoval ? 'removeOrphan()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\tconst columnNames = this.schemaNamingConventions.getJoiningTableColumnNames(\n\t\t\t\t\tentity.name,\n\t\t\t\t\trelation.name,\n\t\t\t\t\trelation.target,\n\t\t\t\t\trelation.inversedBy,\n\t\t\t\t)\n\t\t\t\tconst defaultJoiningTable = this.schemaNamingConventions.getJoiningTableName(entity.name, relation.name)\n\t\t\t\tconst joiningTable: Writable<Partial<Model.JoiningTable>> = {}\n\t\t\t\tif (relation.joiningTable.tableName !== defaultJoiningTable) {\n\t\t\t\t\tjoiningTable.tableName = relation.joiningTable.tableName\n\t\t\t\t}\n\t\t\t\tif (!relation.joiningTable.eventLog.enabled) {\n\t\t\t\t\tjoiningTable.eventLog = { enabled: false }\n\t\t\t\t}\n\t\t\t\tif (columnNames[0] !== relation.joiningTable.joiningColumn.columnName || relation.joiningTable.joiningColumn.onDelete !== Model.OnDelete.cascade) {\n\t\t\t\t\tjoiningTable.joiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.joiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (columnNames[1] !== relation.joiningTable.inverseJoiningColumn.columnName || relation.joiningTable.inverseJoiningColumn.onDelete !== Model.OnDelete.cascade) {\n\t\t\t\t\tjoiningTable.inverseJoiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.inverseJoiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t\tObject.keys(joiningTable).length > 0 ? `joiningTable(${printJsValue(joiningTable)})` : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasManyInverse', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t})\n\t\tconst definitionCode = definition.filter(it => !!it).join('.')\n\t\tif (field.name === 'id' && definitionCode === 'uuidColumn().notNull()') {\n\t\t\treturn undefined\n\t\t}\n\t\treturn `\\t${this.formatIdentifier(field.name)} = c.${definitionCode}`\n\t}\n\n\tprivate generateColumn({ entity, column }: { entity: Model.Entity; column: Model.AnyColumn }): string[] {\n\t\tlet parts: string[] = []\n\t\tif (column.type === Model.ColumnType.Enum) {\n\t\t\tparts.push(`enumColumn(${column.columnType})`)\n\t\t} else {\n\t\t\tparts.push(`${ColumnToMethodMapping[column.type]}()`)\n\t\t\tconst defaultColumnType = resolveDefaultColumnType(column.type)\n\t\t\tif (defaultColumnType !== column.columnType) {\n\t\t\t\tparts.push(`columnType(${printJsValue(column.columnType)})`)\n\t\t\t}\n\t\t}\n\t\tconst defaultColumnName = this.schemaNamingConventions.getColumnName(column.name)\n\t\tif (defaultColumnName !== column.columnName) {\n\t\t\tparts.push(`columnName(${printJsValue(column.columnName)})`)\n\t\t}\n\t\tif (!column.nullable) {\n\t\t\tparts.push('notNull()')\n\t\t}\n\t\tif (column.default !== undefined) {\n\t\t\tparts.push(`default(${printJsValue(column.default)})`)\n\t\t}\n\t\tif (column.typeAlias) {\n\t\t\tparts.push(`typeAlias(${printJsValue(column.typeAlias)})`)\n\t\t}\n\n\n\t\t// todo: sequence\n\t\t// todo: maybe single column unique()\n\n\t\treturn parts\n\t}\n\n\tprivate formatIdentifier(id: string): string {\n\t\treturn this.definitionNamingConventions.formatIdentifier(id)\n\t}\n}\n\n\nconst ColumnToMethodMapping: {\n\t[K in Exclude<Model.ColumnType, Model.ColumnType.Enum>]: string\n} = {\n\t[Model.ColumnType.Bool]: 'boolColumn',\n\t[Model.ColumnType.Date]: 'dateColumn',\n\t[Model.ColumnType.DateTime]: 'dateTimeColumn',\n\t[Model.ColumnType.Json]: 'jsonColumn',\n\t[Model.ColumnType.Double]: 'doubleColumn',\n\t[Model.ColumnType.Uuid]: 'uuidColumn',\n\t[Model.ColumnType.Int]: 'intColumn',\n\t[Model.ColumnType.String]: 'stringColumn',\n}\n"],"names":["entity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DefinitionCodeGenerator.js","sources":["../../../../../packages/schema-utils/src/definition-generator/DefinitionCodeGenerator.ts"],"sourcesContent":["import { Model, Schema, Writable } from '@contember/schema'\nimport {\n\tacceptFieldVisitor,\n\tDefaultNamingConventions,\n\tisInverseRelation,\n\tNamingConventions,\n\tresolveDefaultColumnType,\n} from '../model'\nimport { printJsValue } from '../utils/printJsValue'\nimport { DefinitionNamingConventions } from './DefinitionNamingConventions'\nimport { AclDefinitionCodeGenerator } from './AclDefinitionCodeGenerator'\n\n\nexport class DefinitionCodeGenerator {\n\tconstructor(\n\t\tprivate readonly schemaNamingConventions: NamingConventions = new DefaultNamingConventions(),\n\t\tprivate readonly definitionNamingConventions = new DefinitionNamingConventions(),\n\t\tprivate readonly aclGenerator = new AclDefinitionCodeGenerator(),\n\t) {\n\t}\n\n\tpublic generate(schema: Schema) {\n\t\tconst roles = this.aclGenerator.generateRoles({ acl: schema.acl })\n\t\tconst aclVariables = this.aclGenerator.generateAclVariables({ acl: schema.acl })\n\t\tconst enums = Object.entries(schema.model.enums).map(([name, values]) => this.generateEnum({ name, values })).join('')\n\t\tconst entities = Object.values(schema.model.entities).map(entity => this.generateEntity({ entity, schema })).join('')\n\n\t\treturn `import { c } from '@contember/schema-definition'\\n${roles}${aclVariables}${enums}${entities}`\n\t}\n\n\tprivate generateEnum({ name, values }: { name: string; values: readonly string[] }): string {\n\t\treturn `\\nexport const ${this.formatIdentifier(name)} = c.createEnum(${values.map(it => printJsValue(it)).join(', ')})\\n`\n\t}\n\n\tpublic generateEntity({ entity, schema }: { entity: Model.Entity; schema: Schema }): string {\n\t\tconst uniqueConstraints = Object.values(entity.unique).map(constraint => this.generateUniqueConstraint({ entity, constraint }))\n\t\tconst indexes = Object.values(entity.indexes).map(index => this.generateIndex({ entity, index }))\n\t\tconst views = this.generateView({ entity })\n\n\t\tconst decorators = [...uniqueConstraints, ...indexes, views].filter(it => !!it).map(it => `${it}\\n`).join('')\n\t\tconst acl = this.aclGenerator.generateEntityAcl({ entity, schema })\n\n\t\treturn `\\n${decorators}${acl}export class ${this.formatIdentifier(entity.name)} {\n${Object.values(entity.fields).map(field => this.generateField({ field, entity, schema })).filter(it => !!it).join('\\n')}\n}\\n`\n\t}\n\n\tprivate generateUniqueConstraint({ entity, constraint }: { entity: Model.Entity; constraint: Model.UniqueConstraint | Model.UniqueIndex }): string {\n\t\tconst fieldsList = `${constraint.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Unique(${fieldsList})`\n\t}\n\n\tprivate generateIndex({ entity, index }: { entity: Model.Entity; index: Model.Index }): string {\n\t\tconst fieldsList = `${index.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Index(${fieldsList})`\n\t}\n\n\n\tprivate generateView({ entity }: { entity: Model.Entity }): string | undefined {\n\t\tif (!entity.view) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst dependenciesExpr = (entity.view.dependencies?.length ?? 0) > 0\n\t\t\t? `, {\\n\\tdependencies: () => [${entity.view.dependencies?.map(it => this.formatIdentifier(it))}]\\n}`\n\t\t\t: ''\n\n\t\treturn `@c.View(\\`${entity.view.sql}\\`${dependenciesExpr})`\n\t}\n\n\tpublic generateField({ entity, field, schema }: { entity: Model.Entity; field: Model.AnyField; schema: Schema }): string | undefined {\n\t\tconst formatRelationFactory = (method: string, relation: Model.AnyRelation) => {\n\t\t\tconst otherSide = isInverseRelation(relation) ? relation.ownedBy : relation.inversedBy\n\t\t\tconst otherSideFormatted = otherSide ? `, ${printJsValue(otherSide)}` : ''\n\t\t\treturn `${method}(${this.formatIdentifier(relation.target)}${otherSideFormatted})`\n\t\t}\n\t\tconst formatEnumRef = (enumName: string, enumValues: Record<string, string>, providedValue?: string, defaultValue?: string): string | undefined => {\n\t\t\tif (!providedValue || providedValue === defaultValue) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst enumValueKey = Object.entries(Model.OrderDirection).find(dir => dir[1] === providedValue)?.[0]\n\t\t\tif (!enumValueKey) {\n\t\t\t\tthrow new Error(`Value ${providedValue} is not defined in enum ${enumName}`)\n\t\t\t}\n\t\t\treturn `${enumName}.${enumValueKey}`\n\n\t\t}\n\t\tconst formatOrderBy = (orderBy?: readonly Model.OrderBy[]) => {\n\t\t\treturn orderBy?.map(it => {\n\t\t\t\tconst enumExpr = formatEnumRef(`Model.OrderDirection`, Model.OrderDirection, it.direction, Model.OrderDirection.asc)\n\t\t\t\treturn `orderBy(${printJsValue(it.path)}${enumExpr ? `, ${enumExpr}` : ''})`\n\t\t\t}) ?? []\n\t\t}\n\t\tconst formatOnDelete = (onDelete?: Model.OnDelete): string | undefined => {\n\t\t\tif (onDelete === Model.OnDelete.cascade) {\n\t\t\t\treturn 'cascadeOnDelete()'\n\t\t\t}\n\t\t\tif (onDelete === Model.OnDelete.setNull) {\n\t\t\t\treturn 'setNullOnDelete()'\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\tconst formatJoiningColumn = (joiningColumnName: string, fieldName: string): string | undefined => {\n\t\t\tconst defaultJoiningColumn = this.schemaNamingConventions.getJoiningColumnName(fieldName)\n\t\t\tif (defaultJoiningColumn === joiningColumnName) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn `joiningColumn(${printJsValue(joiningColumnName)})`\n\t\t}\n\t\tconst definition = acceptFieldVisitor<(string | undefined)[]>(schema.model, entity, field, {\n\t\t\tvisitColumn: ctx => {\n\t\t\t\treturn this.generateColumn(ctx)\n\t\t\t},\n\t\t\tvisitOneHasMany: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOneInverse', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t\trelation.orphanRemoval ? 'removeOrphan()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\tconst columnNames = this.schemaNamingConventions.getJoiningTableColumnNames(\n\t\t\t\t\tentity.name,\n\t\t\t\t\trelation.name,\n\t\t\t\t\trelation.target,\n\t\t\t\t\trelation.inversedBy,\n\t\t\t\t)\n\t\t\t\tconst defaultJoiningTable = this.schemaNamingConventions.getJoiningTableName(entity.name, relation.name)\n\t\t\t\tconst joiningTable: Writable<Partial<Model.JoiningTable>> = {}\n\t\t\t\tif (relation.joiningTable.tableName !== defaultJoiningTable) {\n\t\t\t\t\tjoiningTable.tableName = relation.joiningTable.tableName\n\t\t\t\t}\n\t\t\t\tif (!relation.joiningTable.eventLog.enabled) {\n\t\t\t\t\tjoiningTable.eventLog = { enabled: false }\n\t\t\t\t}\n\t\t\t\tif (columnNames[0] !== relation.joiningTable.joiningColumn.columnName || relation.joiningTable.joiningColumn.onDelete !== Model.OnDelete.cascade) {\n\t\t\t\t\tjoiningTable.joiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.joiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (columnNames[1] !== relation.joiningTable.inverseJoiningColumn.columnName || relation.joiningTable.inverseJoiningColumn.onDelete !== Model.OnDelete.cascade) {\n\t\t\t\t\tjoiningTable.inverseJoiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.inverseJoiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t\tObject.keys(joiningTable).length > 0 ? `joiningTable(${printJsValue(joiningTable)})` : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasManyInverse', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t})\n\t\tconst definitionCode = definition.filter(it => !!it).join('.')\n\t\tif (field.name === 'id' && definitionCode === 'uuidColumn().notNull()') {\n\t\t\treturn undefined\n\t\t}\n\t\treturn `\\t${this.formatIdentifier(field.name)} = c.${definitionCode}`\n\t}\n\n\tprivate generateColumn({ entity, column }: { entity: Model.Entity; column: Model.AnyColumn }): string[] {\n\t\tlet parts: string[] = []\n\t\tif (column.type === Model.ColumnType.Enum) {\n\t\t\tparts.push(`enumColumn(${column.columnType})`)\n\t\t} else {\n\t\t\tparts.push(`${ColumnToMethodMapping[column.type]}()`)\n\t\t\tconst defaultColumnType = resolveDefaultColumnType(column.type)\n\t\t\tif (defaultColumnType !== column.columnType) {\n\t\t\t\tparts.push(`columnType(${printJsValue(column.columnType)})`)\n\t\t\t}\n\t\t}\n\t\tconst defaultColumnName = this.schemaNamingConventions.getColumnName(column.name)\n\t\tif (defaultColumnName !== column.columnName) {\n\t\t\tparts.push(`columnName(${printJsValue(column.columnName)})`)\n\t\t}\n\t\tif (!column.nullable) {\n\t\t\tparts.push('notNull()')\n\t\t}\n\t\tif (column.default !== undefined) {\n\t\t\tparts.push(`default(${printJsValue(column.default)})`)\n\t\t}\n\t\tif (column.typeAlias) {\n\t\t\tparts.push(`typeAlias(${printJsValue(column.typeAlias)})`)\n\t\t}\n\n\n\t\t// todo: sequence\n\t\t// todo: maybe single column unique()\n\n\t\treturn parts\n\t}\n\n\tprivate formatIdentifier(id: string): string {\n\t\treturn this.definitionNamingConventions.formatIdentifier(id)\n\t}\n}\n\n\nconst ColumnToMethodMapping: {\n\t[K in Exclude<Model.ColumnType, Model.ColumnType.Enum>]: string\n} = {\n\t[Model.ColumnType.Bool]: 'boolColumn',\n\t[Model.ColumnType.Date]: 'dateColumn',\n\t[Model.ColumnType.DateTime]: 'dateTimeColumn',\n\t[Model.ColumnType.Time]: 'timeColumn',\n\t[Model.ColumnType.Json]: 'jsonColumn',\n\t[Model.ColumnType.Double]: 'doubleColumn',\n\t[Model.ColumnType.Uuid]: 'uuidColumn',\n\t[Model.ColumnType.Int]: 'intColumn',\n\t[Model.ColumnType.String]: 'stringColumn',\n}\n"],"names":["entity"],"mappings":"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"}
|
|
@@ -59,7 +59,7 @@ const tryGetColumnName = (schema2, entity, fieldName) => {
|
|
|
59
59
|
const getColumnType = (schema$1, entity, fieldName) => {
|
|
60
60
|
return acceptFieldVisitor(schema$1, entity, fieldName, {
|
|
61
61
|
// TODO solve enum handling properly maybe we should distinguish between domain and column type
|
|
62
|
-
visitColumn: ({ column }) => column.type === schema.Model.ColumnType.Enum ? "text" : column.columnType,
|
|
62
|
+
visitColumn: ({ column }) => (column.type === schema.Model.ColumnType.Enum ? "text" : column.columnType) + (column.list ? "[]" : ""),
|
|
63
63
|
visitRelation: ({ entity: entity2, relation, targetEntity }) => {
|
|
64
64
|
if (isIt.isIt(relation, "joiningColumn")) {
|
|
65
65
|
return getColumnType(schema$1, targetEntity, targetEntity.primary);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelUtils.cjs","sources":["../../../../../packages/schema-utils/src/model/modelUtils.ts"],"sourcesContent":["import { assertNever, isIt } from '../utils'\nimport { Model } from '@contember/schema'\n\nexport enum ModelErrorCode {\n\tENTITY_NOT_FOUND = 'entityNotFound',\n\tFIELD_NOT_FOUND = 'fieldNotFound',\n\tNOT_RELATION = 'notRelation',\n\tNOT_OWNING_SIDE = 'notOwningSide',\n}\n\nexport class ModelError extends Error {\n\tconstructor(public readonly code: ModelErrorCode, message: string) {\n\t\tsuper(message)\n\t}\n}\n\nconst createEntityNotFoundError = (entityName: string) =>\n\tnew ModelError(ModelErrorCode.ENTITY_NOT_FOUND, `Entity ${entityName} not found`)\n\nconst createFieldNotFoundError = (entityName: string, fieldName: string) =>\n\tnew ModelError(ModelErrorCode.FIELD_NOT_FOUND, `Field ${fieldName} of entity ${entityName} not found`)\n\nexport const getEntity = (schema: Model.Schema, entityName: string): Model.Entity => {\n\tconst entity = schema.entities[entityName]\n\tif (!entity) {\n\t\tthrow createEntityNotFoundError(entityName)\n\t}\n\treturn entity\n}\n\nexport const getField = (entity: Model.Entity, fieldName: string): Model.AnyField => {\n\tconst field = entity.fields[fieldName]\n\tif (!field) {\n\t\tthrow createFieldNotFoundError(entity.name, fieldName)\n\t}\n\treturn field\n}\n\nexport const getColumnName = (schema: Model.Schema, entity: Model.Entity, fieldName: string) => {\n\treturn acceptFieldVisitor(schema, entity, fieldName, {\n\t\tvisitColumn: ({ column }) => column.columnName,\n\t\tvisitRelation: ({ entity, relation }) => {\n\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\treturn relation.joiningColumn.columnName\n\t\t\t}\n\t\t\tthrow new ModelError(\n\t\t\t\tModelErrorCode.NOT_OWNING_SIDE,\n\t\t\t\t`Field ${relation.name} of entity ${entity.name} is not an owning side`,\n\t\t\t)\n\t\t},\n\t})\n}\n\nexport const tryGetColumnName = (schema: Model.Schema, entity: Model.Entity, fieldName: string) => {\n\ttry {\n\t\treturn getColumnName(schema, entity, fieldName)\n\t} catch (e) {\n\t\tif (e instanceof ModelError && e.code === ModelErrorCode.NOT_OWNING_SIDE) {\n\t\t\treturn undefined\n\t\t}\n\t\tthrow e\n\t}\n}\n\nexport const getColumnType = (schema: Model.Schema, entity: Model.Entity, fieldName: string): string => {\n\treturn acceptFieldVisitor(schema, entity, fieldName, {\n\t\t// TODO solve enum handling properly maybe we should distinguish between domain and column type\n\t\tvisitColumn: ({ column }) => (column.type === Model.ColumnType.Enum ? 'text' : column.columnType),\n\t\tvisitRelation: ({ entity, relation, targetEntity }) => {\n\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\treturn getColumnType(schema, targetEntity, targetEntity.primary)\n\t\t\t}\n\t\t\tthrow new ModelError(\n\t\t\t\tModelErrorCode.NOT_OWNING_SIDE,\n\t\t\t\t`Field ${relation.name} of entity ${entity.name} is not an owning side`,\n\t\t\t)\n\t\t},\n\t})\n}\n\nexport const getTargetEntity = (\n\tschema: Model.Schema,\n\tentity: Model.Entity,\n\trelationName: string,\n): Model.Entity | null => {\n\treturn acceptFieldVisitor(schema, entity, relationName, {\n\t\tvisitColumn: () => null,\n\t\tvisitRelation: ({ targetEntity }) => targetEntity,\n\t})\n}\n\nexport const acceptEveryFieldVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\tvisitor: Model.FieldVisitor<T>,\n): { [fieldName: string]: T } => {\n\tconst entityObj: Model.Entity = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst result: { [fieldName: string]: T } = {}\n\tfor (const field in entityObj.fields) {\n\t\tresult[field] = acceptFieldVisitor(schema, entityObj, field, visitor)\n\t}\n\treturn result\n}\n\nexport const acceptFieldVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\tfield: string | Model.AnyField,\n\tvisitor: Model.FieldVisitor<T>,\n): T => {\n\tconst entityObj: Model.Entity = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst fieldObj: Model.AnyField = typeof field === 'string' ? entityObj.fields[field] : field\n\tif (!fieldObj) {\n\t\tthrow createFieldNotFoundError(entityObj.name, typeof field === 'string' ? field : 'unknown')\n\t}\n\n\tif (isIt<Model.AnyColumn>(fieldObj, 'columnType')) {\n\t\treturn visitor.visitColumn({\n\t\t\tentity: entityObj,\n\t\t\tcolumn: fieldObj,\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationVisitor<T>>(visitor, 'visitRelation')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, {\n\t\t\tvisitManyHasManyInverse: visitor.visitRelation.bind(visitor),\n\t\t\tvisitManyHasManyOwning: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasMany: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasOneInverse: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasOneOwning: visitor.visitRelation.bind(visitor),\n\t\t\tvisitManyHasOne: visitor.visitRelation.bind(visitor),\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationByGenericTypeVisitor<T>>(visitor, 'visitHasMany')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, {\n\t\t\tvisitManyHasManyInverse: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitManyHasManyOwning: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitOneHasMany: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitOneHasOneInverse: visitor.visitHasOne.bind(visitor),\n\t\t\tvisitOneHasOneOwning: visitor.visitHasOne.bind(visitor),\n\t\t\tvisitManyHasOne: visitor.visitHasOne.bind(visitor),\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationByTypeVisitor<T>>(visitor, 'visitManyHasManyInverse')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, visitor)\n\t}\n\n\tthrow new Error()\n}\n\nexport const acceptRelationTypeVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\trelation: string | Model.AnyRelation,\n\tvisitor: Model.RelationByTypeVisitor<T>,\n): T => {\n\tconst entityObj = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst relationObj: Model.AnyField = typeof relation === 'string' ? entityObj.fields[relation] : relation\n\tif (!relationObj) {\n\t\tthrow createFieldNotFoundError(entityObj.name, typeof relation === 'string' ? relation : 'unknown')\n\t}\n\n\tif (!isRelation(relationObj)) {\n\t\tthrow new ModelError(\n\t\t\tModelErrorCode.NOT_RELATION,\n\t\t\t`Field ${relationObj.name} of entity ${entityObj.name} is not a relation`,\n\t\t)\n\t}\n\n\tconst targetEntity = getEntity(schema, relationObj.target)\n\n\tif (isInverseRelation(relationObj)) {\n\t\tconst targetRelation = targetEntity.fields[relationObj.ownedBy]\n\t\tswitch (relationObj.type) {\n\t\t\tcase Model.RelationType.ManyHasMany:\n\t\t\t\treturn visitor.visitManyHasManyInverse({\n\t\t\t\t\ttype: 'manyHasManyInverse',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasManyOwningRelation,\n\t\t\t\t},\n\t\t\t\t)\n\t\t\tcase Model.RelationType.OneHasOne:\n\t\t\t\treturn visitor.visitOneHasOneInverse({\n\t\t\t\t\ttype: 'oneHasOneInverse',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasOneOwningRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.OneHasMany:\n\t\t\t\treturn visitor.visitOneHasMany({\n\t\t\t\t\ttype: 'oneHasMany',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasOneRelation,\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\treturn assertNever(relationObj)\n\t\t}\n\t} else if (isOwningRelation(relationObj)) {\n\t\tconst targetRelation = relationObj.inversedBy ? targetEntity.fields[relationObj.inversedBy] : null\n\n\t\tswitch (relationObj.type) {\n\t\t\tcase Model.RelationType.ManyHasMany:\n\t\t\t\treturn visitor.visitManyHasManyOwning({\n\t\t\t\t\ttype: 'manyHasManyOwning',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasManyInverseRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.OneHasOne:\n\t\t\t\treturn visitor.visitOneHasOneOwning({\n\t\t\t\t\ttype: 'oneHasOneOwning',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasOneInverseRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.ManyHasOne:\n\t\t\t\treturn visitor.visitManyHasOne({\n\t\t\t\t\ttype: 'manyHasOne',\n\t\t\t\t\tentity: entityObj, //\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasManyRelation,\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\treturn assertNever(relationObj)\n\t\t}\n\t}\n\n\tthrow new Error('Invalid relation type')\n}\n\nexport const isRelation = (field: Model.AnyField): field is Model.AnyRelation => {\n\treturn isIt<Model.Relation>(field, 'target')\n}\n\nexport const isInverseRelation = (relation: Model.Relation): relation is Model.InverseRelation => {\n\treturn (relation as Model.InverseRelation).ownedBy !== undefined\n}\n\nexport const isOwningRelation = (relation: Model.Relation): relation is Model.OwningRelation => {\n\treturn !isInverseRelation(relation)\n}\n\nexport const isColumn = (field: Model.AnyField): field is Model.AnyColumn => isIt<Model.AnyColumn>(field, 'columnType')\n\nexport const emptyModelSchema: Model.Schema = { entities: {}, enums: {} }\n"],"names":["ModelErrorCode","schema","entity","isIt","Model","assertNever"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"modelUtils.cjs","sources":["../../../../../packages/schema-utils/src/model/modelUtils.ts"],"sourcesContent":["import { assertNever, isIt } from '../utils'\nimport { Model } from '@contember/schema'\n\nexport enum ModelErrorCode {\n\tENTITY_NOT_FOUND = 'entityNotFound',\n\tFIELD_NOT_FOUND = 'fieldNotFound',\n\tNOT_RELATION = 'notRelation',\n\tNOT_OWNING_SIDE = 'notOwningSide',\n}\n\nexport class ModelError extends Error {\n\tconstructor(public readonly code: ModelErrorCode, message: string) {\n\t\tsuper(message)\n\t}\n}\n\nconst createEntityNotFoundError = (entityName: string) =>\n\tnew ModelError(ModelErrorCode.ENTITY_NOT_FOUND, `Entity ${entityName} not found`)\n\nconst createFieldNotFoundError = (entityName: string, fieldName: string) =>\n\tnew ModelError(ModelErrorCode.FIELD_NOT_FOUND, `Field ${fieldName} of entity ${entityName} not found`)\n\nexport const getEntity = (schema: Model.Schema, entityName: string): Model.Entity => {\n\tconst entity = schema.entities[entityName]\n\tif (!entity) {\n\t\tthrow createEntityNotFoundError(entityName)\n\t}\n\treturn entity\n}\n\nexport const getField = (entity: Model.Entity, fieldName: string): Model.AnyField => {\n\tconst field = entity.fields[fieldName]\n\tif (!field) {\n\t\tthrow createFieldNotFoundError(entity.name, fieldName)\n\t}\n\treturn field\n}\n\nexport const getColumnName = (schema: Model.Schema, entity: Model.Entity, fieldName: string) => {\n\treturn acceptFieldVisitor(schema, entity, fieldName, {\n\t\tvisitColumn: ({ column }) => column.columnName,\n\t\tvisitRelation: ({ entity, relation }) => {\n\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\treturn relation.joiningColumn.columnName\n\t\t\t}\n\t\t\tthrow new ModelError(\n\t\t\t\tModelErrorCode.NOT_OWNING_SIDE,\n\t\t\t\t`Field ${relation.name} of entity ${entity.name} is not an owning side`,\n\t\t\t)\n\t\t},\n\t})\n}\n\nexport const tryGetColumnName = (schema: Model.Schema, entity: Model.Entity, fieldName: string) => {\n\ttry {\n\t\treturn getColumnName(schema, entity, fieldName)\n\t} catch (e) {\n\t\tif (e instanceof ModelError && e.code === ModelErrorCode.NOT_OWNING_SIDE) {\n\t\t\treturn undefined\n\t\t}\n\t\tthrow e\n\t}\n}\n\nexport const getColumnType = (schema: Model.Schema, entity: Model.Entity, fieldName: string): string => {\n\treturn acceptFieldVisitor(schema, entity, fieldName, {\n\t\t// TODO solve enum handling properly maybe we should distinguish between domain and column type\n\t\tvisitColumn: ({ column }) => (column.type === Model.ColumnType.Enum ? 'text' : column.columnType) + (column.list ? '[]' : ''),\n\t\tvisitRelation: ({ entity, relation, targetEntity }) => {\n\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\treturn getColumnType(schema, targetEntity, targetEntity.primary)\n\t\t\t}\n\t\t\tthrow new ModelError(\n\t\t\t\tModelErrorCode.NOT_OWNING_SIDE,\n\t\t\t\t`Field ${relation.name} of entity ${entity.name} is not an owning side`,\n\t\t\t)\n\t\t},\n\t})\n}\n\nexport const getTargetEntity = (\n\tschema: Model.Schema,\n\tentity: Model.Entity,\n\trelationName: string,\n): Model.Entity | null => {\n\treturn acceptFieldVisitor(schema, entity, relationName, {\n\t\tvisitColumn: () => null,\n\t\tvisitRelation: ({ targetEntity }) => targetEntity,\n\t})\n}\n\nexport const acceptEveryFieldVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\tvisitor: Model.FieldVisitor<T>,\n): { [fieldName: string]: T } => {\n\tconst entityObj: Model.Entity = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst result: { [fieldName: string]: T } = {}\n\tfor (const field in entityObj.fields) {\n\t\tresult[field] = acceptFieldVisitor(schema, entityObj, field, visitor)\n\t}\n\treturn result\n}\n\nexport const acceptFieldVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\tfield: string | Model.AnyField,\n\tvisitor: Model.FieldVisitor<T>,\n): T => {\n\tconst entityObj: Model.Entity = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst fieldObj: Model.AnyField = typeof field === 'string' ? entityObj.fields[field] : field\n\tif (!fieldObj) {\n\t\tthrow createFieldNotFoundError(entityObj.name, typeof field === 'string' ? field : 'unknown')\n\t}\n\n\tif (isIt<Model.AnyColumn>(fieldObj, 'columnType')) {\n\t\treturn visitor.visitColumn({\n\t\t\tentity: entityObj,\n\t\t\tcolumn: fieldObj,\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationVisitor<T>>(visitor, 'visitRelation')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, {\n\t\t\tvisitManyHasManyInverse: visitor.visitRelation.bind(visitor),\n\t\t\tvisitManyHasManyOwning: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasMany: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasOneInverse: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasOneOwning: visitor.visitRelation.bind(visitor),\n\t\t\tvisitManyHasOne: visitor.visitRelation.bind(visitor),\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationByGenericTypeVisitor<T>>(visitor, 'visitHasMany')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, {\n\t\t\tvisitManyHasManyInverse: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitManyHasManyOwning: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitOneHasMany: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitOneHasOneInverse: visitor.visitHasOne.bind(visitor),\n\t\t\tvisitOneHasOneOwning: visitor.visitHasOne.bind(visitor),\n\t\t\tvisitManyHasOne: visitor.visitHasOne.bind(visitor),\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationByTypeVisitor<T>>(visitor, 'visitManyHasManyInverse')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, visitor)\n\t}\n\n\tthrow new Error()\n}\n\nexport const acceptRelationTypeVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\trelation: string | Model.AnyRelation,\n\tvisitor: Model.RelationByTypeVisitor<T>,\n): T => {\n\tconst entityObj = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst relationObj: Model.AnyField = typeof relation === 'string' ? entityObj.fields[relation] : relation\n\tif (!relationObj) {\n\t\tthrow createFieldNotFoundError(entityObj.name, typeof relation === 'string' ? relation : 'unknown')\n\t}\n\n\tif (!isRelation(relationObj)) {\n\t\tthrow new ModelError(\n\t\t\tModelErrorCode.NOT_RELATION,\n\t\t\t`Field ${relationObj.name} of entity ${entityObj.name} is not a relation`,\n\t\t)\n\t}\n\n\tconst targetEntity = getEntity(schema, relationObj.target)\n\n\tif (isInverseRelation(relationObj)) {\n\t\tconst targetRelation = targetEntity.fields[relationObj.ownedBy]\n\t\tswitch (relationObj.type) {\n\t\t\tcase Model.RelationType.ManyHasMany:\n\t\t\t\treturn visitor.visitManyHasManyInverse({\n\t\t\t\t\ttype: 'manyHasManyInverse',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasManyOwningRelation,\n\t\t\t\t},\n\t\t\t\t)\n\t\t\tcase Model.RelationType.OneHasOne:\n\t\t\t\treturn visitor.visitOneHasOneInverse({\n\t\t\t\t\ttype: 'oneHasOneInverse',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasOneOwningRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.OneHasMany:\n\t\t\t\treturn visitor.visitOneHasMany({\n\t\t\t\t\ttype: 'oneHasMany',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasOneRelation,\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\treturn assertNever(relationObj)\n\t\t}\n\t} else if (isOwningRelation(relationObj)) {\n\t\tconst targetRelation = relationObj.inversedBy ? targetEntity.fields[relationObj.inversedBy] : null\n\n\t\tswitch (relationObj.type) {\n\t\t\tcase Model.RelationType.ManyHasMany:\n\t\t\t\treturn visitor.visitManyHasManyOwning({\n\t\t\t\t\ttype: 'manyHasManyOwning',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasManyInverseRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.OneHasOne:\n\t\t\t\treturn visitor.visitOneHasOneOwning({\n\t\t\t\t\ttype: 'oneHasOneOwning',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasOneInverseRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.ManyHasOne:\n\t\t\t\treturn visitor.visitManyHasOne({\n\t\t\t\t\ttype: 'manyHasOne',\n\t\t\t\t\tentity: entityObj, //\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasManyRelation,\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\treturn assertNever(relationObj)\n\t\t}\n\t}\n\n\tthrow new Error('Invalid relation type')\n}\n\nexport const isRelation = (field: Model.AnyField): field is Model.AnyRelation => {\n\treturn isIt<Model.Relation>(field, 'target')\n}\n\nexport const isInverseRelation = (relation: Model.Relation): relation is Model.InverseRelation => {\n\treturn (relation as Model.InverseRelation).ownedBy !== undefined\n}\n\nexport const isOwningRelation = (relation: Model.Relation): relation is Model.OwningRelation => {\n\treturn !isInverseRelation(relation)\n}\n\nexport const isColumn = (field: Model.AnyField): field is Model.AnyColumn => isIt<Model.AnyColumn>(field, 'columnType')\n\nexport const emptyModelSchema: Model.Schema = { entities: {}, enums: {} }\n"],"names":["ModelErrorCode","schema","entity","isIt","Model","assertNever"],"mappings":"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"}
|
|
@@ -57,7 +57,7 @@ const tryGetColumnName = (schema, entity, fieldName) => {
|
|
|
57
57
|
const getColumnType = (schema, entity, fieldName) => {
|
|
58
58
|
return acceptFieldVisitor(schema, entity, fieldName, {
|
|
59
59
|
// TODO solve enum handling properly maybe we should distinguish between domain and column type
|
|
60
|
-
visitColumn: ({ column }) => column.type === Model.ColumnType.Enum ? "text" : column.columnType,
|
|
60
|
+
visitColumn: ({ column }) => (column.type === Model.ColumnType.Enum ? "text" : column.columnType) + (column.list ? "[]" : ""),
|
|
61
61
|
visitRelation: ({ entity: entity2, relation, targetEntity }) => {
|
|
62
62
|
if (isIt(relation, "joiningColumn")) {
|
|
63
63
|
return getColumnType(schema, targetEntity, targetEntity.primary);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelUtils.js","sources":["../../../../../packages/schema-utils/src/model/modelUtils.ts"],"sourcesContent":["import { assertNever, isIt } from '../utils'\nimport { Model } from '@contember/schema'\n\nexport enum ModelErrorCode {\n\tENTITY_NOT_FOUND = 'entityNotFound',\n\tFIELD_NOT_FOUND = 'fieldNotFound',\n\tNOT_RELATION = 'notRelation',\n\tNOT_OWNING_SIDE = 'notOwningSide',\n}\n\nexport class ModelError extends Error {\n\tconstructor(public readonly code: ModelErrorCode, message: string) {\n\t\tsuper(message)\n\t}\n}\n\nconst createEntityNotFoundError = (entityName: string) =>\n\tnew ModelError(ModelErrorCode.ENTITY_NOT_FOUND, `Entity ${entityName} not found`)\n\nconst createFieldNotFoundError = (entityName: string, fieldName: string) =>\n\tnew ModelError(ModelErrorCode.FIELD_NOT_FOUND, `Field ${fieldName} of entity ${entityName} not found`)\n\nexport const getEntity = (schema: Model.Schema, entityName: string): Model.Entity => {\n\tconst entity = schema.entities[entityName]\n\tif (!entity) {\n\t\tthrow createEntityNotFoundError(entityName)\n\t}\n\treturn entity\n}\n\nexport const getField = (entity: Model.Entity, fieldName: string): Model.AnyField => {\n\tconst field = entity.fields[fieldName]\n\tif (!field) {\n\t\tthrow createFieldNotFoundError(entity.name, fieldName)\n\t}\n\treturn field\n}\n\nexport const getColumnName = (schema: Model.Schema, entity: Model.Entity, fieldName: string) => {\n\treturn acceptFieldVisitor(schema, entity, fieldName, {\n\t\tvisitColumn: ({ column }) => column.columnName,\n\t\tvisitRelation: ({ entity, relation }) => {\n\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\treturn relation.joiningColumn.columnName\n\t\t\t}\n\t\t\tthrow new ModelError(\n\t\t\t\tModelErrorCode.NOT_OWNING_SIDE,\n\t\t\t\t`Field ${relation.name} of entity ${entity.name} is not an owning side`,\n\t\t\t)\n\t\t},\n\t})\n}\n\nexport const tryGetColumnName = (schema: Model.Schema, entity: Model.Entity, fieldName: string) => {\n\ttry {\n\t\treturn getColumnName(schema, entity, fieldName)\n\t} catch (e) {\n\t\tif (e instanceof ModelError && e.code === ModelErrorCode.NOT_OWNING_SIDE) {\n\t\t\treturn undefined\n\t\t}\n\t\tthrow e\n\t}\n}\n\nexport const getColumnType = (schema: Model.Schema, entity: Model.Entity, fieldName: string): string => {\n\treturn acceptFieldVisitor(schema, entity, fieldName, {\n\t\t// TODO solve enum handling properly maybe we should distinguish between domain and column type\n\t\tvisitColumn: ({ column }) => (column.type === Model.ColumnType.Enum ? 'text' : column.columnType),\n\t\tvisitRelation: ({ entity, relation, targetEntity }) => {\n\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\treturn getColumnType(schema, targetEntity, targetEntity.primary)\n\t\t\t}\n\t\t\tthrow new ModelError(\n\t\t\t\tModelErrorCode.NOT_OWNING_SIDE,\n\t\t\t\t`Field ${relation.name} of entity ${entity.name} is not an owning side`,\n\t\t\t)\n\t\t},\n\t})\n}\n\nexport const getTargetEntity = (\n\tschema: Model.Schema,\n\tentity: Model.Entity,\n\trelationName: string,\n): Model.Entity | null => {\n\treturn acceptFieldVisitor(schema, entity, relationName, {\n\t\tvisitColumn: () => null,\n\t\tvisitRelation: ({ targetEntity }) => targetEntity,\n\t})\n}\n\nexport const acceptEveryFieldVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\tvisitor: Model.FieldVisitor<T>,\n): { [fieldName: string]: T } => {\n\tconst entityObj: Model.Entity = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst result: { [fieldName: string]: T } = {}\n\tfor (const field in entityObj.fields) {\n\t\tresult[field] = acceptFieldVisitor(schema, entityObj, field, visitor)\n\t}\n\treturn result\n}\n\nexport const acceptFieldVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\tfield: string | Model.AnyField,\n\tvisitor: Model.FieldVisitor<T>,\n): T => {\n\tconst entityObj: Model.Entity = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst fieldObj: Model.AnyField = typeof field === 'string' ? entityObj.fields[field] : field\n\tif (!fieldObj) {\n\t\tthrow createFieldNotFoundError(entityObj.name, typeof field === 'string' ? field : 'unknown')\n\t}\n\n\tif (isIt<Model.AnyColumn>(fieldObj, 'columnType')) {\n\t\treturn visitor.visitColumn({\n\t\t\tentity: entityObj,\n\t\t\tcolumn: fieldObj,\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationVisitor<T>>(visitor, 'visitRelation')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, {\n\t\t\tvisitManyHasManyInverse: visitor.visitRelation.bind(visitor),\n\t\t\tvisitManyHasManyOwning: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasMany: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasOneInverse: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasOneOwning: visitor.visitRelation.bind(visitor),\n\t\t\tvisitManyHasOne: visitor.visitRelation.bind(visitor),\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationByGenericTypeVisitor<T>>(visitor, 'visitHasMany')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, {\n\t\t\tvisitManyHasManyInverse: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitManyHasManyOwning: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitOneHasMany: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitOneHasOneInverse: visitor.visitHasOne.bind(visitor),\n\t\t\tvisitOneHasOneOwning: visitor.visitHasOne.bind(visitor),\n\t\t\tvisitManyHasOne: visitor.visitHasOne.bind(visitor),\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationByTypeVisitor<T>>(visitor, 'visitManyHasManyInverse')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, visitor)\n\t}\n\n\tthrow new Error()\n}\n\nexport const acceptRelationTypeVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\trelation: string | Model.AnyRelation,\n\tvisitor: Model.RelationByTypeVisitor<T>,\n): T => {\n\tconst entityObj = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst relationObj: Model.AnyField = typeof relation === 'string' ? entityObj.fields[relation] : relation\n\tif (!relationObj) {\n\t\tthrow createFieldNotFoundError(entityObj.name, typeof relation === 'string' ? relation : 'unknown')\n\t}\n\n\tif (!isRelation(relationObj)) {\n\t\tthrow new ModelError(\n\t\t\tModelErrorCode.NOT_RELATION,\n\t\t\t`Field ${relationObj.name} of entity ${entityObj.name} is not a relation`,\n\t\t)\n\t}\n\n\tconst targetEntity = getEntity(schema, relationObj.target)\n\n\tif (isInverseRelation(relationObj)) {\n\t\tconst targetRelation = targetEntity.fields[relationObj.ownedBy]\n\t\tswitch (relationObj.type) {\n\t\t\tcase Model.RelationType.ManyHasMany:\n\t\t\t\treturn visitor.visitManyHasManyInverse({\n\t\t\t\t\ttype: 'manyHasManyInverse',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasManyOwningRelation,\n\t\t\t\t},\n\t\t\t\t)\n\t\t\tcase Model.RelationType.OneHasOne:\n\t\t\t\treturn visitor.visitOneHasOneInverse({\n\t\t\t\t\ttype: 'oneHasOneInverse',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasOneOwningRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.OneHasMany:\n\t\t\t\treturn visitor.visitOneHasMany({\n\t\t\t\t\ttype: 'oneHasMany',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasOneRelation,\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\treturn assertNever(relationObj)\n\t\t}\n\t} else if (isOwningRelation(relationObj)) {\n\t\tconst targetRelation = relationObj.inversedBy ? targetEntity.fields[relationObj.inversedBy] : null\n\n\t\tswitch (relationObj.type) {\n\t\t\tcase Model.RelationType.ManyHasMany:\n\t\t\t\treturn visitor.visitManyHasManyOwning({\n\t\t\t\t\ttype: 'manyHasManyOwning',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasManyInverseRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.OneHasOne:\n\t\t\t\treturn visitor.visitOneHasOneOwning({\n\t\t\t\t\ttype: 'oneHasOneOwning',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasOneInverseRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.ManyHasOne:\n\t\t\t\treturn visitor.visitManyHasOne({\n\t\t\t\t\ttype: 'manyHasOne',\n\t\t\t\t\tentity: entityObj, //\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasManyRelation,\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\treturn assertNever(relationObj)\n\t\t}\n\t}\n\n\tthrow new Error('Invalid relation type')\n}\n\nexport const isRelation = (field: Model.AnyField): field is Model.AnyRelation => {\n\treturn isIt<Model.Relation>(field, 'target')\n}\n\nexport const isInverseRelation = (relation: Model.Relation): relation is Model.InverseRelation => {\n\treturn (relation as Model.InverseRelation).ownedBy !== undefined\n}\n\nexport const isOwningRelation = (relation: Model.Relation): relation is Model.OwningRelation => {\n\treturn !isInverseRelation(relation)\n}\n\nexport const isColumn = (field: Model.AnyField): field is Model.AnyColumn => isIt<Model.AnyColumn>(field, 'columnType')\n\nexport const emptyModelSchema: Model.Schema = { entities: {}, enums: {} }\n"],"names":["ModelErrorCode","entity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"modelUtils.js","sources":["../../../../../packages/schema-utils/src/model/modelUtils.ts"],"sourcesContent":["import { assertNever, isIt } from '../utils'\nimport { Model } from '@contember/schema'\n\nexport enum ModelErrorCode {\n\tENTITY_NOT_FOUND = 'entityNotFound',\n\tFIELD_NOT_FOUND = 'fieldNotFound',\n\tNOT_RELATION = 'notRelation',\n\tNOT_OWNING_SIDE = 'notOwningSide',\n}\n\nexport class ModelError extends Error {\n\tconstructor(public readonly code: ModelErrorCode, message: string) {\n\t\tsuper(message)\n\t}\n}\n\nconst createEntityNotFoundError = (entityName: string) =>\n\tnew ModelError(ModelErrorCode.ENTITY_NOT_FOUND, `Entity ${entityName} not found`)\n\nconst createFieldNotFoundError = (entityName: string, fieldName: string) =>\n\tnew ModelError(ModelErrorCode.FIELD_NOT_FOUND, `Field ${fieldName} of entity ${entityName} not found`)\n\nexport const getEntity = (schema: Model.Schema, entityName: string): Model.Entity => {\n\tconst entity = schema.entities[entityName]\n\tif (!entity) {\n\t\tthrow createEntityNotFoundError(entityName)\n\t}\n\treturn entity\n}\n\nexport const getField = (entity: Model.Entity, fieldName: string): Model.AnyField => {\n\tconst field = entity.fields[fieldName]\n\tif (!field) {\n\t\tthrow createFieldNotFoundError(entity.name, fieldName)\n\t}\n\treturn field\n}\n\nexport const getColumnName = (schema: Model.Schema, entity: Model.Entity, fieldName: string) => {\n\treturn acceptFieldVisitor(schema, entity, fieldName, {\n\t\tvisitColumn: ({ column }) => column.columnName,\n\t\tvisitRelation: ({ entity, relation }) => {\n\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\treturn relation.joiningColumn.columnName\n\t\t\t}\n\t\t\tthrow new ModelError(\n\t\t\t\tModelErrorCode.NOT_OWNING_SIDE,\n\t\t\t\t`Field ${relation.name} of entity ${entity.name} is not an owning side`,\n\t\t\t)\n\t\t},\n\t})\n}\n\nexport const tryGetColumnName = (schema: Model.Schema, entity: Model.Entity, fieldName: string) => {\n\ttry {\n\t\treturn getColumnName(schema, entity, fieldName)\n\t} catch (e) {\n\t\tif (e instanceof ModelError && e.code === ModelErrorCode.NOT_OWNING_SIDE) {\n\t\t\treturn undefined\n\t\t}\n\t\tthrow e\n\t}\n}\n\nexport const getColumnType = (schema: Model.Schema, entity: Model.Entity, fieldName: string): string => {\n\treturn acceptFieldVisitor(schema, entity, fieldName, {\n\t\t// TODO solve enum handling properly maybe we should distinguish between domain and column type\n\t\tvisitColumn: ({ column }) => (column.type === Model.ColumnType.Enum ? 'text' : column.columnType) + (column.list ? '[]' : ''),\n\t\tvisitRelation: ({ entity, relation, targetEntity }) => {\n\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\treturn getColumnType(schema, targetEntity, targetEntity.primary)\n\t\t\t}\n\t\t\tthrow new ModelError(\n\t\t\t\tModelErrorCode.NOT_OWNING_SIDE,\n\t\t\t\t`Field ${relation.name} of entity ${entity.name} is not an owning side`,\n\t\t\t)\n\t\t},\n\t})\n}\n\nexport const getTargetEntity = (\n\tschema: Model.Schema,\n\tentity: Model.Entity,\n\trelationName: string,\n): Model.Entity | null => {\n\treturn acceptFieldVisitor(schema, entity, relationName, {\n\t\tvisitColumn: () => null,\n\t\tvisitRelation: ({ targetEntity }) => targetEntity,\n\t})\n}\n\nexport const acceptEveryFieldVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\tvisitor: Model.FieldVisitor<T>,\n): { [fieldName: string]: T } => {\n\tconst entityObj: Model.Entity = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst result: { [fieldName: string]: T } = {}\n\tfor (const field in entityObj.fields) {\n\t\tresult[field] = acceptFieldVisitor(schema, entityObj, field, visitor)\n\t}\n\treturn result\n}\n\nexport const acceptFieldVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\tfield: string | Model.AnyField,\n\tvisitor: Model.FieldVisitor<T>,\n): T => {\n\tconst entityObj: Model.Entity = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst fieldObj: Model.AnyField = typeof field === 'string' ? entityObj.fields[field] : field\n\tif (!fieldObj) {\n\t\tthrow createFieldNotFoundError(entityObj.name, typeof field === 'string' ? field : 'unknown')\n\t}\n\n\tif (isIt<Model.AnyColumn>(fieldObj, 'columnType')) {\n\t\treturn visitor.visitColumn({\n\t\t\tentity: entityObj,\n\t\t\tcolumn: fieldObj,\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationVisitor<T>>(visitor, 'visitRelation')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, {\n\t\t\tvisitManyHasManyInverse: visitor.visitRelation.bind(visitor),\n\t\t\tvisitManyHasManyOwning: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasMany: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasOneInverse: visitor.visitRelation.bind(visitor),\n\t\t\tvisitOneHasOneOwning: visitor.visitRelation.bind(visitor),\n\t\t\tvisitManyHasOne: visitor.visitRelation.bind(visitor),\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationByGenericTypeVisitor<T>>(visitor, 'visitHasMany')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, {\n\t\t\tvisitManyHasManyInverse: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitManyHasManyOwning: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitOneHasMany: visitor.visitHasMany.bind(visitor),\n\t\t\tvisitOneHasOneInverse: visitor.visitHasOne.bind(visitor),\n\t\t\tvisitOneHasOneOwning: visitor.visitHasOne.bind(visitor),\n\t\t\tvisitManyHasOne: visitor.visitHasOne.bind(visitor),\n\t\t})\n\t}\n\n\tif (isIt<Model.ColumnVisitor<T> & Model.RelationByTypeVisitor<T>>(visitor, 'visitManyHasManyInverse')) {\n\t\treturn acceptRelationTypeVisitor(schema, entityObj, fieldObj, visitor)\n\t}\n\n\tthrow new Error()\n}\n\nexport const acceptRelationTypeVisitor = <T>(\n\tschema: Model.Schema,\n\tentity: string | Model.Entity,\n\trelation: string | Model.AnyRelation,\n\tvisitor: Model.RelationByTypeVisitor<T>,\n): T => {\n\tconst entityObj = typeof entity === 'string' ? getEntity(schema, entity) : entity\n\n\tconst relationObj: Model.AnyField = typeof relation === 'string' ? entityObj.fields[relation] : relation\n\tif (!relationObj) {\n\t\tthrow createFieldNotFoundError(entityObj.name, typeof relation === 'string' ? relation : 'unknown')\n\t}\n\n\tif (!isRelation(relationObj)) {\n\t\tthrow new ModelError(\n\t\t\tModelErrorCode.NOT_RELATION,\n\t\t\t`Field ${relationObj.name} of entity ${entityObj.name} is not a relation`,\n\t\t)\n\t}\n\n\tconst targetEntity = getEntity(schema, relationObj.target)\n\n\tif (isInverseRelation(relationObj)) {\n\t\tconst targetRelation = targetEntity.fields[relationObj.ownedBy]\n\t\tswitch (relationObj.type) {\n\t\t\tcase Model.RelationType.ManyHasMany:\n\t\t\t\treturn visitor.visitManyHasManyInverse({\n\t\t\t\t\ttype: 'manyHasManyInverse',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasManyOwningRelation,\n\t\t\t\t},\n\t\t\t\t)\n\t\t\tcase Model.RelationType.OneHasOne:\n\t\t\t\treturn visitor.visitOneHasOneInverse({\n\t\t\t\t\ttype: 'oneHasOneInverse',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasOneOwningRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.OneHasMany:\n\t\t\t\treturn visitor.visitOneHasMany({\n\t\t\t\t\ttype: 'oneHasMany',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasOneRelation,\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\treturn assertNever(relationObj)\n\t\t}\n\t} else if (isOwningRelation(relationObj)) {\n\t\tconst targetRelation = relationObj.inversedBy ? targetEntity.fields[relationObj.inversedBy] : null\n\n\t\tswitch (relationObj.type) {\n\t\t\tcase Model.RelationType.ManyHasMany:\n\t\t\t\treturn visitor.visitManyHasManyOwning({\n\t\t\t\t\ttype: 'manyHasManyOwning',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.ManyHasManyInverseRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.OneHasOne:\n\t\t\t\treturn visitor.visitOneHasOneOwning({\n\t\t\t\t\ttype: 'oneHasOneOwning',\n\t\t\t\t\tentity: entityObj,\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasOneInverseRelation,\n\t\t\t\t})\n\t\t\tcase Model.RelationType.ManyHasOne:\n\t\t\t\treturn visitor.visitManyHasOne({\n\t\t\t\t\ttype: 'manyHasOne',\n\t\t\t\t\tentity: entityObj, //\n\t\t\t\t\trelation: relationObj,\n\t\t\t\t\ttargetEntity: targetEntity,\n\t\t\t\t\ttargetRelation: targetRelation as Model.OneHasManyRelation,\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\treturn assertNever(relationObj)\n\t\t}\n\t}\n\n\tthrow new Error('Invalid relation type')\n}\n\nexport const isRelation = (field: Model.AnyField): field is Model.AnyRelation => {\n\treturn isIt<Model.Relation>(field, 'target')\n}\n\nexport const isInverseRelation = (relation: Model.Relation): relation is Model.InverseRelation => {\n\treturn (relation as Model.InverseRelation).ownedBy !== undefined\n}\n\nexport const isOwningRelation = (relation: Model.Relation): relation is Model.OwningRelation => {\n\treturn !isInverseRelation(relation)\n}\n\nexport const isColumn = (field: Model.AnyField): field is Model.AnyColumn => isIt<Model.AnyColumn>(field, 'columnType')\n\nexport const emptyModelSchema: Model.Schema = { entities: {}, enums: {} }\n"],"names":["ModelErrorCode","entity"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveDefaultColumnType.cjs","sources":["../../../../../packages/schema-utils/src/model/resolveDefaultColumnType.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { assertNever } from '../utils'\n\nexport const resolveDefaultColumnType = (type: Exclude<Model.ColumnType, Model.ColumnType.Enum>): string => {\n\tswitch (type) {\n\t\tcase Model.ColumnType.Int:\n\t\t\treturn 'integer'\n\t\tcase Model.ColumnType.Double:\n\t\t\treturn 'double precision'\n\t\tcase Model.ColumnType.String:\n\t\t\treturn 'text'\n\t\tcase Model.ColumnType.Uuid:\n\t\t\treturn 'uuid'\n\t\tcase Model.ColumnType.Bool:\n\t\t\treturn 'boolean'\n\t\tcase Model.ColumnType.DateTime:\n\t\t\treturn 'timestamptz'\n\t\tcase Model.ColumnType.Date:\n\t\t\treturn 'date'\n\t\tcase Model.ColumnType.Json:\n\t\t\treturn 'jsonb'\n\t\tdefault:\n\t\t\treturn assertNever(type)\n\t}\n}\n"],"names":["Model","assertNever"],"mappings":";;;;AAGa,MAAA,2BAA2B,CAAC,SAAmE;AAC3G,UAAQ,MAAM;AAAA,IACb,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR;AACC,aAAOC,wBAAgB;AAAA,EAAA;AAE1B;;"}
|
|
1
|
+
{"version":3,"file":"resolveDefaultColumnType.cjs","sources":["../../../../../packages/schema-utils/src/model/resolveDefaultColumnType.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { assertNever } from '../utils'\n\nexport const resolveDefaultColumnType = (type: Exclude<Model.ColumnType, Model.ColumnType.Enum>): string => {\n\tswitch (type) {\n\t\tcase Model.ColumnType.Int:\n\t\t\treturn 'integer'\n\t\tcase Model.ColumnType.Double:\n\t\t\treturn 'double precision'\n\t\tcase Model.ColumnType.String:\n\t\t\treturn 'text'\n\t\tcase Model.ColumnType.Uuid:\n\t\t\treturn 'uuid'\n\t\tcase Model.ColumnType.Bool:\n\t\t\treturn 'boolean'\n\t\tcase Model.ColumnType.DateTime:\n\t\t\treturn 'timestamptz'\n\t\tcase Model.ColumnType.Date:\n\t\t\treturn 'date'\n\t\tcase Model.ColumnType.Time:\n\t\t\treturn 'time'\n\t\tcase Model.ColumnType.Json:\n\t\t\treturn 'jsonb'\n\t\tdefault:\n\t\t\treturn assertNever(type)\n\t}\n}\n"],"names":["Model","assertNever"],"mappings":";;;;AAGa,MAAA,2BAA2B,CAAC,SAAmE;AAC3G,UAAQ,MAAM;AAAA,IACb,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAKA,OAAAA,MAAM,WAAW;AACd,aAAA;AAAA,IACR;AACC,aAAOC,wBAAgB;AAAA,EAAA;AAE1B;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveDefaultColumnType.js","sources":["../../../../../packages/schema-utils/src/model/resolveDefaultColumnType.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { assertNever } from '../utils'\n\nexport const resolveDefaultColumnType = (type: Exclude<Model.ColumnType, Model.ColumnType.Enum>): string => {\n\tswitch (type) {\n\t\tcase Model.ColumnType.Int:\n\t\t\treturn 'integer'\n\t\tcase Model.ColumnType.Double:\n\t\t\treturn 'double precision'\n\t\tcase Model.ColumnType.String:\n\t\t\treturn 'text'\n\t\tcase Model.ColumnType.Uuid:\n\t\t\treturn 'uuid'\n\t\tcase Model.ColumnType.Bool:\n\t\t\treturn 'boolean'\n\t\tcase Model.ColumnType.DateTime:\n\t\t\treturn 'timestamptz'\n\t\tcase Model.ColumnType.Date:\n\t\t\treturn 'date'\n\t\tcase Model.ColumnType.Json:\n\t\t\treturn 'jsonb'\n\t\tdefault:\n\t\t\treturn assertNever(type)\n\t}\n}\n"],"names":[],"mappings":";;AAGa,MAAA,2BAA2B,CAAC,SAAmE;AAC3G,UAAQ,MAAM;AAAA,IACb,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR;AACC,aAAO,YAAgB;AAAA,EAAA;AAE1B;"}
|
|
1
|
+
{"version":3,"file":"resolveDefaultColumnType.js","sources":["../../../../../packages/schema-utils/src/model/resolveDefaultColumnType.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { assertNever } from '../utils'\n\nexport const resolveDefaultColumnType = (type: Exclude<Model.ColumnType, Model.ColumnType.Enum>): string => {\n\tswitch (type) {\n\t\tcase Model.ColumnType.Int:\n\t\t\treturn 'integer'\n\t\tcase Model.ColumnType.Double:\n\t\t\treturn 'double precision'\n\t\tcase Model.ColumnType.String:\n\t\t\treturn 'text'\n\t\tcase Model.ColumnType.Uuid:\n\t\t\treturn 'uuid'\n\t\tcase Model.ColumnType.Bool:\n\t\t\treturn 'boolean'\n\t\tcase Model.ColumnType.DateTime:\n\t\t\treturn 'timestamptz'\n\t\tcase Model.ColumnType.Date:\n\t\t\treturn 'date'\n\t\tcase Model.ColumnType.Time:\n\t\t\treturn 'time'\n\t\tcase Model.ColumnType.Json:\n\t\t\treturn 'jsonb'\n\t\tdefault:\n\t\t\treturn assertNever(type)\n\t}\n}\n"],"names":[],"mappings":";;AAGa,MAAA,2BAA2B,CAAC,SAAmE;AAC3G,UAAQ,MAAM;AAAA,IACb,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR,KAAK,MAAM,WAAW;AACd,aAAA;AAAA,IACR;AACC,aAAO,YAAgB;AAAA,EAAA;AAE1B;"}
|
|
@@ -24,6 +24,7 @@ const normalizeSchema = (schema$1) => {
|
|
|
24
24
|
content: {
|
|
25
25
|
export: true,
|
|
26
26
|
import: true,
|
|
27
|
+
refreshMaterializedView: true,
|
|
27
28
|
...adminRoleDefinition.content
|
|
28
29
|
},
|
|
29
30
|
system: {
|
|
@@ -47,6 +48,7 @@ const normalizeSchema = (schema$1) => {
|
|
|
47
48
|
content: {
|
|
48
49
|
export: true,
|
|
49
50
|
import: true,
|
|
51
|
+
refreshMaterializedView: true,
|
|
50
52
|
...contentAdminRoleDefinition.content
|
|
51
53
|
},
|
|
52
54
|
system: {
|