@contember/schema-definition 2.1.0-beta.2 → 2.1.0-rc.2
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/src/createSchema.cjs +2 -1
- package/dist/development/src/createSchema.cjs.map +1 -1
- package/dist/development/src/createSchema.js +2 -1
- package/dist/development/src/createSchema.js.map +1 -1
- package/dist/development/src/strict.cjs +20 -5
- package/dist/development/src/strict.cjs.map +1 -1
- package/dist/development/src/strict.js +20 -5
- package/dist/development/src/strict.js.map +1 -1
- package/dist/production/src/createSchema.cjs +2 -1
- package/dist/production/src/createSchema.cjs.map +1 -1
- package/dist/production/src/createSchema.js +2 -1
- package/dist/production/src/createSchema.js.map +1 -1
- package/dist/production/src/strict.cjs +20 -5
- package/dist/production/src/strict.cjs.map +1 -1
- package/dist/production/src/strict.js +20 -5
- package/dist/production/src/strict.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/createSchema.d.ts.map +1 -1
- package/dist/types/strict.d.ts +2 -0
- package/dist/types/strict.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/createSchema.ts +2 -1
- package/src/strict.ts +29 -4
- package/tests/cases/unit/createSchema.test.ts +50 -1
|
@@ -15,12 +15,13 @@ const createSchema = (definitions, modifyCallback, options) => {
|
|
|
15
15
|
strictDefinitionValidator,
|
|
16
16
|
defaultCollation: options?.defaultCollation
|
|
17
17
|
});
|
|
18
|
+
strictDefinitionValidator.validateModel(model);
|
|
18
19
|
const validation = index$1.parseDefinition(definitions);
|
|
19
20
|
const acl = index$2.createAcl(definitions, model);
|
|
20
21
|
const actions = index$3.createActions(definitions);
|
|
21
22
|
const schema = { ...schemaUtils.emptySchema, model, validation, acl, actions };
|
|
22
23
|
if (strictDefinitionValidator.warnings.length > 0) {
|
|
23
|
-
throw `Strict schema validation failed:
|
|
24
|
+
throw `Strict schema validation failed:
|
|
24
25
|
${strictDefinitionValidator.warnings.map((it) => `- ${it.message}`).join("\n")}`;
|
|
25
26
|
}
|
|
26
27
|
return modifyCallback ? modifyCallback(schema) : schema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSchema.cjs","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictDefinitionValidator, StrictOptions } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed
|
|
1
|
+
{"version":3,"file":"createSchema.cjs","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictDefinitionValidator, StrictOptions } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tstrictDefinitionValidator.validateModel(model)\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed:\\n${strictDefinitionValidator.warnings.map(it => `- ${it.message}`).join('\\n')}`\n\t}\n\n\treturn modifyCallback ? modifyCallback(schema) : schema\n}\n"],"names":["allStrict","StrictDefinitionValidator","SchemaDefinition.createModel","InputValidation.parseDefinition","AclDefinition.createAcl","ActionsDefinition.createActions","emptySchema"],"mappings":";;;;;;;;;;AAQO,MAAM,eAAe,CAAC,aAAkC,gBAA6C,YAG9F;AACb,QAAM,gBAAgB,SAAS,WAAW,OAAOA,mBAAa,SAAS,UAAU,CAAA;AACjF,QAAM,4BAA4B,IAAIC,OAAAA,0BAA0B,aAAa;AAE7E,QAAM,QAAQC,MAAAA,YAA6B,aAAa;AAAA,IACvD;AAAA,IACA,kBAAkB,SAAS;AAAA,EAAA,CAC3B;AACD,4BAA0B,cAAc,KAAK;AAC7C,QAAM,aAAaC,QAAAA,gBAAgC,WAAW;AAC9D,QAAM,MAAMC,QAAAA,UAAwB,aAAa,KAAK;AACtD,QAAM,UAAUC,QAAAA,cAAgC,WAAW;AAC3D,QAAM,SAAS,EAAE,GAAGC,YAAAA,aAAa,OAAO,YAAY,KAAK,QAAA;AAEzD,MAAI,0BAA0B,SAAS,SAAS,GAAG;AAClD,UAAM;AAAA,EAAqC,0BAA0B,SAAS,IAAI,CAAA,OAAM,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EACtH;AAEA,SAAO,iBAAiB,eAAe,MAAM,IAAI;AAClD;;"}
|
|
@@ -13,12 +13,13 @@ const createSchema = (definitions, modifyCallback, options) => {
|
|
|
13
13
|
strictDefinitionValidator,
|
|
14
14
|
defaultCollation: options?.defaultCollation
|
|
15
15
|
});
|
|
16
|
+
strictDefinitionValidator.validateModel(model);
|
|
16
17
|
const validation = parseDefinition(definitions);
|
|
17
18
|
const acl = createAcl(definitions, model);
|
|
18
19
|
const actions = createActions(definitions);
|
|
19
20
|
const schema = { ...emptySchema, model, validation, acl, actions };
|
|
20
21
|
if (strictDefinitionValidator.warnings.length > 0) {
|
|
21
|
-
throw `Strict schema validation failed:
|
|
22
|
+
throw `Strict schema validation failed:
|
|
22
23
|
${strictDefinitionValidator.warnings.map((it) => `- ${it.message}`).join("\n")}`;
|
|
23
24
|
}
|
|
24
25
|
return modifyCallback ? modifyCallback(schema) : schema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSchema.js","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictDefinitionValidator, StrictOptions } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed
|
|
1
|
+
{"version":3,"file":"createSchema.js","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictDefinitionValidator, StrictOptions } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tstrictDefinitionValidator.validateModel(model)\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed:\\n${strictDefinitionValidator.warnings.map(it => `- ${it.message}`).join('\\n')}`\n\t}\n\n\treturn modifyCallback ? modifyCallback(schema) : schema\n}\n"],"names":["SchemaDefinition.createModel","InputValidation.parseDefinition","AclDefinition.createAcl","ActionsDefinition.createActions"],"mappings":";;;;;;;;AAQO,MAAM,eAAe,CAAC,aAAkC,gBAA6C,YAG9F;AACb,QAAM,gBAAgB,SAAS,WAAW,OAAO,YAAa,SAAS,UAAU,CAAA;AACjF,QAAM,4BAA4B,IAAI,0BAA0B,aAAa;AAE7E,QAAM,QAAQA,YAA6B,aAAa;AAAA,IACvD;AAAA,IACA,kBAAkB,SAAS;AAAA,EAAA,CAC3B;AACD,4BAA0B,cAAc,KAAK;AAC7C,QAAM,aAAaC,gBAAgC,WAAW;AAC9D,QAAM,MAAMC,UAAwB,aAAa,KAAK;AACtD,QAAM,UAAUC,cAAgC,WAAW;AAC3D,QAAM,SAAS,EAAE,GAAG,aAAa,OAAO,YAAY,KAAK,QAAA;AAEzD,MAAI,0BAA0B,SAAS,SAAS,GAAG;AAClD,UAAM;AAAA,EAAqC,0BAA0B,SAAS,IAAI,CAAA,OAAM,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EACtH;AAEA,SAAO,iBAAiB,eAAe,MAAM,IAAI;AAClD;"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
5
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
6
|
const allStrict = {
|
|
7
7
|
requireOnDelete: true,
|
|
8
8
|
requireInverseSide: true
|
|
@@ -11,6 +11,7 @@ class StrictDefinitionValidator {
|
|
|
11
11
|
constructor(options) {
|
|
12
12
|
this.options = options;
|
|
13
13
|
__publicField(this, "warnings", []);
|
|
14
|
+
__publicField(this, "onDeleteValidations", []);
|
|
14
15
|
}
|
|
15
16
|
validateInverseSide(entityName, field, definition) {
|
|
16
17
|
if (!definition.inversedBy && this.options.requireInverseSide) {
|
|
@@ -18,10 +19,24 @@ class StrictDefinitionValidator {
|
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
validateOnCascade(entityName, field, definition) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
this.onDeleteValidations.push({ entityName, field, hasOnDelete: definition.onDelete !== void 0 });
|
|
23
|
+
}
|
|
24
|
+
validateModel(model) {
|
|
25
|
+
for (const { entityName, field, hasOnDelete } of this.onDeleteValidations) {
|
|
26
|
+
const isView = model.entities[entityName]?.view !== void 0;
|
|
27
|
+
if (isView) {
|
|
28
|
+
if (hasOnDelete) {
|
|
29
|
+
this.registerWarning(
|
|
30
|
+
`${entityName}.${field}: onDelete behaviour must not be set on a relation of a view entity. Views are read-only and have no delete semantics.`
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (!hasOnDelete && this.options.requireOnDelete) {
|
|
36
|
+
this.registerWarning(
|
|
37
|
+
`${entityName}.${field}: onDelete behaviour is not set. Use one of cascadeOnDelete(), setNullOnDelete() or restrictOnDelete().`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
25
40
|
}
|
|
26
41
|
}
|
|
27
42
|
registerWarning(message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict.cjs","sources":["../../../../packages/schema-definition/src/strict.ts"],"sourcesContent":["import { Model } from '@contember/schema'\n\nexport type StrictOptions = {\n\trequireOnDelete?: boolean\n\trequireInverseSide?: boolean\n}\n\nexport const allStrict: StrictOptions = {\n\trequireOnDelete: true,\n\trequireInverseSide: true,\n}\n\nexport type Warning = { message: string }\n\nexport class StrictDefinitionValidator {\n\tpublic readonly warnings: Warning[] = []\n\n\tconstructor(\n\t\tprivate readonly options: StrictOptions,\n\t) {\n\t}\n\n\tpublic validateInverseSide(entityName: string, field: string, definition: { inversedBy?: string }): void {\n\t\tif (!definition.inversedBy && this.options.requireInverseSide) {\n\t\t\tthis.registerWarning(`${entityName}.${field}: inverse side of the relation is not defined.`)\n\t\t}\n\t}\n\n\tpublic validateOnCascade(entityName: string, field: string, definition: { onDelete?: Model.OnDelete }): void {\n\t\
|
|
1
|
+
{"version":3,"file":"strict.cjs","sources":["../../../../packages/schema-definition/src/strict.ts"],"sourcesContent":["import { Model } from '@contember/schema'\n\nexport type StrictOptions = {\n\trequireOnDelete?: boolean\n\trequireInverseSide?: boolean\n}\n\nexport const allStrict: StrictOptions = {\n\trequireOnDelete: true,\n\trequireInverseSide: true,\n}\n\nexport type Warning = { message: string }\n\ntype OnDeleteValidation = {\n\tentityName: string\n\tfield: string\n\thasOnDelete: boolean\n}\n\nexport class StrictDefinitionValidator {\n\tpublic readonly warnings: Warning[] = []\n\n\tprivate readonly onDeleteValidations: OnDeleteValidation[] = []\n\n\tconstructor(\n\t\tprivate readonly options: StrictOptions,\n\t) {\n\t}\n\n\tpublic validateInverseSide(entityName: string, field: string, definition: { inversedBy?: string }): void {\n\t\tif (!definition.inversedBy && this.options.requireInverseSide) {\n\t\t\tthis.registerWarning(`${entityName}.${field}: inverse side of the relation is not defined.`)\n\t\t}\n\t}\n\n\tpublic validateOnCascade(entityName: string, field: string, definition: { onDelete?: Model.OnDelete }): void {\n\t\t// View entities are read-only and have no real delete semantics, so onDelete validation is\n\t\t// deferred to validateModel() where we know which entities are views.\n\t\tthis.onDeleteValidations.push({ entityName, field, hasOnDelete: definition.onDelete !== undefined })\n\t}\n\n\tpublic validateModel(model: Model.Schema): void {\n\t\tfor (const { entityName, field, hasOnDelete } of this.onDeleteValidations) {\n\t\t\tconst isView = model.entities[entityName]?.view !== undefined\n\t\t\tif (isView) {\n\t\t\t\tif (hasOnDelete) {\n\t\t\t\t\tthis.registerWarning(\n\t\t\t\t\t\t`${entityName}.${field}: onDelete behaviour must not be set on a relation of a view entity. Views are read-only and have no delete semantics.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!hasOnDelete && this.options.requireOnDelete) {\n\t\t\t\tthis.registerWarning(\n\t\t\t\t\t`${entityName}.${field}: onDelete behaviour is not set. Use one of cascadeOnDelete(), setNullOnDelete() or restrictOnDelete().`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic registerWarning(message: string): void {\n\t\tthis.warnings.push({ message })\n\t}\n}\n"],"names":[],"mappings":";;;;;AAOO,MAAM,YAA2B;AAAA,EACvC,iBAAiB;AAAA,EACjB,oBAAoB;AACrB;AAUO,MAAM,0BAA0B;AAAA,EAKtC,YACkB,SAChB;AADgB,SAAA,UAAA;AALlB,kBAAA,MAAgB,YAAsB,EAAC;AAEvC,kBAAA,MAAiB,uBAA4C,EAAC;AAAA,EAK9D;AAAA,EAEO,oBAAoB,YAAoB,OAAe,YAA2C;AACxG,QAAI,CAAC,WAAW,cAAc,KAAK,QAAQ,oBAAoB;AAC9D,WAAK,gBAAgB,GAAG,UAAU,IAAI,KAAK,gDAAgD;AAAA,IAC5F;AAAA,EACD;AAAA,EAEO,kBAAkB,YAAoB,OAAe,YAAiD;AAG5G,SAAK,oBAAoB,KAAK,EAAE,YAAY,OAAO,aAAa,WAAW,aAAa,QAAW;AAAA,EACpG;AAAA,EAEO,cAAc,OAA2B;AAC/C,eAAW,EAAE,YAAY,OAAO,YAAA,KAAiB,KAAK,qBAAqB;AAC1E,YAAM,SAAS,MAAM,SAAS,UAAU,GAAG,SAAS;AACpD,UAAI,QAAQ;AACX,YAAI,aAAa;AAChB,eAAK;AAAA,YACJ,GAAG,UAAU,IAAI,KAAK;AAAA,UAAA;AAAA,QAExB;AACA;AAAA,MACD;AACA,UAAI,CAAC,eAAe,KAAK,QAAQ,iBAAiB;AACjD,aAAK;AAAA,UACJ,GAAG,UAAU,IAAI,KAAK;AAAA,QAAA;AAAA,MAExB;AAAA,IACD;AAAA,EACD;AAAA,EAEO,gBAAgB,SAAuB;AAC7C,SAAK,SAAS,KAAK,EAAE,QAAA,CAAS;AAAA,EAC/B;AACD;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
4
|
const allStrict = {
|
|
5
5
|
requireOnDelete: true,
|
|
6
6
|
requireInverseSide: true
|
|
@@ -9,6 +9,7 @@ class StrictDefinitionValidator {
|
|
|
9
9
|
constructor(options) {
|
|
10
10
|
this.options = options;
|
|
11
11
|
__publicField(this, "warnings", []);
|
|
12
|
+
__publicField(this, "onDeleteValidations", []);
|
|
12
13
|
}
|
|
13
14
|
validateInverseSide(entityName, field, definition) {
|
|
14
15
|
if (!definition.inversedBy && this.options.requireInverseSide) {
|
|
@@ -16,10 +17,24 @@ class StrictDefinitionValidator {
|
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
19
|
validateOnCascade(entityName, field, definition) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
this.onDeleteValidations.push({ entityName, field, hasOnDelete: definition.onDelete !== void 0 });
|
|
21
|
+
}
|
|
22
|
+
validateModel(model) {
|
|
23
|
+
for (const { entityName, field, hasOnDelete } of this.onDeleteValidations) {
|
|
24
|
+
const isView = model.entities[entityName]?.view !== void 0;
|
|
25
|
+
if (isView) {
|
|
26
|
+
if (hasOnDelete) {
|
|
27
|
+
this.registerWarning(
|
|
28
|
+
`${entityName}.${field}: onDelete behaviour must not be set on a relation of a view entity. Views are read-only and have no delete semantics.`
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (!hasOnDelete && this.options.requireOnDelete) {
|
|
34
|
+
this.registerWarning(
|
|
35
|
+
`${entityName}.${field}: onDelete behaviour is not set. Use one of cascadeOnDelete(), setNullOnDelete() or restrictOnDelete().`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
23
38
|
}
|
|
24
39
|
}
|
|
25
40
|
registerWarning(message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict.js","sources":["../../../../packages/schema-definition/src/strict.ts"],"sourcesContent":["import { Model } from '@contember/schema'\n\nexport type StrictOptions = {\n\trequireOnDelete?: boolean\n\trequireInverseSide?: boolean\n}\n\nexport const allStrict: StrictOptions = {\n\trequireOnDelete: true,\n\trequireInverseSide: true,\n}\n\nexport type Warning = { message: string }\n\nexport class StrictDefinitionValidator {\n\tpublic readonly warnings: Warning[] = []\n\n\tconstructor(\n\t\tprivate readonly options: StrictOptions,\n\t) {\n\t}\n\n\tpublic validateInverseSide(entityName: string, field: string, definition: { inversedBy?: string }): void {\n\t\tif (!definition.inversedBy && this.options.requireInverseSide) {\n\t\t\tthis.registerWarning(`${entityName}.${field}: inverse side of the relation is not defined.`)\n\t\t}\n\t}\n\n\tpublic validateOnCascade(entityName: string, field: string, definition: { onDelete?: Model.OnDelete }): void {\n\t\
|
|
1
|
+
{"version":3,"file":"strict.js","sources":["../../../../packages/schema-definition/src/strict.ts"],"sourcesContent":["import { Model } from '@contember/schema'\n\nexport type StrictOptions = {\n\trequireOnDelete?: boolean\n\trequireInverseSide?: boolean\n}\n\nexport const allStrict: StrictOptions = {\n\trequireOnDelete: true,\n\trequireInverseSide: true,\n}\n\nexport type Warning = { message: string }\n\ntype OnDeleteValidation = {\n\tentityName: string\n\tfield: string\n\thasOnDelete: boolean\n}\n\nexport class StrictDefinitionValidator {\n\tpublic readonly warnings: Warning[] = []\n\n\tprivate readonly onDeleteValidations: OnDeleteValidation[] = []\n\n\tconstructor(\n\t\tprivate readonly options: StrictOptions,\n\t) {\n\t}\n\n\tpublic validateInverseSide(entityName: string, field: string, definition: { inversedBy?: string }): void {\n\t\tif (!definition.inversedBy && this.options.requireInverseSide) {\n\t\t\tthis.registerWarning(`${entityName}.${field}: inverse side of the relation is not defined.`)\n\t\t}\n\t}\n\n\tpublic validateOnCascade(entityName: string, field: string, definition: { onDelete?: Model.OnDelete }): void {\n\t\t// View entities are read-only and have no real delete semantics, so onDelete validation is\n\t\t// deferred to validateModel() where we know which entities are views.\n\t\tthis.onDeleteValidations.push({ entityName, field, hasOnDelete: definition.onDelete !== undefined })\n\t}\n\n\tpublic validateModel(model: Model.Schema): void {\n\t\tfor (const { entityName, field, hasOnDelete } of this.onDeleteValidations) {\n\t\t\tconst isView = model.entities[entityName]?.view !== undefined\n\t\t\tif (isView) {\n\t\t\t\tif (hasOnDelete) {\n\t\t\t\t\tthis.registerWarning(\n\t\t\t\t\t\t`${entityName}.${field}: onDelete behaviour must not be set on a relation of a view entity. Views are read-only and have no delete semantics.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!hasOnDelete && this.options.requireOnDelete) {\n\t\t\t\tthis.registerWarning(\n\t\t\t\t\t`${entityName}.${field}: onDelete behaviour is not set. Use one of cascadeOnDelete(), setNullOnDelete() or restrictOnDelete().`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic registerWarning(message: string): void {\n\t\tthis.warnings.push({ message })\n\t}\n}\n"],"names":[],"mappings":";;;AAOO,MAAM,YAA2B;AAAA,EACvC,iBAAiB;AAAA,EACjB,oBAAoB;AACrB;AAUO,MAAM,0BAA0B;AAAA,EAKtC,YACkB,SAChB;AADgB,SAAA,UAAA;AALlB,kBAAA,MAAgB,YAAsB,EAAC;AAEvC,kBAAA,MAAiB,uBAA4C,EAAC;AAAA,EAK9D;AAAA,EAEO,oBAAoB,YAAoB,OAAe,YAA2C;AACxG,QAAI,CAAC,WAAW,cAAc,KAAK,QAAQ,oBAAoB;AAC9D,WAAK,gBAAgB,GAAG,UAAU,IAAI,KAAK,gDAAgD;AAAA,IAC5F;AAAA,EACD;AAAA,EAEO,kBAAkB,YAAoB,OAAe,YAAiD;AAG5G,SAAK,oBAAoB,KAAK,EAAE,YAAY,OAAO,aAAa,WAAW,aAAa,QAAW;AAAA,EACpG;AAAA,EAEO,cAAc,OAA2B;AAC/C,eAAW,EAAE,YAAY,OAAO,YAAA,KAAiB,KAAK,qBAAqB;AAC1E,YAAM,SAAS,MAAM,SAAS,UAAU,GAAG,SAAS;AACpD,UAAI,QAAQ;AACX,YAAI,aAAa;AAChB,eAAK;AAAA,YACJ,GAAG,UAAU,IAAI,KAAK;AAAA,UAAA;AAAA,QAExB;AACA;AAAA,MACD;AACA,UAAI,CAAC,eAAe,KAAK,QAAQ,iBAAiB;AACjD,aAAK;AAAA,UACJ,GAAG,UAAU,IAAI,KAAK;AAAA,QAAA;AAAA,MAExB;AAAA,IACD;AAAA,EACD;AAAA,EAEO,gBAAgB,SAAuB;AAC7C,SAAK,SAAS,KAAK,EAAE,QAAA,CAAS;AAAA,EAC/B;AACD;"}
|
|
@@ -15,12 +15,13 @@ const createSchema = (definitions, modifyCallback, options) => {
|
|
|
15
15
|
strictDefinitionValidator,
|
|
16
16
|
defaultCollation: options?.defaultCollation
|
|
17
17
|
});
|
|
18
|
+
strictDefinitionValidator.validateModel(model);
|
|
18
19
|
const validation = index$1.parseDefinition(definitions);
|
|
19
20
|
const acl = index$2.createAcl(definitions, model);
|
|
20
21
|
const actions = index$3.createActions(definitions);
|
|
21
22
|
const schema = { ...schemaUtils.emptySchema, model, validation, acl, actions };
|
|
22
23
|
if (strictDefinitionValidator.warnings.length > 0) {
|
|
23
|
-
throw `Strict schema validation failed:
|
|
24
|
+
throw `Strict schema validation failed:
|
|
24
25
|
${strictDefinitionValidator.warnings.map((it) => `- ${it.message}`).join("\n")}`;
|
|
25
26
|
}
|
|
26
27
|
return modifyCallback ? modifyCallback(schema) : schema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSchema.cjs","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictDefinitionValidator, StrictOptions } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed
|
|
1
|
+
{"version":3,"file":"createSchema.cjs","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictDefinitionValidator, StrictOptions } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tstrictDefinitionValidator.validateModel(model)\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed:\\n${strictDefinitionValidator.warnings.map(it => `- ${it.message}`).join('\\n')}`\n\t}\n\n\treturn modifyCallback ? modifyCallback(schema) : schema\n}\n"],"names":["allStrict","StrictDefinitionValidator","SchemaDefinition.createModel","InputValidation.parseDefinition","AclDefinition.createAcl","ActionsDefinition.createActions","emptySchema"],"mappings":";;;;;;;;;;AAQO,MAAM,eAAe,CAAC,aAAkC,gBAA6C,YAG9F;AACb,QAAM,gBAAgB,SAAS,WAAW,OAAOA,mBAAa,SAAS,UAAU,CAAA;AACjF,QAAM,4BAA4B,IAAIC,OAAAA,0BAA0B,aAAa;AAE7E,QAAM,QAAQC,MAAAA,YAA6B,aAAa;AAAA,IACvD;AAAA,IACA,kBAAkB,SAAS;AAAA,EAAA,CAC3B;AACD,4BAA0B,cAAc,KAAK;AAC7C,QAAM,aAAaC,QAAAA,gBAAgC,WAAW;AAC9D,QAAM,MAAMC,QAAAA,UAAwB,aAAa,KAAK;AACtD,QAAM,UAAUC,QAAAA,cAAgC,WAAW;AAC3D,QAAM,SAAS,EAAE,GAAGC,YAAAA,aAAa,OAAO,YAAY,KAAK,QAAA;AAEzD,MAAI,0BAA0B,SAAS,SAAS,GAAG;AAClD,UAAM;AAAA,EAAqC,0BAA0B,SAAS,IAAI,CAAA,OAAM,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EACtH;AAEA,SAAO,iBAAiB,eAAe,MAAM,IAAI;AAClD;;"}
|
|
@@ -13,12 +13,13 @@ const createSchema = (definitions, modifyCallback, options) => {
|
|
|
13
13
|
strictDefinitionValidator,
|
|
14
14
|
defaultCollation: options?.defaultCollation
|
|
15
15
|
});
|
|
16
|
+
strictDefinitionValidator.validateModel(model);
|
|
16
17
|
const validation = parseDefinition(definitions);
|
|
17
18
|
const acl = createAcl(definitions, model);
|
|
18
19
|
const actions = createActions(definitions);
|
|
19
20
|
const schema = { ...emptySchema, model, validation, acl, actions };
|
|
20
21
|
if (strictDefinitionValidator.warnings.length > 0) {
|
|
21
|
-
throw `Strict schema validation failed:
|
|
22
|
+
throw `Strict schema validation failed:
|
|
22
23
|
${strictDefinitionValidator.warnings.map((it) => `- ${it.message}`).join("\n")}`;
|
|
23
24
|
}
|
|
24
25
|
return modifyCallback ? modifyCallback(schema) : schema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSchema.js","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictDefinitionValidator, StrictOptions } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed
|
|
1
|
+
{"version":3,"file":"createSchema.js","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictDefinitionValidator, StrictOptions } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tstrictDefinitionValidator.validateModel(model)\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed:\\n${strictDefinitionValidator.warnings.map(it => `- ${it.message}`).join('\\n')}`\n\t}\n\n\treturn modifyCallback ? modifyCallback(schema) : schema\n}\n"],"names":["SchemaDefinition.createModel","InputValidation.parseDefinition","AclDefinition.createAcl","ActionsDefinition.createActions"],"mappings":";;;;;;;;AAQO,MAAM,eAAe,CAAC,aAAkC,gBAA6C,YAG9F;AACb,QAAM,gBAAgB,SAAS,WAAW,OAAO,YAAa,SAAS,UAAU,CAAA;AACjF,QAAM,4BAA4B,IAAI,0BAA0B,aAAa;AAE7E,QAAM,QAAQA,YAA6B,aAAa;AAAA,IACvD;AAAA,IACA,kBAAkB,SAAS;AAAA,EAAA,CAC3B;AACD,4BAA0B,cAAc,KAAK;AAC7C,QAAM,aAAaC,gBAAgC,WAAW;AAC9D,QAAM,MAAMC,UAAwB,aAAa,KAAK;AACtD,QAAM,UAAUC,cAAgC,WAAW;AAC3D,QAAM,SAAS,EAAE,GAAG,aAAa,OAAO,YAAY,KAAK,QAAA;AAEzD,MAAI,0BAA0B,SAAS,SAAS,GAAG;AAClD,UAAM;AAAA,EAAqC,0BAA0B,SAAS,IAAI,CAAA,OAAM,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EACtH;AAEA,SAAO,iBAAiB,eAAe,MAAM,IAAI;AAClD;"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
5
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
6
|
const allStrict = {
|
|
7
7
|
requireOnDelete: true,
|
|
8
8
|
requireInverseSide: true
|
|
@@ -11,6 +11,7 @@ class StrictDefinitionValidator {
|
|
|
11
11
|
constructor(options) {
|
|
12
12
|
this.options = options;
|
|
13
13
|
__publicField(this, "warnings", []);
|
|
14
|
+
__publicField(this, "onDeleteValidations", []);
|
|
14
15
|
}
|
|
15
16
|
validateInverseSide(entityName, field, definition) {
|
|
16
17
|
if (!definition.inversedBy && this.options.requireInverseSide) {
|
|
@@ -18,10 +19,24 @@ class StrictDefinitionValidator {
|
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
validateOnCascade(entityName, field, definition) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
this.onDeleteValidations.push({ entityName, field, hasOnDelete: definition.onDelete !== void 0 });
|
|
23
|
+
}
|
|
24
|
+
validateModel(model) {
|
|
25
|
+
for (const { entityName, field, hasOnDelete } of this.onDeleteValidations) {
|
|
26
|
+
const isView = model.entities[entityName]?.view !== void 0;
|
|
27
|
+
if (isView) {
|
|
28
|
+
if (hasOnDelete) {
|
|
29
|
+
this.registerWarning(
|
|
30
|
+
`${entityName}.${field}: onDelete behaviour must not be set on a relation of a view entity. Views are read-only and have no delete semantics.`
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (!hasOnDelete && this.options.requireOnDelete) {
|
|
36
|
+
this.registerWarning(
|
|
37
|
+
`${entityName}.${field}: onDelete behaviour is not set. Use one of cascadeOnDelete(), setNullOnDelete() or restrictOnDelete().`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
25
40
|
}
|
|
26
41
|
}
|
|
27
42
|
registerWarning(message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict.cjs","sources":["../../../../packages/schema-definition/src/strict.ts"],"sourcesContent":["import { Model } from '@contember/schema'\n\nexport type StrictOptions = {\n\trequireOnDelete?: boolean\n\trequireInverseSide?: boolean\n}\n\nexport const allStrict: StrictOptions = {\n\trequireOnDelete: true,\n\trequireInverseSide: true,\n}\n\nexport type Warning = { message: string }\n\nexport class StrictDefinitionValidator {\n\tpublic readonly warnings: Warning[] = []\n\n\tconstructor(\n\t\tprivate readonly options: StrictOptions,\n\t) {\n\t}\n\n\tpublic validateInverseSide(entityName: string, field: string, definition: { inversedBy?: string }): void {\n\t\tif (!definition.inversedBy && this.options.requireInverseSide) {\n\t\t\tthis.registerWarning(`${entityName}.${field}: inverse side of the relation is not defined.`)\n\t\t}\n\t}\n\n\tpublic validateOnCascade(entityName: string, field: string, definition: { onDelete?: Model.OnDelete }): void {\n\t\
|
|
1
|
+
{"version":3,"file":"strict.cjs","sources":["../../../../packages/schema-definition/src/strict.ts"],"sourcesContent":["import { Model } from '@contember/schema'\n\nexport type StrictOptions = {\n\trequireOnDelete?: boolean\n\trequireInverseSide?: boolean\n}\n\nexport const allStrict: StrictOptions = {\n\trequireOnDelete: true,\n\trequireInverseSide: true,\n}\n\nexport type Warning = { message: string }\n\ntype OnDeleteValidation = {\n\tentityName: string\n\tfield: string\n\thasOnDelete: boolean\n}\n\nexport class StrictDefinitionValidator {\n\tpublic readonly warnings: Warning[] = []\n\n\tprivate readonly onDeleteValidations: OnDeleteValidation[] = []\n\n\tconstructor(\n\t\tprivate readonly options: StrictOptions,\n\t) {\n\t}\n\n\tpublic validateInverseSide(entityName: string, field: string, definition: { inversedBy?: string }): void {\n\t\tif (!definition.inversedBy && this.options.requireInverseSide) {\n\t\t\tthis.registerWarning(`${entityName}.${field}: inverse side of the relation is not defined.`)\n\t\t}\n\t}\n\n\tpublic validateOnCascade(entityName: string, field: string, definition: { onDelete?: Model.OnDelete }): void {\n\t\t// View entities are read-only and have no real delete semantics, so onDelete validation is\n\t\t// deferred to validateModel() where we know which entities are views.\n\t\tthis.onDeleteValidations.push({ entityName, field, hasOnDelete: definition.onDelete !== undefined })\n\t}\n\n\tpublic validateModel(model: Model.Schema): void {\n\t\tfor (const { entityName, field, hasOnDelete } of this.onDeleteValidations) {\n\t\t\tconst isView = model.entities[entityName]?.view !== undefined\n\t\t\tif (isView) {\n\t\t\t\tif (hasOnDelete) {\n\t\t\t\t\tthis.registerWarning(\n\t\t\t\t\t\t`${entityName}.${field}: onDelete behaviour must not be set on a relation of a view entity. Views are read-only and have no delete semantics.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!hasOnDelete && this.options.requireOnDelete) {\n\t\t\t\tthis.registerWarning(\n\t\t\t\t\t`${entityName}.${field}: onDelete behaviour is not set. Use one of cascadeOnDelete(), setNullOnDelete() or restrictOnDelete().`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic registerWarning(message: string): void {\n\t\tthis.warnings.push({ message })\n\t}\n}\n"],"names":[],"mappings":";;;;;AAOO,MAAM,YAA2B;AAAA,EACvC,iBAAiB;AAAA,EACjB,oBAAoB;AACrB;AAUO,MAAM,0BAA0B;AAAA,EAKtC,YACkB,SAChB;AADgB,SAAA,UAAA;AALlB,kBAAA,MAAgB,YAAsB,EAAC;AAEvC,kBAAA,MAAiB,uBAA4C,EAAC;AAAA,EAK9D;AAAA,EAEO,oBAAoB,YAAoB,OAAe,YAA2C;AACxG,QAAI,CAAC,WAAW,cAAc,KAAK,QAAQ,oBAAoB;AAC9D,WAAK,gBAAgB,GAAG,UAAU,IAAI,KAAK,gDAAgD;AAAA,IAC5F;AAAA,EACD;AAAA,EAEO,kBAAkB,YAAoB,OAAe,YAAiD;AAG5G,SAAK,oBAAoB,KAAK,EAAE,YAAY,OAAO,aAAa,WAAW,aAAa,QAAW;AAAA,EACpG;AAAA,EAEO,cAAc,OAA2B;AAC/C,eAAW,EAAE,YAAY,OAAO,YAAA,KAAiB,KAAK,qBAAqB;AAC1E,YAAM,SAAS,MAAM,SAAS,UAAU,GAAG,SAAS;AACpD,UAAI,QAAQ;AACX,YAAI,aAAa;AAChB,eAAK;AAAA,YACJ,GAAG,UAAU,IAAI,KAAK;AAAA,UAAA;AAAA,QAExB;AACA;AAAA,MACD;AACA,UAAI,CAAC,eAAe,KAAK,QAAQ,iBAAiB;AACjD,aAAK;AAAA,UACJ,GAAG,UAAU,IAAI,KAAK;AAAA,QAAA;AAAA,MAExB;AAAA,IACD;AAAA,EACD;AAAA,EAEO,gBAAgB,SAAuB;AAC7C,SAAK,SAAS,KAAK,EAAE,QAAA,CAAS;AAAA,EAC/B;AACD;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
4
|
const allStrict = {
|
|
5
5
|
requireOnDelete: true,
|
|
6
6
|
requireInverseSide: true
|
|
@@ -9,6 +9,7 @@ class StrictDefinitionValidator {
|
|
|
9
9
|
constructor(options) {
|
|
10
10
|
this.options = options;
|
|
11
11
|
__publicField(this, "warnings", []);
|
|
12
|
+
__publicField(this, "onDeleteValidations", []);
|
|
12
13
|
}
|
|
13
14
|
validateInverseSide(entityName, field, definition) {
|
|
14
15
|
if (!definition.inversedBy && this.options.requireInverseSide) {
|
|
@@ -16,10 +17,24 @@ class StrictDefinitionValidator {
|
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
19
|
validateOnCascade(entityName, field, definition) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
this.onDeleteValidations.push({ entityName, field, hasOnDelete: definition.onDelete !== void 0 });
|
|
21
|
+
}
|
|
22
|
+
validateModel(model) {
|
|
23
|
+
for (const { entityName, field, hasOnDelete } of this.onDeleteValidations) {
|
|
24
|
+
const isView = model.entities[entityName]?.view !== void 0;
|
|
25
|
+
if (isView) {
|
|
26
|
+
if (hasOnDelete) {
|
|
27
|
+
this.registerWarning(
|
|
28
|
+
`${entityName}.${field}: onDelete behaviour must not be set on a relation of a view entity. Views are read-only and have no delete semantics.`
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (!hasOnDelete && this.options.requireOnDelete) {
|
|
34
|
+
this.registerWarning(
|
|
35
|
+
`${entityName}.${field}: onDelete behaviour is not set. Use one of cascadeOnDelete(), setNullOnDelete() or restrictOnDelete().`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
23
38
|
}
|
|
24
39
|
}
|
|
25
40
|
registerWarning(message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict.js","sources":["../../../../packages/schema-definition/src/strict.ts"],"sourcesContent":["import { Model } from '@contember/schema'\n\nexport type StrictOptions = {\n\trequireOnDelete?: boolean\n\trequireInverseSide?: boolean\n}\n\nexport const allStrict: StrictOptions = {\n\trequireOnDelete: true,\n\trequireInverseSide: true,\n}\n\nexport type Warning = { message: string }\n\nexport class StrictDefinitionValidator {\n\tpublic readonly warnings: Warning[] = []\n\n\tconstructor(\n\t\tprivate readonly options: StrictOptions,\n\t) {\n\t}\n\n\tpublic validateInverseSide(entityName: string, field: string, definition: { inversedBy?: string }): void {\n\t\tif (!definition.inversedBy && this.options.requireInverseSide) {\n\t\t\tthis.registerWarning(`${entityName}.${field}: inverse side of the relation is not defined.`)\n\t\t}\n\t}\n\n\tpublic validateOnCascade(entityName: string, field: string, definition: { onDelete?: Model.OnDelete }): void {\n\t\
|
|
1
|
+
{"version":3,"file":"strict.js","sources":["../../../../packages/schema-definition/src/strict.ts"],"sourcesContent":["import { Model } from '@contember/schema'\n\nexport type StrictOptions = {\n\trequireOnDelete?: boolean\n\trequireInverseSide?: boolean\n}\n\nexport const allStrict: StrictOptions = {\n\trequireOnDelete: true,\n\trequireInverseSide: true,\n}\n\nexport type Warning = { message: string }\n\ntype OnDeleteValidation = {\n\tentityName: string\n\tfield: string\n\thasOnDelete: boolean\n}\n\nexport class StrictDefinitionValidator {\n\tpublic readonly warnings: Warning[] = []\n\n\tprivate readonly onDeleteValidations: OnDeleteValidation[] = []\n\n\tconstructor(\n\t\tprivate readonly options: StrictOptions,\n\t) {\n\t}\n\n\tpublic validateInverseSide(entityName: string, field: string, definition: { inversedBy?: string }): void {\n\t\tif (!definition.inversedBy && this.options.requireInverseSide) {\n\t\t\tthis.registerWarning(`${entityName}.${field}: inverse side of the relation is not defined.`)\n\t\t}\n\t}\n\n\tpublic validateOnCascade(entityName: string, field: string, definition: { onDelete?: Model.OnDelete }): void {\n\t\t// View entities are read-only and have no real delete semantics, so onDelete validation is\n\t\t// deferred to validateModel() where we know which entities are views.\n\t\tthis.onDeleteValidations.push({ entityName, field, hasOnDelete: definition.onDelete !== undefined })\n\t}\n\n\tpublic validateModel(model: Model.Schema): void {\n\t\tfor (const { entityName, field, hasOnDelete } of this.onDeleteValidations) {\n\t\t\tconst isView = model.entities[entityName]?.view !== undefined\n\t\t\tif (isView) {\n\t\t\t\tif (hasOnDelete) {\n\t\t\t\t\tthis.registerWarning(\n\t\t\t\t\t\t`${entityName}.${field}: onDelete behaviour must not be set on a relation of a view entity. Views are read-only and have no delete semantics.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!hasOnDelete && this.options.requireOnDelete) {\n\t\t\t\tthis.registerWarning(\n\t\t\t\t\t`${entityName}.${field}: onDelete behaviour is not set. Use one of cascadeOnDelete(), setNullOnDelete() or restrictOnDelete().`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic registerWarning(message: string): void {\n\t\tthis.warnings.push({ message })\n\t}\n}\n"],"names":[],"mappings":";;;AAOO,MAAM,YAA2B;AAAA,EACvC,iBAAiB;AAAA,EACjB,oBAAoB;AACrB;AAUO,MAAM,0BAA0B;AAAA,EAKtC,YACkB,SAChB;AADgB,SAAA,UAAA;AALlB,kBAAA,MAAgB,YAAsB,EAAC;AAEvC,kBAAA,MAAiB,uBAA4C,EAAC;AAAA,EAK9D;AAAA,EAEO,oBAAoB,YAAoB,OAAe,YAA2C;AACxG,QAAI,CAAC,WAAW,cAAc,KAAK,QAAQ,oBAAoB;AAC9D,WAAK,gBAAgB,GAAG,UAAU,IAAI,KAAK,gDAAgD;AAAA,IAC5F;AAAA,EACD;AAAA,EAEO,kBAAkB,YAAoB,OAAe,YAAiD;AAG5G,SAAK,oBAAoB,KAAK,EAAE,YAAY,OAAO,aAAa,WAAW,aAAa,QAAW;AAAA,EACpG;AAAA,EAEO,cAAc,OAA2B;AAC/C,eAAW,EAAE,YAAY,OAAO,YAAA,KAAiB,KAAK,qBAAqB;AAC1E,YAAM,SAAS,MAAM,SAAS,UAAU,GAAG,SAAS;AACpD,UAAI,QAAQ;AACX,YAAI,aAAa;AAChB,eAAK;AAAA,YACJ,GAAG,UAAU,IAAI,KAAK;AAAA,UAAA;AAAA,QAExB;AACA;AAAA,MACD;AACA,UAAI,CAAC,eAAe,KAAK,QAAQ,iBAAiB;AACjD,aAAK;AAAA,UACJ,GAAG,UAAU,IAAI,KAAK;AAAA,QAAA;AAAA,MAExB;AAAA,IACD;AAAA,EACD;AAAA,EAEO,gBAAgB,SAAuB;AAC7C,SAAK,SAAS,KAAK,EAAE,QAAA,CAAS;AAAA,EAC/B;AACD;"}
|