@contember/schema-utils 2.0.1 → 2.1.0-alpha.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.
Files changed (125) hide show
  1. package/dist/development/index.cjs +0 -1
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +1 -2
  4. package/dist/development/src/dataUtils.cjs +9 -9
  5. package/dist/development/src/dataUtils.cjs.map +1 -1
  6. package/dist/development/src/dataUtils.js +10 -10
  7. package/dist/development/src/dataUtils.js.map +1 -1
  8. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs +1 -0
  9. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
  10. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js +1 -0
  11. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
  12. package/dist/development/src/model/modelUtils.cjs +1 -1
  13. package/dist/development/src/model/modelUtils.cjs.map +1 -1
  14. package/dist/development/src/model/modelUtils.js +1 -1
  15. package/dist/development/src/model/modelUtils.js.map +1 -1
  16. package/dist/development/src/model/resolveDefaultColumnType.cjs +2 -0
  17. package/dist/development/src/model/resolveDefaultColumnType.cjs.map +1 -1
  18. package/dist/development/src/model/resolveDefaultColumnType.js +2 -0
  19. package/dist/development/src/model/resolveDefaultColumnType.js.map +1 -1
  20. package/dist/development/src/schemaNormalizer.cjs +2 -0
  21. package/dist/development/src/schemaNormalizer.cjs.map +1 -1
  22. package/dist/development/src/schemaNormalizer.js +2 -0
  23. package/dist/development/src/schemaNormalizer.js.map +1 -1
  24. package/dist/development/src/type-schema/acl.cjs +3 -1
  25. package/dist/development/src/type-schema/acl.cjs.map +1 -1
  26. package/dist/development/src/type-schema/acl.js +3 -1
  27. package/dist/development/src/type-schema/acl.js.map +1 -1
  28. package/dist/development/src/type-schema/condition.cjs +2 -0
  29. package/dist/development/src/type-schema/condition.cjs.map +1 -1
  30. package/dist/development/src/type-schema/condition.js +2 -0
  31. package/dist/development/src/type-schema/condition.js.map +1 -1
  32. package/dist/development/src/type-schema/model.cjs +25 -8
  33. package/dist/development/src/type-schema/model.cjs.map +1 -1
  34. package/dist/development/src/type-schema/model.js +25 -8
  35. package/dist/development/src/type-schema/model.js.map +1 -1
  36. package/dist/development/src/type-schema/settings.cjs +2 -1
  37. package/dist/development/src/type-schema/settings.cjs.map +1 -1
  38. package/dist/development/src/type-schema/settings.js +2 -1
  39. package/dist/development/src/type-schema/settings.js.map +1 -1
  40. package/dist/development/src/validation/ModelValidator.cjs +10 -5
  41. package/dist/development/src/validation/ModelValidator.cjs.map +1 -1
  42. package/dist/development/src/validation/ModelValidator.js +11 -6
  43. package/dist/development/src/validation/ModelValidator.js.map +1 -1
  44. package/dist/development/src/validation/errors.cjs.map +1 -1
  45. package/dist/development/src/validation/errors.js.map +1 -1
  46. package/dist/production/index.cjs +0 -1
  47. package/dist/production/index.cjs.map +1 -1
  48. package/dist/production/index.js +1 -2
  49. package/dist/production/src/dataUtils.cjs +9 -9
  50. package/dist/production/src/dataUtils.cjs.map +1 -1
  51. package/dist/production/src/dataUtils.js +10 -10
  52. package/dist/production/src/dataUtils.js.map +1 -1
  53. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs +1 -0
  54. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
  55. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js +1 -0
  56. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
  57. package/dist/production/src/model/modelUtils.cjs +1 -1
  58. package/dist/production/src/model/modelUtils.cjs.map +1 -1
  59. package/dist/production/src/model/modelUtils.js +1 -1
  60. package/dist/production/src/model/modelUtils.js.map +1 -1
  61. package/dist/production/src/model/resolveDefaultColumnType.cjs +2 -0
  62. package/dist/production/src/model/resolveDefaultColumnType.cjs.map +1 -1
  63. package/dist/production/src/model/resolveDefaultColumnType.js +2 -0
  64. package/dist/production/src/model/resolveDefaultColumnType.js.map +1 -1
  65. package/dist/production/src/schemaNormalizer.cjs +2 -0
  66. package/dist/production/src/schemaNormalizer.cjs.map +1 -1
  67. package/dist/production/src/schemaNormalizer.js +2 -0
  68. package/dist/production/src/schemaNormalizer.js.map +1 -1
  69. package/dist/production/src/type-schema/acl.cjs +3 -1
  70. package/dist/production/src/type-schema/acl.cjs.map +1 -1
  71. package/dist/production/src/type-schema/acl.js +3 -1
  72. package/dist/production/src/type-schema/acl.js.map +1 -1
  73. package/dist/production/src/type-schema/condition.cjs +2 -0
  74. package/dist/production/src/type-schema/condition.cjs.map +1 -1
  75. package/dist/production/src/type-schema/condition.js +2 -0
  76. package/dist/production/src/type-schema/condition.js.map +1 -1
  77. package/dist/production/src/type-schema/model.cjs +25 -8
  78. package/dist/production/src/type-schema/model.cjs.map +1 -1
  79. package/dist/production/src/type-schema/model.js +25 -8
  80. package/dist/production/src/type-schema/model.js.map +1 -1
  81. package/dist/production/src/type-schema/settings.cjs +2 -1
  82. package/dist/production/src/type-schema/settings.cjs.map +1 -1
  83. package/dist/production/src/type-schema/settings.js +2 -1
  84. package/dist/production/src/type-schema/settings.js.map +1 -1
  85. package/dist/production/src/validation/ModelValidator.cjs +10 -5
  86. package/dist/production/src/validation/ModelValidator.cjs.map +1 -1
  87. package/dist/production/src/validation/ModelValidator.js +11 -6
  88. package/dist/production/src/validation/ModelValidator.js.map +1 -1
  89. package/dist/production/src/validation/errors.cjs.map +1 -1
  90. package/dist/production/src/validation/errors.js.map +1 -1
  91. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  92. package/dist/types/acl/schemaUtils.d.ts.map +1 -1
  93. package/dist/types/dataUtils.d.ts +7 -4
  94. package/dist/types/dataUtils.d.ts.map +1 -1
  95. package/dist/types/model/modelUtils.d.ts.map +1 -1
  96. package/dist/types/model/resolveDefaultColumnType.d.ts.map +1 -1
  97. package/dist/types/schemaChecksum.d.ts.map +1 -1
  98. package/dist/types/schemaFilter.d.ts.map +1 -1
  99. package/dist/types/schemaNormalizer.d.ts.map +1 -1
  100. package/dist/types/tsconfig.tsbuildinfo +1 -1
  101. package/dist/types/type-schema/acl.d.ts.map +1 -1
  102. package/dist/types/type-schema/condition.d.ts.map +1 -1
  103. package/dist/types/type-schema/model.d.ts +1 -1
  104. package/dist/types/type-schema/model.d.ts.map +1 -1
  105. package/dist/types/type-schema/settings.d.ts +3 -0
  106. package/dist/types/type-schema/settings.d.ts.map +1 -1
  107. package/dist/types/type-schema/where.d.ts.map +1 -1
  108. package/dist/types/utils/deepCompare.d.ts.map +1 -1
  109. package/dist/types/utils/isIt.d.ts.map +1 -1
  110. package/dist/types/utils/printJsValue.d.ts.map +1 -1
  111. package/dist/types/validation/ModelValidator.d.ts.map +1 -1
  112. package/dist/types/validation/errors.d.ts +1 -1
  113. package/dist/types/validation/errors.d.ts.map +1 -1
  114. package/package.json +5 -5
  115. package/src/dataUtils.ts +12 -9
  116. package/src/definition-generator/DefinitionCodeGenerator.ts +2 -1
  117. package/src/model/modelUtils.ts +1 -1
  118. package/src/model/resolveDefaultColumnType.ts +2 -0
  119. package/src/schemaNormalizer.ts +2 -0
  120. package/src/type-schema/acl.ts +2 -0
  121. package/src/type-schema/condition.ts +1 -0
  122. package/src/type-schema/model.ts +25 -6
  123. package/src/type-schema/settings.ts +1 -0
  124. package/src/validation/ModelValidator.ts +11 -6
  125. package/src/validation/errors.ts +2 -0
@@ -129,8 +129,10 @@ const columnSchema = Typesafe__namespace.intersection(
129
129
  }),
130
130
  Typesafe__namespace.partial({
131
131
  typeAlias: Typesafe__namespace.string,
132
- default: Typesafe__namespace.union(Typesafe__namespace.string, Typesafe__namespace.number, Typesafe__namespace.boolean, Typesafe__namespace.null_),
133
- sequence: intersectionSchema
132
+ list: Typesafe__namespace.boolean,
133
+ default: Typesafe__namespace.anyJson,
134
+ sequence: intersectionSchema,
135
+ collation: Typesafe__namespace.string
134
136
  })
135
137
  );
136
138
  const fieldSchema = Typesafe__namespace.partiallyDiscriminatedUnion(
@@ -148,11 +150,13 @@ const viewSchemaInner = Typesafe__namespace.intersection(
148
150
  sql: Typesafe__namespace.string
149
151
  }),
150
152
  Typesafe__namespace.partial({
151
- dependencies: Typesafe__namespace.array(Typesafe__namespace.string)
153
+ dependencies: Typesafe__namespace.array(Typesafe__namespace.string),
154
+ idSource: Typesafe__namespace.array(Typesafe__namespace.string),
155
+ materialized: Typesafe__namespace.boolean
152
156
  })
153
157
  );
154
158
  const viewSchema = viewSchemaInner;
155
- const indexLike = Typesafe__namespace.intersection(
159
+ const indexSchemaBase = Typesafe__namespace.intersection(
156
160
  Typesafe__namespace.object({
157
161
  fields: Typesafe__namespace.array(Typesafe__namespace.string)
158
162
  }),
@@ -162,15 +166,28 @@ const indexLike = Typesafe__namespace.intersection(
162
166
  );
163
167
  const indexesSchema = Typesafe__namespace.coalesce(
164
168
  Typesafe__namespace.preprocess(
165
- Typesafe__namespace.array(indexLike),
169
+ Typesafe__namespace.array(indexSchemaBase),
166
170
  (it) => it?.constructor === Object ? Object.values(it) : it
167
171
  ),
168
172
  []
169
173
  );
170
174
  const uniqueConstraint = Typesafe__namespace.intersection(
171
- indexLike,
175
+ Typesafe__namespace.object({
176
+ fields: Typesafe__namespace.array(Typesafe__namespace.string)
177
+ }),
178
+ Typesafe__namespace.partial({
179
+ timing: Typesafe__namespace.enumeration("deferrable", "deferred"),
180
+ name: Typesafe__namespace.string,
181
+ index: Typesafe__namespace.literal(false)
182
+ })
183
+ );
184
+ const uniqueIndex = Typesafe__namespace.intersection(
185
+ Typesafe__namespace.object({
186
+ fields: Typesafe__namespace.array(Typesafe__namespace.string),
187
+ index: Typesafe__namespace.literal(true)
188
+ }),
172
189
  Typesafe__namespace.partial({
173
- timing: Typesafe__namespace.enumeration("deferrable", "deferred")
190
+ nulls: Typesafe__namespace.enumeration("distinct", "not distinct")
174
191
  })
175
192
  );
176
193
  const entitySchema = Typesafe__namespace.intersection(
@@ -181,7 +198,7 @@ const entitySchema = Typesafe__namespace.intersection(
181
198
  tableName: Typesafe__namespace.string,
182
199
  fields: Typesafe__namespace.record(Typesafe__namespace.string, fieldSchema),
183
200
  unique: Typesafe__namespace.preprocess(
184
- Typesafe__namespace.array(uniqueConstraint),
201
+ Typesafe__namespace.array(Typesafe__namespace.union(uniqueConstraint, uniqueIndex)),
185
202
  (it) => it?.constructor === Object ? Object.values(it) : it
186
203
  ),
187
204
  indexes: indexesSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"model.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/model.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Model } from '@contember/schema'\nimport { ParseError } from '@contember/typesafe'\n\nconst orderBySchema = Typesafe.array(Typesafe.object({\n\tpath: Typesafe.array(Typesafe.string),\n\tdirection: Typesafe.enumeration<Model.OrderDirection>(\n\t\tModel.OrderDirection.asc,\n\t\tModel.OrderDirection.desc,\n\t\tModel.OrderDirection.ascNullsFirst,\n\t\tModel.OrderDirection.descNullsLast,\n\t),\n}))\nconst joiningColumnSchema = Typesafe.object({\n\tcolumnName: Typesafe.string,\n\tonDelete: Typesafe.enumeration<Model.OnDelete>(Model.OnDelete.cascade, Model.OnDelete.restrict, Model.OnDelete.setNull),\n})\nconst oneHasManyRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst oneHasManyRelationSchemaCheck: Typesafe.Equals<Model.OneHasManyRelation, ReturnType<typeof oneHasManyRelationSchema>> = true\n\nconst manyHasOneRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t}),\n)\n\nconst manyHasOneRelationSchemaCheck: Typesafe.Equals<Model.ManyHasOneRelation, ReturnType<typeof manyHasOneRelationSchema>> = true\n\nconst oneHasOneInverseRelationSchema = Typesafe.object({\n\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\tname: Typesafe.string,\n\ttarget: Typesafe.string,\n\townedBy: Typesafe.string,\n\tnullable: Typesafe.boolean,\n})\nconst oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true\n\n\nconst oneHasOneOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torphanRemoval: Typesafe.literal(true),\n\t}),\n)\n\nconst oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true\n\nconst eventLogSchema = Typesafe.coalesce(Typesafe.object({\n\tenabled: Typesafe.boolean,\n}), { enabled: true }) as Typesafe.Type<{ readonly enabled: boolean }>\n\nconst manyHasManyOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningTable: Typesafe.object({\n\t\t\ttableName: Typesafe.string,\n\t\t\tjoiningColumn: joiningColumnSchema,\n\t\t\tinverseJoiningColumn: joiningColumnSchema,\n\t\t\teventLog: eventLogSchema,\n\t\t}),\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> = true\n\nconst manyHasManyInverseRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> = true\n\nconst intersectionSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tprecedence: Typesafe.enumeration('ALWAYS', 'BY DEFAULT'),\n\t}),\n\tTypesafe.partial({\n\t\tstart: Typesafe.number,\n\t}),\n)\nconst intersectionSchemaCheck: Typesafe.Equals<Model.AnyColumn['sequence'], ReturnType<typeof intersectionSchema>> = true\n\nconst columnSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tcolumnName: Typesafe.string,\n\t\tcolumnType: Typesafe.transform(Typesafe.string, (it, raw, path) => {\n\t\t\tif (!it.replaceAll(/\\s+/g, '').match(/^[\\w_]+(?:\\(\\w+(?:,\\w+)*\\))?\\w*(?:\"[^\"]+\")?(\\[])*$/)) {\n\t\t\t\tthrow ParseError.format(it, path, 'valid column type')\n\t\t\t}\n\t\t\treturn it\n\t\t}),\n\t\tnullable: Typesafe.boolean,\n\t\ttype: Typesafe.enumeration<Model.ColumnType>(...Object.values(Model.ColumnType)),\n\t}),\n\tTypesafe.partial({\n\t\ttypeAlias: Typesafe.string,\n\t\tdefault: Typesafe.union(Typesafe.string, Typesafe.number, Typesafe.boolean, Typesafe.null_),\n\t\tsequence: intersectionSchema as Typesafe.Type<Model.AnyColumn['sequence']>,\n\t}),\n)\nconst columnSchemaCheck: Typesafe.Equals<Model.AnyColumn, ReturnType<typeof columnSchema>> = true\n\nconst fieldSchema: Typesafe.Type<Model.AnyField> = Typesafe.partiallyDiscriminatedUnion(\n\t'type',\n\toneHasOneInverseRelationSchema,\n\toneHasOneOwningRelationSchema,\n\toneHasManyRelationSchema,\n\tmanyHasOneRelationSchema,\n\tmanyHasManyInverseRelationSchema,\n\tmanyHasManyOwningRelationSchema,\n\tcolumnSchema,\n)\n\nconst viewSchemaInner = Typesafe.intersection(\n\tTypesafe.object({\n\t\tsql: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\tdependencies: Typesafe.array(Typesafe.string),\n\t}),\n)\nconst viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true\nconst viewSchema: Typesafe.Type<Model.View> = viewSchemaInner\n\n\nconst indexLike: Typesafe.Type<{readonly fields: readonly string[]; readonly name?: string | undefined}> = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\tname: Typesafe.string,\n\t}),\n)\n\nconst indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(\n\tTypesafe.preprocess(\n\t\tTypesafe.array(indexLike),\n\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t),\n\t[],\n)\n\nconst uniqueConstraint = Typesafe.intersection(\n\tindexLike,\n\tTypesafe.partial({\n\t\ttiming: Typesafe.enumeration('deferrable', 'deferred'),\n\t}),\n)\nconst uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true\n\nconst entitySchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tprimary: Typesafe.string,\n\t\tprimaryColumn: Typesafe.string,\n\t\ttableName: Typesafe.string,\n\t\tfields: Typesafe.record(Typesafe.string, fieldSchema),\n\t\tunique: Typesafe.preprocess<Model.UniqueConstraints>(\n\t\t\tTypesafe.array(uniqueConstraint),\n\t\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t\t),\n\t\tindexes: indexesSchema,\n\t\teventLog: eventLogSchema,\n\t}),\n\tTypesafe.partial({\n\t\tview: viewSchema,\n\t\torderBy: orderBySchema,\n\t}),\n)\n\nconst entitySchemaCheck: Typesafe.Equals<Model.Entity, ReturnType<typeof entitySchema>> = true\n\nexport const modelSchema = Typesafe.object({\n\tentities: Typesafe.record(Typesafe.string, entitySchema),\n\tenums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n})\n\n"],"names":["Typesafe","Model","ParseError"],"mappings":"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"}
1
+ {"version":3,"file":"model.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/model.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Model } from '@contember/schema'\nimport { ParseError } from '@contember/typesafe'\n\nconst orderBySchema = Typesafe.array(Typesafe.object({\n\tpath: Typesafe.array(Typesafe.string),\n\tdirection: Typesafe.enumeration<Model.OrderDirection>(\n\t\tModel.OrderDirection.asc,\n\t\tModel.OrderDirection.desc,\n\t\tModel.OrderDirection.ascNullsFirst,\n\t\tModel.OrderDirection.descNullsLast,\n\t),\n}))\nconst joiningColumnSchema = Typesafe.object({\n\tcolumnName: Typesafe.string,\n\tonDelete: Typesafe.enumeration<Model.OnDelete>(Model.OnDelete.cascade, Model.OnDelete.restrict, Model.OnDelete.setNull),\n})\nconst oneHasManyRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst oneHasManyRelationSchemaCheck: Typesafe.Equals<Model.OneHasManyRelation, ReturnType<typeof oneHasManyRelationSchema>> = true\n\nconst manyHasOneRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t}),\n)\n\nconst manyHasOneRelationSchemaCheck: Typesafe.Equals<Model.ManyHasOneRelation, ReturnType<typeof manyHasOneRelationSchema>> = true\n\nconst oneHasOneInverseRelationSchema = Typesafe.object({\n\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\tname: Typesafe.string,\n\ttarget: Typesafe.string,\n\townedBy: Typesafe.string,\n\tnullable: Typesafe.boolean,\n})\nconst oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true\n\n\nconst oneHasOneOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torphanRemoval: Typesafe.literal(true),\n\t}),\n)\n\nconst oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true\n\nconst eventLogSchema = Typesafe.coalesce(Typesafe.object({\n\tenabled: Typesafe.boolean,\n}), { enabled: true }) as Typesafe.Type<{ readonly enabled: boolean }>\n\nconst manyHasManyOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningTable: Typesafe.object({\n\t\t\ttableName: Typesafe.string,\n\t\t\tjoiningColumn: joiningColumnSchema,\n\t\t\tinverseJoiningColumn: joiningColumnSchema,\n\t\t\teventLog: eventLogSchema,\n\t\t}),\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> = true\n\nconst manyHasManyInverseRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> = true\n\nconst intersectionSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tprecedence: Typesafe.enumeration('ALWAYS', 'BY DEFAULT'),\n\t}),\n\tTypesafe.partial({\n\t\tstart: Typesafe.number,\n\t}),\n)\nconst intersectionSchemaCheck: Typesafe.Equals<Model.AnyColumn['sequence'], ReturnType<typeof intersectionSchema>> = true\n\nconst columnSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tcolumnName: Typesafe.string,\n\t\tcolumnType: Typesafe.transform(Typesafe.string, (it, raw, path) => {\n\t\t\tif (!it.replaceAll(/\\s+/g, '').match(/^[\\w_]+(?:\\(\\w+(?:,\\w+)*\\))?\\w*(?:\"[^\"]+\")?(\\[])*$/)) {\n\t\t\t\tthrow ParseError.format(it, path, 'valid column type')\n\t\t\t}\n\t\t\treturn it\n\t\t}),\n\t\tnullable: Typesafe.boolean,\n\t\ttype: Typesafe.enumeration<Model.ColumnType>(...Object.values(Model.ColumnType)),\n\t}),\n\tTypesafe.partial({\n\t\ttypeAlias: Typesafe.string,\n\t\tlist: Typesafe.boolean,\n\t\tdefault: Typesafe.anyJson,\n\t\tsequence: intersectionSchema as Typesafe.Type<Model.AnyColumn['sequence']>,\n\t\tcollation: Typesafe.string as Typesafe.Type<Model.AnyColumn['collation']>,\n\t}),\n)\nconst columnSchemaCheck: Typesafe.Equals<Model.AnyColumn, ReturnType<typeof columnSchema>> = true\n\nconst fieldSchema: Typesafe.Type<Model.AnyField> = Typesafe.partiallyDiscriminatedUnion(\n\t'type',\n\toneHasOneInverseRelationSchema,\n\toneHasOneOwningRelationSchema,\n\toneHasManyRelationSchema,\n\tmanyHasOneRelationSchema,\n\tmanyHasManyInverseRelationSchema,\n\tmanyHasManyOwningRelationSchema,\n\tcolumnSchema,\n)\n\nconst viewSchemaInner = Typesafe.intersection(\n\tTypesafe.object({\n\t\tsql: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\tdependencies: Typesafe.array(Typesafe.string),\n\t\tidSource: Typesafe.array(Typesafe.string),\n\t\tmaterialized: Typesafe.boolean,\n\t}),\n)\nconst viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true\nconst viewSchema: Typesafe.Type<Model.View> = viewSchemaInner\n\n\nconst indexSchemaBase = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\tname: Typesafe.string,\n\t}),\n)\nconst indexCheck: Typesafe.Equals<Model.Index, ReturnType<typeof indexSchemaBase>> = true\n\nconst indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(\n\tTypesafe.preprocess(\n\t\tTypesafe.array(indexSchemaBase),\n\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t),\n\t[],\n)\n\nconst uniqueConstraint = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\ttiming: Typesafe.enumeration('deferrable', 'deferred'),\n\t\tname: Typesafe.string,\n\t\tindex: Typesafe.literal(false),\n\t}),\n)\nconst uniqueIndex = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t\tindex: Typesafe.literal(true),\n\t}),\n\tTypesafe.partial({\n\t\tnulls: Typesafe.enumeration('distinct', 'not distinct'),\n\t}),\n)\nconst uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true\nconst uniqueIndexCheck: Typesafe.Equals<Model.UniqueIndex, ReturnType<typeof uniqueIndex>> = true\n\nconst entitySchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tprimary: Typesafe.string,\n\t\tprimaryColumn: Typesafe.string,\n\t\ttableName: Typesafe.string,\n\t\tfields: Typesafe.record(Typesafe.string, fieldSchema),\n\t\tunique: Typesafe.preprocess<Model.Uniques>(\n\t\t\tTypesafe.array(Typesafe.union(uniqueConstraint, uniqueIndex)),\n\t\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t\t),\n\t\tindexes: indexesSchema,\n\t\teventLog: eventLogSchema,\n\t}),\n\tTypesafe.partial({\n\t\tview: viewSchema,\n\t\torderBy: orderBySchema,\n\t}),\n)\n\nconst entitySchemaCheck: Typesafe.Equals<Model.Entity, ReturnType<typeof entitySchema>> = true\n\nexport const modelSchema = Typesafe.object({\n\tentities: Typesafe.record(Typesafe.string, entitySchema),\n\tenums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n})\n\n"],"names":["Typesafe","Model","ParseError"],"mappings":"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"}
@@ -111,8 +111,10 @@ const columnSchema = Typesafe.intersection(
111
111
  }),
112
112
  Typesafe.partial({
113
113
  typeAlias: Typesafe.string,
114
- default: Typesafe.union(Typesafe.string, Typesafe.number, Typesafe.boolean, Typesafe.null_),
115
- sequence: intersectionSchema
114
+ list: Typesafe.boolean,
115
+ default: Typesafe.anyJson,
116
+ sequence: intersectionSchema,
117
+ collation: Typesafe.string
116
118
  })
117
119
  );
118
120
  const fieldSchema = Typesafe.partiallyDiscriminatedUnion(
@@ -130,11 +132,13 @@ const viewSchemaInner = Typesafe.intersection(
130
132
  sql: Typesafe.string
131
133
  }),
132
134
  Typesafe.partial({
133
- dependencies: Typesafe.array(Typesafe.string)
135
+ dependencies: Typesafe.array(Typesafe.string),
136
+ idSource: Typesafe.array(Typesafe.string),
137
+ materialized: Typesafe.boolean
134
138
  })
135
139
  );
136
140
  const viewSchema = viewSchemaInner;
137
- const indexLike = Typesafe.intersection(
141
+ const indexSchemaBase = Typesafe.intersection(
138
142
  Typesafe.object({
139
143
  fields: Typesafe.array(Typesafe.string)
140
144
  }),
@@ -144,15 +148,28 @@ const indexLike = Typesafe.intersection(
144
148
  );
145
149
  const indexesSchema = Typesafe.coalesce(
146
150
  Typesafe.preprocess(
147
- Typesafe.array(indexLike),
151
+ Typesafe.array(indexSchemaBase),
148
152
  (it) => it?.constructor === Object ? Object.values(it) : it
149
153
  ),
150
154
  []
151
155
  );
152
156
  const uniqueConstraint = Typesafe.intersection(
153
- indexLike,
157
+ Typesafe.object({
158
+ fields: Typesafe.array(Typesafe.string)
159
+ }),
160
+ Typesafe.partial({
161
+ timing: Typesafe.enumeration("deferrable", "deferred"),
162
+ name: Typesafe.string,
163
+ index: Typesafe.literal(false)
164
+ })
165
+ );
166
+ const uniqueIndex = Typesafe.intersection(
167
+ Typesafe.object({
168
+ fields: Typesafe.array(Typesafe.string),
169
+ index: Typesafe.literal(true)
170
+ }),
154
171
  Typesafe.partial({
155
- timing: Typesafe.enumeration("deferrable", "deferred")
172
+ nulls: Typesafe.enumeration("distinct", "not distinct")
156
173
  })
157
174
  );
158
175
  const entitySchema = Typesafe.intersection(
@@ -163,7 +180,7 @@ const entitySchema = Typesafe.intersection(
163
180
  tableName: Typesafe.string,
164
181
  fields: Typesafe.record(Typesafe.string, fieldSchema),
165
182
  unique: Typesafe.preprocess(
166
- Typesafe.array(uniqueConstraint),
183
+ Typesafe.array(Typesafe.union(uniqueConstraint, uniqueIndex)),
167
184
  (it) => it?.constructor === Object ? Object.values(it) : it
168
185
  ),
169
186
  indexes: indexesSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sources":["../../../../../packages/schema-utils/src/type-schema/model.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Model } from '@contember/schema'\nimport { ParseError } from '@contember/typesafe'\n\nconst orderBySchema = Typesafe.array(Typesafe.object({\n\tpath: Typesafe.array(Typesafe.string),\n\tdirection: Typesafe.enumeration<Model.OrderDirection>(\n\t\tModel.OrderDirection.asc,\n\t\tModel.OrderDirection.desc,\n\t\tModel.OrderDirection.ascNullsFirst,\n\t\tModel.OrderDirection.descNullsLast,\n\t),\n}))\nconst joiningColumnSchema = Typesafe.object({\n\tcolumnName: Typesafe.string,\n\tonDelete: Typesafe.enumeration<Model.OnDelete>(Model.OnDelete.cascade, Model.OnDelete.restrict, Model.OnDelete.setNull),\n})\nconst oneHasManyRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst oneHasManyRelationSchemaCheck: Typesafe.Equals<Model.OneHasManyRelation, ReturnType<typeof oneHasManyRelationSchema>> = true\n\nconst manyHasOneRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t}),\n)\n\nconst manyHasOneRelationSchemaCheck: Typesafe.Equals<Model.ManyHasOneRelation, ReturnType<typeof manyHasOneRelationSchema>> = true\n\nconst oneHasOneInverseRelationSchema = Typesafe.object({\n\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\tname: Typesafe.string,\n\ttarget: Typesafe.string,\n\townedBy: Typesafe.string,\n\tnullable: Typesafe.boolean,\n})\nconst oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true\n\n\nconst oneHasOneOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torphanRemoval: Typesafe.literal(true),\n\t}),\n)\n\nconst oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true\n\nconst eventLogSchema = Typesafe.coalesce(Typesafe.object({\n\tenabled: Typesafe.boolean,\n}), { enabled: true }) as Typesafe.Type<{ readonly enabled: boolean }>\n\nconst manyHasManyOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningTable: Typesafe.object({\n\t\t\ttableName: Typesafe.string,\n\t\t\tjoiningColumn: joiningColumnSchema,\n\t\t\tinverseJoiningColumn: joiningColumnSchema,\n\t\t\teventLog: eventLogSchema,\n\t\t}),\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> = true\n\nconst manyHasManyInverseRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> = true\n\nconst intersectionSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tprecedence: Typesafe.enumeration('ALWAYS', 'BY DEFAULT'),\n\t}),\n\tTypesafe.partial({\n\t\tstart: Typesafe.number,\n\t}),\n)\nconst intersectionSchemaCheck: Typesafe.Equals<Model.AnyColumn['sequence'], ReturnType<typeof intersectionSchema>> = true\n\nconst columnSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tcolumnName: Typesafe.string,\n\t\tcolumnType: Typesafe.transform(Typesafe.string, (it, raw, path) => {\n\t\t\tif (!it.replaceAll(/\\s+/g, '').match(/^[\\w_]+(?:\\(\\w+(?:,\\w+)*\\))?\\w*(?:\"[^\"]+\")?(\\[])*$/)) {\n\t\t\t\tthrow ParseError.format(it, path, 'valid column type')\n\t\t\t}\n\t\t\treturn it\n\t\t}),\n\t\tnullable: Typesafe.boolean,\n\t\ttype: Typesafe.enumeration<Model.ColumnType>(...Object.values(Model.ColumnType)),\n\t}),\n\tTypesafe.partial({\n\t\ttypeAlias: Typesafe.string,\n\t\tdefault: Typesafe.union(Typesafe.string, Typesafe.number, Typesafe.boolean, Typesafe.null_),\n\t\tsequence: intersectionSchema as Typesafe.Type<Model.AnyColumn['sequence']>,\n\t}),\n)\nconst columnSchemaCheck: Typesafe.Equals<Model.AnyColumn, ReturnType<typeof columnSchema>> = true\n\nconst fieldSchema: Typesafe.Type<Model.AnyField> = Typesafe.partiallyDiscriminatedUnion(\n\t'type',\n\toneHasOneInverseRelationSchema,\n\toneHasOneOwningRelationSchema,\n\toneHasManyRelationSchema,\n\tmanyHasOneRelationSchema,\n\tmanyHasManyInverseRelationSchema,\n\tmanyHasManyOwningRelationSchema,\n\tcolumnSchema,\n)\n\nconst viewSchemaInner = Typesafe.intersection(\n\tTypesafe.object({\n\t\tsql: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\tdependencies: Typesafe.array(Typesafe.string),\n\t}),\n)\nconst viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true\nconst viewSchema: Typesafe.Type<Model.View> = viewSchemaInner\n\n\nconst indexLike: Typesafe.Type<{readonly fields: readonly string[]; readonly name?: string | undefined}> = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\tname: Typesafe.string,\n\t}),\n)\n\nconst indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(\n\tTypesafe.preprocess(\n\t\tTypesafe.array(indexLike),\n\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t),\n\t[],\n)\n\nconst uniqueConstraint = Typesafe.intersection(\n\tindexLike,\n\tTypesafe.partial({\n\t\ttiming: Typesafe.enumeration('deferrable', 'deferred'),\n\t}),\n)\nconst uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true\n\nconst entitySchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tprimary: Typesafe.string,\n\t\tprimaryColumn: Typesafe.string,\n\t\ttableName: Typesafe.string,\n\t\tfields: Typesafe.record(Typesafe.string, fieldSchema),\n\t\tunique: Typesafe.preprocess<Model.UniqueConstraints>(\n\t\t\tTypesafe.array(uniqueConstraint),\n\t\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t\t),\n\t\tindexes: indexesSchema,\n\t\teventLog: eventLogSchema,\n\t}),\n\tTypesafe.partial({\n\t\tview: viewSchema,\n\t\torderBy: orderBySchema,\n\t}),\n)\n\nconst entitySchemaCheck: Typesafe.Equals<Model.Entity, ReturnType<typeof entitySchema>> = true\n\nexport const modelSchema = Typesafe.object({\n\tentities: Typesafe.record(Typesafe.string, entitySchema),\n\tenums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n})\n\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.js","sources":["../../../../../packages/schema-utils/src/type-schema/model.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Model } from '@contember/schema'\nimport { ParseError } from '@contember/typesafe'\n\nconst orderBySchema = Typesafe.array(Typesafe.object({\n\tpath: Typesafe.array(Typesafe.string),\n\tdirection: Typesafe.enumeration<Model.OrderDirection>(\n\t\tModel.OrderDirection.asc,\n\t\tModel.OrderDirection.desc,\n\t\tModel.OrderDirection.ascNullsFirst,\n\t\tModel.OrderDirection.descNullsLast,\n\t),\n}))\nconst joiningColumnSchema = Typesafe.object({\n\tcolumnName: Typesafe.string,\n\tonDelete: Typesafe.enumeration<Model.OnDelete>(Model.OnDelete.cascade, Model.OnDelete.restrict, Model.OnDelete.setNull),\n})\nconst oneHasManyRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst oneHasManyRelationSchemaCheck: Typesafe.Equals<Model.OneHasManyRelation, ReturnType<typeof oneHasManyRelationSchema>> = true\n\nconst manyHasOneRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t}),\n)\n\nconst manyHasOneRelationSchemaCheck: Typesafe.Equals<Model.ManyHasOneRelation, ReturnType<typeof manyHasOneRelationSchema>> = true\n\nconst oneHasOneInverseRelationSchema = Typesafe.object({\n\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\tname: Typesafe.string,\n\ttarget: Typesafe.string,\n\townedBy: Typesafe.string,\n\tnullable: Typesafe.boolean,\n})\nconst oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true\n\n\nconst oneHasOneOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torphanRemoval: Typesafe.literal(true),\n\t}),\n)\n\nconst oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true\n\nconst eventLogSchema = Typesafe.coalesce(Typesafe.object({\n\tenabled: Typesafe.boolean,\n}), { enabled: true }) as Typesafe.Type<{ readonly enabled: boolean }>\n\nconst manyHasManyOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningTable: Typesafe.object({\n\t\t\ttableName: Typesafe.string,\n\t\t\tjoiningColumn: joiningColumnSchema,\n\t\t\tinverseJoiningColumn: joiningColumnSchema,\n\t\t\teventLog: eventLogSchema,\n\t\t}),\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> = true\n\nconst manyHasManyInverseRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> = true\n\nconst intersectionSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tprecedence: Typesafe.enumeration('ALWAYS', 'BY DEFAULT'),\n\t}),\n\tTypesafe.partial({\n\t\tstart: Typesafe.number,\n\t}),\n)\nconst intersectionSchemaCheck: Typesafe.Equals<Model.AnyColumn['sequence'], ReturnType<typeof intersectionSchema>> = true\n\nconst columnSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tcolumnName: Typesafe.string,\n\t\tcolumnType: Typesafe.transform(Typesafe.string, (it, raw, path) => {\n\t\t\tif (!it.replaceAll(/\\s+/g, '').match(/^[\\w_]+(?:\\(\\w+(?:,\\w+)*\\))?\\w*(?:\"[^\"]+\")?(\\[])*$/)) {\n\t\t\t\tthrow ParseError.format(it, path, 'valid column type')\n\t\t\t}\n\t\t\treturn it\n\t\t}),\n\t\tnullable: Typesafe.boolean,\n\t\ttype: Typesafe.enumeration<Model.ColumnType>(...Object.values(Model.ColumnType)),\n\t}),\n\tTypesafe.partial({\n\t\ttypeAlias: Typesafe.string,\n\t\tlist: Typesafe.boolean,\n\t\tdefault: Typesafe.anyJson,\n\t\tsequence: intersectionSchema as Typesafe.Type<Model.AnyColumn['sequence']>,\n\t\tcollation: Typesafe.string as Typesafe.Type<Model.AnyColumn['collation']>,\n\t}),\n)\nconst columnSchemaCheck: Typesafe.Equals<Model.AnyColumn, ReturnType<typeof columnSchema>> = true\n\nconst fieldSchema: Typesafe.Type<Model.AnyField> = Typesafe.partiallyDiscriminatedUnion(\n\t'type',\n\toneHasOneInverseRelationSchema,\n\toneHasOneOwningRelationSchema,\n\toneHasManyRelationSchema,\n\tmanyHasOneRelationSchema,\n\tmanyHasManyInverseRelationSchema,\n\tmanyHasManyOwningRelationSchema,\n\tcolumnSchema,\n)\n\nconst viewSchemaInner = Typesafe.intersection(\n\tTypesafe.object({\n\t\tsql: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\tdependencies: Typesafe.array(Typesafe.string),\n\t\tidSource: Typesafe.array(Typesafe.string),\n\t\tmaterialized: Typesafe.boolean,\n\t}),\n)\nconst viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true\nconst viewSchema: Typesafe.Type<Model.View> = viewSchemaInner\n\n\nconst indexSchemaBase = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\tname: Typesafe.string,\n\t}),\n)\nconst indexCheck: Typesafe.Equals<Model.Index, ReturnType<typeof indexSchemaBase>> = true\n\nconst indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(\n\tTypesafe.preprocess(\n\t\tTypesafe.array(indexSchemaBase),\n\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t),\n\t[],\n)\n\nconst uniqueConstraint = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\ttiming: Typesafe.enumeration('deferrable', 'deferred'),\n\t\tname: Typesafe.string,\n\t\tindex: Typesafe.literal(false),\n\t}),\n)\nconst uniqueIndex = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t\tindex: Typesafe.literal(true),\n\t}),\n\tTypesafe.partial({\n\t\tnulls: Typesafe.enumeration('distinct', 'not distinct'),\n\t}),\n)\nconst uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true\nconst uniqueIndexCheck: Typesafe.Equals<Model.UniqueIndex, ReturnType<typeof uniqueIndex>> = true\n\nconst entitySchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tprimary: Typesafe.string,\n\t\tprimaryColumn: Typesafe.string,\n\t\ttableName: Typesafe.string,\n\t\tfields: Typesafe.record(Typesafe.string, fieldSchema),\n\t\tunique: Typesafe.preprocess<Model.Uniques>(\n\t\t\tTypesafe.array(Typesafe.union(uniqueConstraint, uniqueIndex)),\n\t\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t\t),\n\t\tindexes: indexesSchema,\n\t\teventLog: eventLogSchema,\n\t}),\n\tTypesafe.partial({\n\t\tview: viewSchema,\n\t\torderBy: orderBySchema,\n\t}),\n)\n\nconst entitySchemaCheck: Typesafe.Equals<Model.Entity, ReturnType<typeof entitySchema>> = true\n\nexport const modelSchema = Typesafe.object({\n\tentities: Typesafe.record(Typesafe.string, entitySchema),\n\tenums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n})\n\n"],"names":[],"mappings":"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"}
@@ -26,7 +26,8 @@ const settingsSchema = Typesafe__namespace.partial({
26
26
  content: Typesafe__namespace.partial({
27
27
  useExistsInHasManyFilter: Typesafe__namespace.boolean,
28
28
  fullDateTimeResponse: Typesafe__namespace.boolean,
29
- shortDateResponse: Typesafe__namespace.boolean
29
+ shortDateResponse: Typesafe__namespace.boolean,
30
+ uuidVersion: Typesafe__namespace.union(Typesafe__namespace.literal(4), Typesafe__namespace.literal(7))
30
31
  })
31
32
  });
32
33
  exports.settingsSchema = settingsSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/settings.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Settings } from '@contember/schema'\n\nexport const settingsSchema = Typesafe.partial({\n\tuseExistsInHasManyFilter: Typesafe.boolean,\n\n\ttenant: Typesafe.partial({\n\t\tinviteExpirationMinutes: Typesafe.integer,\n\t}),\n\tcontent: Typesafe.partial({\n\t\tuseExistsInHasManyFilter: Typesafe.boolean,\n\t\tfullDateTimeResponse: Typesafe.boolean,\n\t\tshortDateResponse: Typesafe.boolean,\n\t}),\n})\n\nconst settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true\n"],"names":["Typesafe"],"mappings":";;;;;;;;;;;;;;;;;;;;AAGa,MAAA,iBAAiBA,oBAAS,QAAQ;AAAA,EAC9C,0BAA0BA,oBAAS;AAAA,EAEnC,QAAQA,oBAAS,QAAQ;AAAA,IACxB,yBAAyBA,oBAAS;AAAA,EAAA,CAClC;AAAA,EACD,SAASA,oBAAS,QAAQ;AAAA,IACzB,0BAA0BA,oBAAS;AAAA,IACnC,sBAAsBA,oBAAS;AAAA,IAC/B,mBAAmBA,oBAAS;AAAA,EAC5B,CAAA;AACF,CAAC;;"}
1
+ {"version":3,"file":"settings.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/settings.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Settings } from '@contember/schema'\n\nexport const settingsSchema = Typesafe.partial({\n\tuseExistsInHasManyFilter: Typesafe.boolean,\n\n\ttenant: Typesafe.partial({\n\t\tinviteExpirationMinutes: Typesafe.integer,\n\t}),\n\tcontent: Typesafe.partial({\n\t\tuseExistsInHasManyFilter: Typesafe.boolean,\n\t\tfullDateTimeResponse: Typesafe.boolean,\n\t\tshortDateResponse: Typesafe.boolean,\n\t\tuuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7)),\n\t}),\n})\n\nconst settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true\n"],"names":["Typesafe"],"mappings":";;;;;;;;;;;;;;;;;;;;AAGa,MAAA,iBAAiBA,oBAAS,QAAQ;AAAA,EAC9C,0BAA0BA,oBAAS;AAAA,EAEnC,QAAQA,oBAAS,QAAQ;AAAA,IACxB,yBAAyBA,oBAAS;AAAA,EAAA,CAClC;AAAA,EACD,SAASA,oBAAS,QAAQ;AAAA,IACzB,0BAA0BA,oBAAS;AAAA,IACnC,sBAAsBA,oBAAS;AAAA,IAC/B,mBAAmBA,oBAAS;AAAA,IAC5B,aAAaA,oBAAS,MAAMA,oBAAS,QAAQ,CAAC,GAAGA,oBAAS,QAAQ,CAAC,CAAC;AAAA,EACpE,CAAA;AACF,CAAC;;"}
@@ -7,7 +7,8 @@ const settingsSchema = Typesafe.partial({
7
7
  content: Typesafe.partial({
8
8
  useExistsInHasManyFilter: Typesafe.boolean,
9
9
  fullDateTimeResponse: Typesafe.boolean,
10
- shortDateResponse: Typesafe.boolean
10
+ shortDateResponse: Typesafe.boolean,
11
+ uuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7))
11
12
  })
12
13
  });
13
14
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sources":["../../../../../packages/schema-utils/src/type-schema/settings.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Settings } from '@contember/schema'\n\nexport const settingsSchema = Typesafe.partial({\n\tuseExistsInHasManyFilter: Typesafe.boolean,\n\n\ttenant: Typesafe.partial({\n\t\tinviteExpirationMinutes: Typesafe.integer,\n\t}),\n\tcontent: Typesafe.partial({\n\t\tuseExistsInHasManyFilter: Typesafe.boolean,\n\t\tfullDateTimeResponse: Typesafe.boolean,\n\t\tshortDateResponse: Typesafe.boolean,\n\t}),\n})\n\nconst settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true\n"],"names":[],"mappings":";AAGa,MAAA,iBAAiB,SAAS,QAAQ;AAAA,EAC9C,0BAA0B,SAAS;AAAA,EAEnC,QAAQ,SAAS,QAAQ;AAAA,IACxB,yBAAyB,SAAS;AAAA,EAAA,CAClC;AAAA,EACD,SAAS,SAAS,QAAQ;AAAA,IACzB,0BAA0B,SAAS;AAAA,IACnC,sBAAsB,SAAS;AAAA,IAC/B,mBAAmB,SAAS;AAAA,EAC5B,CAAA;AACF,CAAC;"}
1
+ {"version":3,"file":"settings.js","sources":["../../../../../packages/schema-utils/src/type-schema/settings.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Settings } from '@contember/schema'\n\nexport const settingsSchema = Typesafe.partial({\n\tuseExistsInHasManyFilter: Typesafe.boolean,\n\n\ttenant: Typesafe.partial({\n\t\tinviteExpirationMinutes: Typesafe.integer,\n\t}),\n\tcontent: Typesafe.partial({\n\t\tuseExistsInHasManyFilter: Typesafe.boolean,\n\t\tfullDateTimeResponse: Typesafe.boolean,\n\t\tshortDateResponse: Typesafe.boolean,\n\t\tuuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7)),\n\t}),\n})\n\nconst settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true\n"],"names":[],"mappings":";AAGa,MAAA,iBAAiB,SAAS,QAAQ;AAAA,EAC9C,0BAA0B,SAAS;AAAA,EAEnC,QAAQ,SAAS,QAAQ;AAAA,IACxB,yBAAyB,SAAS;AAAA,EAAA,CAClC;AAAA,EACD,SAAS,SAAS,QAAQ;AAAA,IACzB,0BAA0B,SAAS;AAAA,IACnC,sBAAsB,SAAS;AAAA,IAC/B,mBAAmB,SAAS;AAAA,IAC5B,aAAa,SAAS,MAAM,SAAS,QAAQ,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC;AAAA,EACpE,CAAA;AACF,CAAC;"}
@@ -47,17 +47,22 @@ class ModelValidator {
47
47
  }
48
48
  }
49
49
  this.validateUniqueConstraints(
50
- entity.unique,
51
- new Set(Object.keys(entity.fields)),
50
+ entity,
52
51
  errors2.for("unique")
53
52
  );
54
53
  this.validateColumnNamesCollision(entity, errors2);
55
54
  }
56
- validateUniqueConstraints(uniqueConstraints, fields, errors2) {
57
- for (const constraint of uniqueConstraints) {
55
+ validateUniqueConstraints(entity, errors2) {
56
+ for (const constraint of entity.unique) {
57
+ if (entity.view && !constraint.index) {
58
+ errors2.add("MODEL_INVALID_CONSTRAINT", "Unique constraint on view entity must be an index. Please set index: true");
59
+ }
58
60
  for (const field of constraint.fields) {
59
- if (!fields.has(field)) {
61
+ const fieldDef = entity.fields[field];
62
+ if (!fieldDef) {
60
63
  errors2.add("MODEL_UNDEFINED_FIELD", `Referenced field ${field} in a constraint does not exists`);
64
+ } else if (modelUtils.isColumn(fieldDef) && fieldDef.list) {
65
+ errors2.add("MODEL_INVALID_FIELD", `Field ${field} in a unique constraint cannot be an array`);
61
66
  }
62
67
  }
63
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ModelValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ModelValidator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptEveryFieldVisitor, getTargetEntity, isInverseRelation, isOwningRelation } from '../model'\n\nconst IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/\nconst RESERVED_WORDS = ['and', 'or', 'not']\n\n\nexport class ModelValidator {\n\tconstructor(private readonly model: Model.Schema) { }\n\n\tpublic validate(): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], [])\n\t\tthis.validateEnums(this.model.enums, errorBuilder.for('enums'))\n\t\tthis.validateEntities(this.model.entities, errorBuilder.for('entities'))\n\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEnums(enums: Model.Schema['enums'], errors: ErrorBuilder): void {\n\t\tfor (const [enumName, enumValues] of Object.entries(enums)) {\n\t\t\tfor (const value of enumValues) {\n\t\t\t\tconst valueErrors = errors.for(enumName, value)\n\t\t\t\tthis.validateIdentifier(value, valueErrors)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateEntities(entities: Model.Schema['entities'], errors: ErrorBuilder): void {\n\t\tfor (const [entityName, entity] of Object.entries(entities)) {\n\t\t\tconst entityErrors = errors.for(entityName)\n\t\t\tif (entity.name !== entityName) {\n\t\t\t\tentityErrors.add('MODEL_NAME_MISMATCH', `Entity name \"${entity.name}\" does not match the name in a map \"${entityName}\"`)\n\t\t\t}\n\t\t\tthis.validateEntity(entity, entityErrors)\n\t\t}\n\t\tconst entitiesArr = Object.values(this.model.entities)\n\t\tthis.validateMetaSuffixCollisions(entitiesArr, errors)\n\t\tthis.validateTableNameCollisions(entitiesArr, errors)\n\t\tthis.validateAliasedTypesCollision(entitiesArr, errors)\n\t}\n\n\tprivate validateEntity(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(entity.name, errors)\n\t\tthis.validateEntityName(entity.name, errors)\n\n\t\tfor (const [fieldName, field] of Object.entries(entity.fields)) {\n\t\t\tconst fieldErrors = errors.for(fieldName)\n\t\t\tthis.validateField(entity, field, fieldErrors)\n\t\t\tif (field.name !== fieldName) {\n\t\t\t\tfieldErrors.add('MODEL_NAME_MISMATCH', `Field name \"${field.name}\" does not match the name in a map \"${fieldName}\"`)\n\t\t\t}\n\t\t}\n\t\tthis.validateUniqueConstraints(\n\t\t\tentity.unique,\n\t\t\tnew Set(Object.keys(entity.fields)),\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(uniqueConstraints: Model.Entity['unique'], fields: Set<string>, errors: ErrorBuilder): void {\n\t\tfor (const constraint of uniqueConstraints) {\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tif (!fields.has(field)) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateColumnNamesCollision(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tconst existingColumnNames = new Map<string, string>()\n\t\tconst addColumnName = (fieldName: string, columnName: string) => {\n\t\t\tif (existingColumnNames.has(columnName)) {\n\t\t\t\tconst exitingName = existingColumnNames.get(columnName)\n\t\t\t\terrors\n\t\t\t\t\t.for(fieldName)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Column name \"${columnName}\" on field \"${fieldName}\" collides with a column name on field \"${exitingName}\".`)\n\t\t\t}\n\t\t\texistingColumnNames.set(columnName, fieldName)\n\t\t}\n\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\taddColumnName(column.name, column.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\tvisitOneHasMany: () => {},\n\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\tvisitManyHasManyOwning: () => {},\n\t\t})\n\t}\n\n\tprivate validateField(partialEntity: Model.Entity, field: Model.AnyField, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(field.name, errors)\n\t\tif (isRelation(field)) {\n\t\t\tthis.validateRelation(partialEntity, field, errors)\n\t\t} else {\n\t\t\tif (field.sequence && field.nullable) {\n\t\t\t\terrors.add('MODEL_INVALID_COLUMN_DEFINITION', 'Column with sequence cannot be nullable.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateRelation(partialEntity: Model.Entity, field: Model.AnyRelation, errors: ErrorBuilder): void {\n\t\tconst entityName = partialEntity.name\n\t\tconst targetEntityName = field.target\n\t\tconst targetEntity = this.model.entities[targetEntityName] || undefined\n\t\tif (!targetEntity) {\n\t\t\treturn errors.add('MODEL_UNDEFINED_ENTITY', `Target entity ${targetEntityName} not found`)\n\t\t}\n\t\tif (((it: Model.AnyRelation): it is Model.AnyRelation & Model.OrderableRelation => 'orderBy' in it)(field)) {\n\t\t\t(field as Model.OrderableRelation).orderBy?.forEach(it => {\n\t\t\t\tlet entity = targetEntity\n\n\t\t\t\tfor (let i = 0; i < it.path.length; i++) {\n\t\t\t\t\tconst orderByField = entity.fields[it.path[i]]\n\t\t\t\t\tconst pathStr = it.path.slice(0, i + 1).join('.')\n\t\t\t\t\tif (!orderByField) {\n\t\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (i + 1 < it.path.length) {\n\t\t\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, orderByField.name)\n\t\t\t\t\t\tif (!targetEntity) {\n\t\t\t\t\t\t\terrors.add('MODEL_RELATION_REQUIRED', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity = targetEntity\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (partialEntity.view) {\n\t\t\tif (field.type === Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'Many-has-many relation is not allowed on a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasMany\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-many relation fields on views must point to a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasOne &&\n\t\t\t\t!('joiningColumn' in field)\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-one relation fields on views must be owning or point to a view entity.')\n\t\t\t}\n\t\t}\n\t\tif (isInverseRelation(field)) {\n\t\t\tconst ownedBy = field.ownedBy\n\t\t\tconst targetField = targetEntity.fields[ownedBy]\n\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`\n\t\t\tif (!targetField) {\n\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t}\n\n\t\t\tif (!isRelation(targetField)) {\n\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t}\n\t\t\tif (targetField.target !== entityName) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t}\n\t\t\tif (!isOwningRelation(targetField)) {\n\t\t\t\terrors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an owning relation`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!targetField.inversedBy) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} inverse relation is not set`)\n\t\t\t}\n\t\t\tif (targetField.inversedBy !== field.name) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t} else {\n\t\t\tconst inversedBy = field.inversedBy\n\t\t\tif (targetEntity.view) {\n\t\t\t\tif ('joiningColumn' in field) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', `View entity ${targetEntity.name} cannot be referenced from an owning relation. Try switching the owning side.`)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (inversedBy) {\n\t\t\t\tconst targetField = targetEntity.fields[inversedBy]\n\t\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`\n\t\t\t\tif (!targetField) {\n\t\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t\t}\n\t\t\t\tif (!isRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t\t}\n\t\t\t\tif (targetField.target !== entityName) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t\t}\n\t\t\t\tif (!isInverseRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an inverse relation`)\n\t\t\t\t}\n\t\t\t\tif (!targetField.ownedBy) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} owning relation is not set`)\n\t\t\t\t}\n\t\t\t\tif (targetField.ownedBy !== field.name) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateIdentifier(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (!value.match(IDENTIFIER_PATTERN)) {\n\t\t\treturn errorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} must match pattern ${IDENTIFIER_PATTERN.source}`)\n\t\t}\n\t\tif (RESERVED_WORDS.includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateEntityName(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (['Query', 'Mutation'].includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_ENTITY_NAME', `${value} is reserved word`)\n\t\t}\n\t}\n\n\n\tprivate validateMetaSuffixCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst entityNames = new Set(entities.map(it => it.name))\n\t\tfor (const entity of entities) {\n\t\t\tif (entity.name.endsWith('Meta')) {\n\t\t\t\tconst baseName = entity.name.substring(0, entity.name.length - 4)\n\t\t\t\tif (entityNames.has(baseName)) {\n\t\t\t\t\terrorBuilder.for(entity.name)\n\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with \"Meta\" suffix is created for every entity`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\tprivate validateTableNameCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst relationNames: Record<string, string> = {}\n\t\tfor (const entity of entities) {\n\t\t\tconst description = `table name ${entity.tableName} of entity ${entity.name}`\n\t\t\tif (relationNames[entity.tableName]) {\n\t\t\t\terrorBuilder\n\t\t\t\t\t.for(entity.name)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `${description} collides with a ${relationNames[entity.tableName]}`)\n\t\t\t} else {\n\t\t\t\trelationNames[entity.tableName] = description\n\t\t\t}\n\t\t}\n\t\tfor (const entity of entities) {\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entity.name)\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\t\tconst joiningTable = relation.joiningTable\n\t\t\t\t\tconst description = `joining table name ${joiningTable.tableName} of relation ${entity.name}::${relation.name}`\n\t\t\t\t\tif (relationNames[joiningTable.tableName]) {\n\t\t\t\t\t\tentityErrorBuilder\n\t\t\t\t\t\t\t.for(relation.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t\t`${description} collides with a ${relationNames[joiningTable.tableName]}.` +\n\t\t\t\t\t\t\t\t'Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelationNames[joiningTable.tableName] = description\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitColumn: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n\n\n\tprivate validateAliasedTypesCollision(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst aliasedTypes = new Map<string, Model.ColumnType>()\n\t\tfor (const entity of entities) {\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\t\tif (!column.typeAlias) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {\n\t\t\t\t\t\terrorBuilder\n\t\t\t\t\t\t\t.for(column.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Type alias ${column.typeAlias} already exists for base type ${column.type}`)\n\t\t\t\t\t}\n\t\t\t\t\taliasedTypes.set(column.typeAlias, column.type)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: () => { },\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n}\n\nconst isRelation = (field: Model.AnyField): field is Model.AnyRelation =>\n\tObject.values(Model.RelationType).includes(field.type as Model.RelationType)\n"],"names":["ErrorBuilder","errors","acceptEveryFieldVisitor","targetEntity","getTargetEntity","Model","isInverseRelation","isOwningRelation","entity"],"mappings":"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"}
1
+ {"version":3,"file":"ModelValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ModelValidator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptEveryFieldVisitor, getTargetEntity, isColumn, isInverseRelation, isOwningRelation } from '../model'\n\nconst IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/\nconst RESERVED_WORDS = ['and', 'or', 'not']\n\n\nexport class ModelValidator {\n\tconstructor(private readonly model: Model.Schema) { }\n\n\tpublic validate(): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], [])\n\t\tthis.validateEnums(this.model.enums, errorBuilder.for('enums'))\n\t\tthis.validateEntities(this.model.entities, errorBuilder.for('entities'))\n\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEnums(enums: Model.Schema['enums'], errors: ErrorBuilder): void {\n\t\tfor (const [enumName, enumValues] of Object.entries(enums)) {\n\t\t\tfor (const value of enumValues) {\n\t\t\t\tconst valueErrors = errors.for(enumName, value)\n\t\t\t\tthis.validateIdentifier(value, valueErrors)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateEntities(entities: Model.Schema['entities'], errors: ErrorBuilder): void {\n\t\tfor (const [entityName, entity] of Object.entries(entities)) {\n\t\t\tconst entityErrors = errors.for(entityName)\n\t\t\tif (entity.name !== entityName) {\n\t\t\t\tentityErrors.add('MODEL_NAME_MISMATCH', `Entity name \"${entity.name}\" does not match the name in a map \"${entityName}\"`)\n\t\t\t}\n\t\t\tthis.validateEntity(entity, entityErrors)\n\t\t}\n\t\tconst entitiesArr = Object.values(this.model.entities)\n\t\tthis.validateMetaSuffixCollisions(entitiesArr, errors)\n\t\tthis.validateTableNameCollisions(entitiesArr, errors)\n\t\tthis.validateAliasedTypesCollision(entitiesArr, errors)\n\t}\n\n\tprivate validateEntity(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(entity.name, errors)\n\t\tthis.validateEntityName(entity.name, errors)\n\n\t\tfor (const [fieldName, field] of Object.entries(entity.fields)) {\n\t\t\tconst fieldErrors = errors.for(fieldName)\n\t\t\tthis.validateField(entity, field, fieldErrors)\n\t\t\tif (field.name !== fieldName) {\n\t\t\t\tfieldErrors.add('MODEL_NAME_MISMATCH', `Field name \"${field.name}\" does not match the name in a map \"${fieldName}\"`)\n\t\t\t}\n\t\t}\n\t\tthis.validateUniqueConstraints(\n\t\t\tentity,\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tfor (const constraint of entity.unique) {\n\t\t\tif (entity.view && !constraint.index) {\n\t\t\t\terrors.add('MODEL_INVALID_CONSTRAINT', 'Unique constraint on view entity must be an index. Please set index: true')\n\t\t\t}\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tconst fieldDef = entity.fields[field]\n\t\t\t\tif (!fieldDef) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\n\t\t\t\t} else if (isColumn(fieldDef) && fieldDef.list) {\n\t\t\t\t\terrors.add('MODEL_INVALID_FIELD', `Field ${field} in a unique constraint cannot be an array`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateColumnNamesCollision(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tconst existingColumnNames = new Map<string, string>()\n\t\tconst addColumnName = (fieldName: string, columnName: string) => {\n\t\t\tif (existingColumnNames.has(columnName)) {\n\t\t\t\tconst exitingName = existingColumnNames.get(columnName)\n\t\t\t\terrors\n\t\t\t\t\t.for(fieldName)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Column name \"${columnName}\" on field \"${fieldName}\" collides with a column name on field \"${exitingName}\".`)\n\t\t\t}\n\t\t\texistingColumnNames.set(columnName, fieldName)\n\t\t}\n\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\taddColumnName(column.name, column.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\tvisitOneHasMany: () => {},\n\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\tvisitManyHasManyOwning: () => {},\n\t\t})\n\t}\n\n\tprivate validateField(partialEntity: Model.Entity, field: Model.AnyField, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(field.name, errors)\n\t\tif (isRelation(field)) {\n\t\t\tthis.validateRelation(partialEntity, field, errors)\n\t\t} else {\n\t\t\tif (field.sequence && field.nullable) {\n\t\t\t\terrors.add('MODEL_INVALID_COLUMN_DEFINITION', 'Column with sequence cannot be nullable.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateRelation(partialEntity: Model.Entity, field: Model.AnyRelation, errors: ErrorBuilder): void {\n\t\tconst entityName = partialEntity.name\n\t\tconst targetEntityName = field.target\n\t\tconst targetEntity = this.model.entities[targetEntityName] || undefined\n\t\tif (!targetEntity) {\n\t\t\treturn errors.add('MODEL_UNDEFINED_ENTITY', `Target entity ${targetEntityName} not found`)\n\t\t}\n\t\tif (((it: Model.AnyRelation): it is Model.AnyRelation & Model.OrderableRelation => 'orderBy' in it)(field)) {\n\t\t\t(field as Model.OrderableRelation).orderBy?.forEach(it => {\n\t\t\t\tlet entity = targetEntity\n\n\t\t\t\tfor (let i = 0; i < it.path.length; i++) {\n\t\t\t\t\tconst orderByField = entity.fields[it.path[i]]\n\t\t\t\t\tconst pathStr = it.path.slice(0, i + 1).join('.')\n\t\t\t\t\tif (!orderByField) {\n\t\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (i + 1 < it.path.length) {\n\t\t\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, orderByField.name)\n\t\t\t\t\t\tif (!targetEntity) {\n\t\t\t\t\t\t\terrors.add('MODEL_RELATION_REQUIRED', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity = targetEntity\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (partialEntity.view) {\n\t\t\tif (field.type === Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'Many-has-many relation is not allowed on a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasMany\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-many relation fields on views must point to a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasOne &&\n\t\t\t\t!('joiningColumn' in field)\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-one relation fields on views must be owning or point to a view entity.')\n\t\t\t}\n\t\t}\n\t\tif (isInverseRelation(field)) {\n\t\t\tconst ownedBy = field.ownedBy\n\t\t\tconst targetField = targetEntity.fields[ownedBy]\n\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`\n\t\t\tif (!targetField) {\n\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t}\n\n\t\t\tif (!isRelation(targetField)) {\n\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t}\n\t\t\tif (targetField.target !== entityName) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t}\n\t\t\tif (!isOwningRelation(targetField)) {\n\t\t\t\terrors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an owning relation`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!targetField.inversedBy) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} inverse relation is not set`)\n\t\t\t}\n\t\t\tif (targetField.inversedBy !== field.name) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t} else {\n\t\t\tconst inversedBy = field.inversedBy\n\t\t\tif (targetEntity.view) {\n\t\t\t\tif ('joiningColumn' in field) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', `View entity ${targetEntity.name} cannot be referenced from an owning relation. Try switching the owning side.`)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (inversedBy) {\n\t\t\t\tconst targetField = targetEntity.fields[inversedBy]\n\t\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`\n\t\t\t\tif (!targetField) {\n\t\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t\t}\n\t\t\t\tif (!isRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t\t}\n\t\t\t\tif (targetField.target !== entityName) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t\t}\n\t\t\t\tif (!isInverseRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an inverse relation`)\n\t\t\t\t}\n\t\t\t\tif (!targetField.ownedBy) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} owning relation is not set`)\n\t\t\t\t}\n\t\t\t\tif (targetField.ownedBy !== field.name) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateIdentifier(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (!value.match(IDENTIFIER_PATTERN)) {\n\t\t\treturn errorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} must match pattern ${IDENTIFIER_PATTERN.source}`)\n\t\t}\n\t\tif (RESERVED_WORDS.includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateEntityName(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (['Query', 'Mutation'].includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_ENTITY_NAME', `${value} is reserved word`)\n\t\t}\n\t}\n\n\n\tprivate validateMetaSuffixCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst entityNames = new Set(entities.map(it => it.name))\n\t\tfor (const entity of entities) {\n\t\t\tif (entity.name.endsWith('Meta')) {\n\t\t\t\tconst baseName = entity.name.substring(0, entity.name.length - 4)\n\t\t\t\tif (entityNames.has(baseName)) {\n\t\t\t\t\terrorBuilder.for(entity.name)\n\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with \"Meta\" suffix is created for every entity`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\tprivate validateTableNameCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst relationNames: Record<string, string> = {}\n\t\tfor (const entity of entities) {\n\t\t\tconst description = `table name ${entity.tableName} of entity ${entity.name}`\n\t\t\tif (relationNames[entity.tableName]) {\n\t\t\t\terrorBuilder\n\t\t\t\t\t.for(entity.name)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `${description} collides with a ${relationNames[entity.tableName]}`)\n\t\t\t} else {\n\t\t\t\trelationNames[entity.tableName] = description\n\t\t\t}\n\t\t}\n\t\tfor (const entity of entities) {\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entity.name)\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\t\tconst joiningTable = relation.joiningTable\n\t\t\t\t\tconst description = `joining table name ${joiningTable.tableName} of relation ${entity.name}::${relation.name}`\n\t\t\t\t\tif (relationNames[joiningTable.tableName]) {\n\t\t\t\t\t\tentityErrorBuilder\n\t\t\t\t\t\t\t.for(relation.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t\t`${description} collides with a ${relationNames[joiningTable.tableName]}.` +\n\t\t\t\t\t\t\t\t'Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelationNames[joiningTable.tableName] = description\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitColumn: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n\n\n\tprivate validateAliasedTypesCollision(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst aliasedTypes = new Map<string, Model.ColumnType>()\n\t\tfor (const entity of entities) {\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\t\tif (!column.typeAlias) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {\n\t\t\t\t\t\terrorBuilder\n\t\t\t\t\t\t\t.for(column.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Type alias ${column.typeAlias} already exists for base type ${column.type}`)\n\t\t\t\t\t}\n\t\t\t\t\taliasedTypes.set(column.typeAlias, column.type)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: () => { },\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n}\n\nconst isRelation = (field: Model.AnyField): field is Model.AnyRelation =>\n\tObject.values(Model.RelationType).includes(field.type as Model.RelationType)\n"],"names":["ErrorBuilder","errors","isColumn","acceptEveryFieldVisitor","targetEntity","getTargetEntity","Model","isInverseRelation","isOwningRelation","entity"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Model } from "@contember/schema";
2
2
  import { ErrorBuilder } from "./errors.js";
3
- import { acceptEveryFieldVisitor, getTargetEntity, isInverseRelation, isOwningRelation } from "../model/modelUtils.js";
3
+ import { isColumn, acceptEveryFieldVisitor, getTargetEntity, isInverseRelation, isOwningRelation } from "../model/modelUtils.js";
4
4
  const IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
5
5
  const RESERVED_WORDS = ["and", "or", "not"];
6
6
  class ModelValidator {
@@ -45,17 +45,22 @@ class ModelValidator {
45
45
  }
46
46
  }
47
47
  this.validateUniqueConstraints(
48
- entity.unique,
49
- new Set(Object.keys(entity.fields)),
48
+ entity,
50
49
  errors.for("unique")
51
50
  );
52
51
  this.validateColumnNamesCollision(entity, errors);
53
52
  }
54
- validateUniqueConstraints(uniqueConstraints, fields, errors) {
55
- for (const constraint of uniqueConstraints) {
53
+ validateUniqueConstraints(entity, errors) {
54
+ for (const constraint of entity.unique) {
55
+ if (entity.view && !constraint.index) {
56
+ errors.add("MODEL_INVALID_CONSTRAINT", "Unique constraint on view entity must be an index. Please set index: true");
57
+ }
56
58
  for (const field of constraint.fields) {
57
- if (!fields.has(field)) {
59
+ const fieldDef = entity.fields[field];
60
+ if (!fieldDef) {
58
61
  errors.add("MODEL_UNDEFINED_FIELD", `Referenced field ${field} in a constraint does not exists`);
62
+ } else if (isColumn(fieldDef) && fieldDef.list) {
63
+ errors.add("MODEL_INVALID_FIELD", `Field ${field} in a unique constraint cannot be an array`);
59
64
  }
60
65
  }
61
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ModelValidator.js","sources":["../../../../../packages/schema-utils/src/validation/ModelValidator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptEveryFieldVisitor, getTargetEntity, isInverseRelation, isOwningRelation } from '../model'\n\nconst IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/\nconst RESERVED_WORDS = ['and', 'or', 'not']\n\n\nexport class ModelValidator {\n\tconstructor(private readonly model: Model.Schema) { }\n\n\tpublic validate(): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], [])\n\t\tthis.validateEnums(this.model.enums, errorBuilder.for('enums'))\n\t\tthis.validateEntities(this.model.entities, errorBuilder.for('entities'))\n\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEnums(enums: Model.Schema['enums'], errors: ErrorBuilder): void {\n\t\tfor (const [enumName, enumValues] of Object.entries(enums)) {\n\t\t\tfor (const value of enumValues) {\n\t\t\t\tconst valueErrors = errors.for(enumName, value)\n\t\t\t\tthis.validateIdentifier(value, valueErrors)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateEntities(entities: Model.Schema['entities'], errors: ErrorBuilder): void {\n\t\tfor (const [entityName, entity] of Object.entries(entities)) {\n\t\t\tconst entityErrors = errors.for(entityName)\n\t\t\tif (entity.name !== entityName) {\n\t\t\t\tentityErrors.add('MODEL_NAME_MISMATCH', `Entity name \"${entity.name}\" does not match the name in a map \"${entityName}\"`)\n\t\t\t}\n\t\t\tthis.validateEntity(entity, entityErrors)\n\t\t}\n\t\tconst entitiesArr = Object.values(this.model.entities)\n\t\tthis.validateMetaSuffixCollisions(entitiesArr, errors)\n\t\tthis.validateTableNameCollisions(entitiesArr, errors)\n\t\tthis.validateAliasedTypesCollision(entitiesArr, errors)\n\t}\n\n\tprivate validateEntity(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(entity.name, errors)\n\t\tthis.validateEntityName(entity.name, errors)\n\n\t\tfor (const [fieldName, field] of Object.entries(entity.fields)) {\n\t\t\tconst fieldErrors = errors.for(fieldName)\n\t\t\tthis.validateField(entity, field, fieldErrors)\n\t\t\tif (field.name !== fieldName) {\n\t\t\t\tfieldErrors.add('MODEL_NAME_MISMATCH', `Field name \"${field.name}\" does not match the name in a map \"${fieldName}\"`)\n\t\t\t}\n\t\t}\n\t\tthis.validateUniqueConstraints(\n\t\t\tentity.unique,\n\t\t\tnew Set(Object.keys(entity.fields)),\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(uniqueConstraints: Model.Entity['unique'], fields: Set<string>, errors: ErrorBuilder): void {\n\t\tfor (const constraint of uniqueConstraints) {\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tif (!fields.has(field)) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateColumnNamesCollision(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tconst existingColumnNames = new Map<string, string>()\n\t\tconst addColumnName = (fieldName: string, columnName: string) => {\n\t\t\tif (existingColumnNames.has(columnName)) {\n\t\t\t\tconst exitingName = existingColumnNames.get(columnName)\n\t\t\t\terrors\n\t\t\t\t\t.for(fieldName)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Column name \"${columnName}\" on field \"${fieldName}\" collides with a column name on field \"${exitingName}\".`)\n\t\t\t}\n\t\t\texistingColumnNames.set(columnName, fieldName)\n\t\t}\n\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\taddColumnName(column.name, column.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\tvisitOneHasMany: () => {},\n\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\tvisitManyHasManyOwning: () => {},\n\t\t})\n\t}\n\n\tprivate validateField(partialEntity: Model.Entity, field: Model.AnyField, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(field.name, errors)\n\t\tif (isRelation(field)) {\n\t\t\tthis.validateRelation(partialEntity, field, errors)\n\t\t} else {\n\t\t\tif (field.sequence && field.nullable) {\n\t\t\t\terrors.add('MODEL_INVALID_COLUMN_DEFINITION', 'Column with sequence cannot be nullable.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateRelation(partialEntity: Model.Entity, field: Model.AnyRelation, errors: ErrorBuilder): void {\n\t\tconst entityName = partialEntity.name\n\t\tconst targetEntityName = field.target\n\t\tconst targetEntity = this.model.entities[targetEntityName] || undefined\n\t\tif (!targetEntity) {\n\t\t\treturn errors.add('MODEL_UNDEFINED_ENTITY', `Target entity ${targetEntityName} not found`)\n\t\t}\n\t\tif (((it: Model.AnyRelation): it is Model.AnyRelation & Model.OrderableRelation => 'orderBy' in it)(field)) {\n\t\t\t(field as Model.OrderableRelation).orderBy?.forEach(it => {\n\t\t\t\tlet entity = targetEntity\n\n\t\t\t\tfor (let i = 0; i < it.path.length; i++) {\n\t\t\t\t\tconst orderByField = entity.fields[it.path[i]]\n\t\t\t\t\tconst pathStr = it.path.slice(0, i + 1).join('.')\n\t\t\t\t\tif (!orderByField) {\n\t\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (i + 1 < it.path.length) {\n\t\t\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, orderByField.name)\n\t\t\t\t\t\tif (!targetEntity) {\n\t\t\t\t\t\t\terrors.add('MODEL_RELATION_REQUIRED', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity = targetEntity\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (partialEntity.view) {\n\t\t\tif (field.type === Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'Many-has-many relation is not allowed on a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasMany\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-many relation fields on views must point to a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasOne &&\n\t\t\t\t!('joiningColumn' in field)\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-one relation fields on views must be owning or point to a view entity.')\n\t\t\t}\n\t\t}\n\t\tif (isInverseRelation(field)) {\n\t\t\tconst ownedBy = field.ownedBy\n\t\t\tconst targetField = targetEntity.fields[ownedBy]\n\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`\n\t\t\tif (!targetField) {\n\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t}\n\n\t\t\tif (!isRelation(targetField)) {\n\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t}\n\t\t\tif (targetField.target !== entityName) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t}\n\t\t\tif (!isOwningRelation(targetField)) {\n\t\t\t\terrors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an owning relation`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!targetField.inversedBy) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} inverse relation is not set`)\n\t\t\t}\n\t\t\tif (targetField.inversedBy !== field.name) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t} else {\n\t\t\tconst inversedBy = field.inversedBy\n\t\t\tif (targetEntity.view) {\n\t\t\t\tif ('joiningColumn' in field) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', `View entity ${targetEntity.name} cannot be referenced from an owning relation. Try switching the owning side.`)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (inversedBy) {\n\t\t\t\tconst targetField = targetEntity.fields[inversedBy]\n\t\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`\n\t\t\t\tif (!targetField) {\n\t\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t\t}\n\t\t\t\tif (!isRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t\t}\n\t\t\t\tif (targetField.target !== entityName) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t\t}\n\t\t\t\tif (!isInverseRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an inverse relation`)\n\t\t\t\t}\n\t\t\t\tif (!targetField.ownedBy) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} owning relation is not set`)\n\t\t\t\t}\n\t\t\t\tif (targetField.ownedBy !== field.name) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateIdentifier(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (!value.match(IDENTIFIER_PATTERN)) {\n\t\t\treturn errorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} must match pattern ${IDENTIFIER_PATTERN.source}`)\n\t\t}\n\t\tif (RESERVED_WORDS.includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateEntityName(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (['Query', 'Mutation'].includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_ENTITY_NAME', `${value} is reserved word`)\n\t\t}\n\t}\n\n\n\tprivate validateMetaSuffixCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst entityNames = new Set(entities.map(it => it.name))\n\t\tfor (const entity of entities) {\n\t\t\tif (entity.name.endsWith('Meta')) {\n\t\t\t\tconst baseName = entity.name.substring(0, entity.name.length - 4)\n\t\t\t\tif (entityNames.has(baseName)) {\n\t\t\t\t\terrorBuilder.for(entity.name)\n\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with \"Meta\" suffix is created for every entity`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\tprivate validateTableNameCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst relationNames: Record<string, string> = {}\n\t\tfor (const entity of entities) {\n\t\t\tconst description = `table name ${entity.tableName} of entity ${entity.name}`\n\t\t\tif (relationNames[entity.tableName]) {\n\t\t\t\terrorBuilder\n\t\t\t\t\t.for(entity.name)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `${description} collides with a ${relationNames[entity.tableName]}`)\n\t\t\t} else {\n\t\t\t\trelationNames[entity.tableName] = description\n\t\t\t}\n\t\t}\n\t\tfor (const entity of entities) {\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entity.name)\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\t\tconst joiningTable = relation.joiningTable\n\t\t\t\t\tconst description = `joining table name ${joiningTable.tableName} of relation ${entity.name}::${relation.name}`\n\t\t\t\t\tif (relationNames[joiningTable.tableName]) {\n\t\t\t\t\t\tentityErrorBuilder\n\t\t\t\t\t\t\t.for(relation.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t\t`${description} collides with a ${relationNames[joiningTable.tableName]}.` +\n\t\t\t\t\t\t\t\t'Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelationNames[joiningTable.tableName] = description\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitColumn: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n\n\n\tprivate validateAliasedTypesCollision(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst aliasedTypes = new Map<string, Model.ColumnType>()\n\t\tfor (const entity of entities) {\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\t\tif (!column.typeAlias) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {\n\t\t\t\t\t\terrorBuilder\n\t\t\t\t\t\t\t.for(column.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Type alias ${column.typeAlias} already exists for base type ${column.type}`)\n\t\t\t\t\t}\n\t\t\t\t\taliasedTypes.set(column.typeAlias, column.type)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: () => { },\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n}\n\nconst isRelation = (field: Model.AnyField): field is Model.AnyRelation =>\n\tObject.values(Model.RelationType).includes(field.type as Model.RelationType)\n"],"names":["targetEntity","entity"],"mappings":"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"}
1
+ {"version":3,"file":"ModelValidator.js","sources":["../../../../../packages/schema-utils/src/validation/ModelValidator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptEveryFieldVisitor, getTargetEntity, isColumn, isInverseRelation, isOwningRelation } from '../model'\n\nconst IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/\nconst RESERVED_WORDS = ['and', 'or', 'not']\n\n\nexport class ModelValidator {\n\tconstructor(private readonly model: Model.Schema) { }\n\n\tpublic validate(): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], [])\n\t\tthis.validateEnums(this.model.enums, errorBuilder.for('enums'))\n\t\tthis.validateEntities(this.model.entities, errorBuilder.for('entities'))\n\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEnums(enums: Model.Schema['enums'], errors: ErrorBuilder): void {\n\t\tfor (const [enumName, enumValues] of Object.entries(enums)) {\n\t\t\tfor (const value of enumValues) {\n\t\t\t\tconst valueErrors = errors.for(enumName, value)\n\t\t\t\tthis.validateIdentifier(value, valueErrors)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateEntities(entities: Model.Schema['entities'], errors: ErrorBuilder): void {\n\t\tfor (const [entityName, entity] of Object.entries(entities)) {\n\t\t\tconst entityErrors = errors.for(entityName)\n\t\t\tif (entity.name !== entityName) {\n\t\t\t\tentityErrors.add('MODEL_NAME_MISMATCH', `Entity name \"${entity.name}\" does not match the name in a map \"${entityName}\"`)\n\t\t\t}\n\t\t\tthis.validateEntity(entity, entityErrors)\n\t\t}\n\t\tconst entitiesArr = Object.values(this.model.entities)\n\t\tthis.validateMetaSuffixCollisions(entitiesArr, errors)\n\t\tthis.validateTableNameCollisions(entitiesArr, errors)\n\t\tthis.validateAliasedTypesCollision(entitiesArr, errors)\n\t}\n\n\tprivate validateEntity(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(entity.name, errors)\n\t\tthis.validateEntityName(entity.name, errors)\n\n\t\tfor (const [fieldName, field] of Object.entries(entity.fields)) {\n\t\t\tconst fieldErrors = errors.for(fieldName)\n\t\t\tthis.validateField(entity, field, fieldErrors)\n\t\t\tif (field.name !== fieldName) {\n\t\t\t\tfieldErrors.add('MODEL_NAME_MISMATCH', `Field name \"${field.name}\" does not match the name in a map \"${fieldName}\"`)\n\t\t\t}\n\t\t}\n\t\tthis.validateUniqueConstraints(\n\t\t\tentity,\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tfor (const constraint of entity.unique) {\n\t\t\tif (entity.view && !constraint.index) {\n\t\t\t\terrors.add('MODEL_INVALID_CONSTRAINT', 'Unique constraint on view entity must be an index. Please set index: true')\n\t\t\t}\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tconst fieldDef = entity.fields[field]\n\t\t\t\tif (!fieldDef) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\n\t\t\t\t} else if (isColumn(fieldDef) && fieldDef.list) {\n\t\t\t\t\terrors.add('MODEL_INVALID_FIELD', `Field ${field} in a unique constraint cannot be an array`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateColumnNamesCollision(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tconst existingColumnNames = new Map<string, string>()\n\t\tconst addColumnName = (fieldName: string, columnName: string) => {\n\t\t\tif (existingColumnNames.has(columnName)) {\n\t\t\t\tconst exitingName = existingColumnNames.get(columnName)\n\t\t\t\terrors\n\t\t\t\t\t.for(fieldName)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Column name \"${columnName}\" on field \"${fieldName}\" collides with a column name on field \"${exitingName}\".`)\n\t\t\t}\n\t\t\texistingColumnNames.set(columnName, fieldName)\n\t\t}\n\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\taddColumnName(column.name, column.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\tvisitOneHasMany: () => {},\n\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\tvisitManyHasManyOwning: () => {},\n\t\t})\n\t}\n\n\tprivate validateField(partialEntity: Model.Entity, field: Model.AnyField, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(field.name, errors)\n\t\tif (isRelation(field)) {\n\t\t\tthis.validateRelation(partialEntity, field, errors)\n\t\t} else {\n\t\t\tif (field.sequence && field.nullable) {\n\t\t\t\terrors.add('MODEL_INVALID_COLUMN_DEFINITION', 'Column with sequence cannot be nullable.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateRelation(partialEntity: Model.Entity, field: Model.AnyRelation, errors: ErrorBuilder): void {\n\t\tconst entityName = partialEntity.name\n\t\tconst targetEntityName = field.target\n\t\tconst targetEntity = this.model.entities[targetEntityName] || undefined\n\t\tif (!targetEntity) {\n\t\t\treturn errors.add('MODEL_UNDEFINED_ENTITY', `Target entity ${targetEntityName} not found`)\n\t\t}\n\t\tif (((it: Model.AnyRelation): it is Model.AnyRelation & Model.OrderableRelation => 'orderBy' in it)(field)) {\n\t\t\t(field as Model.OrderableRelation).orderBy?.forEach(it => {\n\t\t\t\tlet entity = targetEntity\n\n\t\t\t\tfor (let i = 0; i < it.path.length; i++) {\n\t\t\t\t\tconst orderByField = entity.fields[it.path[i]]\n\t\t\t\t\tconst pathStr = it.path.slice(0, i + 1).join('.')\n\t\t\t\t\tif (!orderByField) {\n\t\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (i + 1 < it.path.length) {\n\t\t\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, orderByField.name)\n\t\t\t\t\t\tif (!targetEntity) {\n\t\t\t\t\t\t\terrors.add('MODEL_RELATION_REQUIRED', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity = targetEntity\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (partialEntity.view) {\n\t\t\tif (field.type === Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'Many-has-many relation is not allowed on a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasMany\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-many relation fields on views must point to a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasOne &&\n\t\t\t\t!('joiningColumn' in field)\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-one relation fields on views must be owning or point to a view entity.')\n\t\t\t}\n\t\t}\n\t\tif (isInverseRelation(field)) {\n\t\t\tconst ownedBy = field.ownedBy\n\t\t\tconst targetField = targetEntity.fields[ownedBy]\n\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`\n\t\t\tif (!targetField) {\n\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t}\n\n\t\t\tif (!isRelation(targetField)) {\n\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t}\n\t\t\tif (targetField.target !== entityName) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t}\n\t\t\tif (!isOwningRelation(targetField)) {\n\t\t\t\terrors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an owning relation`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!targetField.inversedBy) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} inverse relation is not set`)\n\t\t\t}\n\t\t\tif (targetField.inversedBy !== field.name) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t} else {\n\t\t\tconst inversedBy = field.inversedBy\n\t\t\tif (targetEntity.view) {\n\t\t\t\tif ('joiningColumn' in field) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', `View entity ${targetEntity.name} cannot be referenced from an owning relation. Try switching the owning side.`)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (inversedBy) {\n\t\t\t\tconst targetField = targetEntity.fields[inversedBy]\n\t\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`\n\t\t\t\tif (!targetField) {\n\t\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t\t}\n\t\t\t\tif (!isRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t\t}\n\t\t\t\tif (targetField.target !== entityName) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t\t}\n\t\t\t\tif (!isInverseRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an inverse relation`)\n\t\t\t\t}\n\t\t\t\tif (!targetField.ownedBy) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} owning relation is not set`)\n\t\t\t\t}\n\t\t\t\tif (targetField.ownedBy !== field.name) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateIdentifier(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (!value.match(IDENTIFIER_PATTERN)) {\n\t\t\treturn errorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} must match pattern ${IDENTIFIER_PATTERN.source}`)\n\t\t}\n\t\tif (RESERVED_WORDS.includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateEntityName(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (['Query', 'Mutation'].includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_ENTITY_NAME', `${value} is reserved word`)\n\t\t}\n\t}\n\n\n\tprivate validateMetaSuffixCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst entityNames = new Set(entities.map(it => it.name))\n\t\tfor (const entity of entities) {\n\t\t\tif (entity.name.endsWith('Meta')) {\n\t\t\t\tconst baseName = entity.name.substring(0, entity.name.length - 4)\n\t\t\t\tif (entityNames.has(baseName)) {\n\t\t\t\t\terrorBuilder.for(entity.name)\n\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with \"Meta\" suffix is created for every entity`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\tprivate validateTableNameCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst relationNames: Record<string, string> = {}\n\t\tfor (const entity of entities) {\n\t\t\tconst description = `table name ${entity.tableName} of entity ${entity.name}`\n\t\t\tif (relationNames[entity.tableName]) {\n\t\t\t\terrorBuilder\n\t\t\t\t\t.for(entity.name)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `${description} collides with a ${relationNames[entity.tableName]}`)\n\t\t\t} else {\n\t\t\t\trelationNames[entity.tableName] = description\n\t\t\t}\n\t\t}\n\t\tfor (const entity of entities) {\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entity.name)\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\t\tconst joiningTable = relation.joiningTable\n\t\t\t\t\tconst description = `joining table name ${joiningTable.tableName} of relation ${entity.name}::${relation.name}`\n\t\t\t\t\tif (relationNames[joiningTable.tableName]) {\n\t\t\t\t\t\tentityErrorBuilder\n\t\t\t\t\t\t\t.for(relation.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t\t`${description} collides with a ${relationNames[joiningTable.tableName]}.` +\n\t\t\t\t\t\t\t\t'Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelationNames[joiningTable.tableName] = description\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitColumn: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n\n\n\tprivate validateAliasedTypesCollision(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst aliasedTypes = new Map<string, Model.ColumnType>()\n\t\tfor (const entity of entities) {\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\t\tif (!column.typeAlias) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {\n\t\t\t\t\t\terrorBuilder\n\t\t\t\t\t\t\t.for(column.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Type alias ${column.typeAlias} already exists for base type ${column.type}`)\n\t\t\t\t\t}\n\t\t\t\t\taliasedTypes.set(column.typeAlias, column.type)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: () => { },\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n}\n\nconst isRelation = (field: Model.AnyField): field is Model.AnyRelation =>\n\tObject.values(Model.RelationType).includes(field.type as Model.RelationType)\n"],"names":["targetEntity","entity"],"mappings":"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"}