@contember/schema-utils 2.1.0-beta.1 → 2.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs +11 -0
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +11 -0
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
- package/dist/development/src/acl/PredicateDefinitionProcessor.js.map +1 -1
- package/dist/development/src/dataUtils.cjs +1 -0
- package/dist/development/src/dataUtils.cjs.map +1 -1
- package/dist/development/src/dataUtils.js +1 -0
- package/dist/development/src/dataUtils.js.map +1 -1
- package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
- package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs +37 -2
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.js +37 -2
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
- package/dist/development/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -1
- package/dist/development/src/definition-generator/TsDefinitionGenerator.js.map +1 -1
- package/dist/development/src/json-schema/collectUnsupportedKeywords.cjs +45 -0
- package/dist/development/src/json-schema/collectUnsupportedKeywords.cjs.map +1 -0
- package/dist/development/src/json-schema/collectUnsupportedKeywords.js +45 -0
- package/dist/development/src/json-schema/collectUnsupportedKeywords.js.map +1 -0
- package/dist/development/src/json-schema/jsonSchemaToTsType.cjs +138 -0
- package/dist/development/src/json-schema/jsonSchemaToTsType.cjs.map +1 -0
- package/dist/development/src/json-schema/jsonSchemaToTsType.js +138 -0
- package/dist/development/src/json-schema/jsonSchemaToTsType.js.map +1 -0
- package/dist/development/src/json-schema/keywords.cjs +57 -0
- package/dist/development/src/json-schema/keywords.cjs.map +1 -0
- package/dist/development/src/json-schema/keywords.js +57 -0
- package/dist/development/src/json-schema/keywords.js.map +1 -0
- package/dist/development/src/lax/LaxSchemaConverter.cjs.map +1 -1
- package/dist/development/src/lax/LaxSchemaConverter.js.map +1 -1
- package/dist/development/src/model/modelUtils.cjs.map +1 -1
- package/dist/development/src/model/modelUtils.js.map +1 -1
- package/dist/development/src/model/resolveDefaultColumnType.cjs +2 -0
- package/dist/development/src/model/resolveDefaultColumnType.cjs.map +1 -1
- package/dist/development/src/model/resolveDefaultColumnType.js +2 -0
- package/dist/development/src/model/resolveDefaultColumnType.js.map +1 -1
- package/dist/development/src/schemaNormalizer.cjs.map +1 -1
- package/dist/development/src/schemaNormalizer.js.map +1 -1
- package/dist/development/src/type-schema/acl.cjs.map +1 -1
- package/dist/development/src/type-schema/acl.js.map +1 -1
- package/dist/development/src/type-schema/condition.cjs +6 -1
- package/dist/development/src/type-schema/condition.cjs.map +1 -1
- package/dist/development/src/type-schema/condition.js +6 -1
- package/dist/development/src/type-schema/condition.js.map +1 -1
- package/dist/development/src/type-schema/model.cjs +14 -2
- package/dist/development/src/type-schema/model.cjs.map +1 -1
- package/dist/development/src/type-schema/model.js +14 -2
- package/dist/development/src/type-schema/model.js.map +1 -1
- package/dist/development/src/type-schema/settings.cjs +4 -0
- package/dist/development/src/type-schema/settings.cjs.map +1 -1
- package/dist/development/src/type-schema/settings.js +4 -0
- package/dist/development/src/type-schema/settings.js.map +1 -1
- package/dist/development/src/type-schema/where.cjs.map +1 -1
- package/dist/development/src/type-schema/where.js.map +1 -1
- package/dist/development/src/validation/AclValidator.cjs.map +1 -1
- package/dist/development/src/validation/AclValidator.js.map +1 -1
- package/dist/development/src/validation/ActionsValidator.cjs.map +1 -1
- package/dist/development/src/validation/ActionsValidator.js.map +1 -1
- package/dist/development/src/validation/MembershipResolver.cjs.map +1 -1
- package/dist/development/src/validation/MembershipResolver.js.map +1 -1
- package/dist/development/src/validation/ModelValidator.cjs +66 -0
- package/dist/development/src/validation/ModelValidator.cjs.map +1 -1
- package/dist/development/src/validation/ModelValidator.js +66 -0
- package/dist/development/src/validation/ModelValidator.js.map +1 -1
- package/dist/development/src/validation/SchemaValidator.cjs.map +1 -1
- package/dist/development/src/validation/SchemaValidator.js.map +1 -1
- package/dist/development/src/validation/ValidationValidator.cjs.map +1 -1
- package/dist/development/src/validation/ValidationValidator.js.map +1 -1
- package/dist/development/src/validation/errors.cjs.map +1 -1
- package/dist/development/src/validation/errors.js.map +1 -1
- package/dist/production/index.cjs +11 -0
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +11 -0
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
- package/dist/production/src/acl/PredicateDefinitionProcessor.js.map +1 -1
- package/dist/production/src/dataUtils.cjs +1 -0
- package/dist/production/src/dataUtils.cjs.map +1 -1
- package/dist/production/src/dataUtils.js +1 -0
- package/dist/production/src/dataUtils.js.map +1 -1
- package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
- package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs +37 -2
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.js +37 -2
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
- package/dist/production/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -1
- package/dist/production/src/definition-generator/TsDefinitionGenerator.js.map +1 -1
- package/dist/production/src/json-schema/collectUnsupportedKeywords.cjs +45 -0
- package/dist/production/src/json-schema/collectUnsupportedKeywords.cjs.map +1 -0
- package/dist/production/src/json-schema/collectUnsupportedKeywords.js +45 -0
- package/dist/production/src/json-schema/collectUnsupportedKeywords.js.map +1 -0
- package/dist/production/src/json-schema/jsonSchemaToTsType.cjs +138 -0
- package/dist/production/src/json-schema/jsonSchemaToTsType.cjs.map +1 -0
- package/dist/production/src/json-schema/jsonSchemaToTsType.js +138 -0
- package/dist/production/src/json-schema/jsonSchemaToTsType.js.map +1 -0
- package/dist/production/src/json-schema/keywords.cjs +57 -0
- package/dist/production/src/json-schema/keywords.cjs.map +1 -0
- package/dist/production/src/json-schema/keywords.js +57 -0
- package/dist/production/src/json-schema/keywords.js.map +1 -0
- package/dist/production/src/lax/LaxSchemaConverter.cjs.map +1 -1
- package/dist/production/src/lax/LaxSchemaConverter.js.map +1 -1
- package/dist/production/src/model/modelUtils.cjs.map +1 -1
- package/dist/production/src/model/modelUtils.js.map +1 -1
- package/dist/production/src/model/resolveDefaultColumnType.cjs +2 -0
- package/dist/production/src/model/resolveDefaultColumnType.cjs.map +1 -1
- package/dist/production/src/model/resolveDefaultColumnType.js +2 -0
- package/dist/production/src/model/resolveDefaultColumnType.js.map +1 -1
- package/dist/production/src/schemaNormalizer.cjs.map +1 -1
- package/dist/production/src/schemaNormalizer.js.map +1 -1
- package/dist/production/src/type-schema/acl.cjs.map +1 -1
- package/dist/production/src/type-schema/acl.js.map +1 -1
- package/dist/production/src/type-schema/condition.cjs +6 -1
- package/dist/production/src/type-schema/condition.cjs.map +1 -1
- package/dist/production/src/type-schema/condition.js +6 -1
- package/dist/production/src/type-schema/condition.js.map +1 -1
- package/dist/production/src/type-schema/model.cjs +14 -2
- package/dist/production/src/type-schema/model.cjs.map +1 -1
- package/dist/production/src/type-schema/model.js +14 -2
- package/dist/production/src/type-schema/model.js.map +1 -1
- package/dist/production/src/type-schema/settings.cjs +4 -0
- package/dist/production/src/type-schema/settings.cjs.map +1 -1
- package/dist/production/src/type-schema/settings.js +4 -0
- package/dist/production/src/type-schema/settings.js.map +1 -1
- package/dist/production/src/type-schema/where.cjs.map +1 -1
- package/dist/production/src/type-schema/where.js.map +1 -1
- package/dist/production/src/validation/AclValidator.cjs.map +1 -1
- package/dist/production/src/validation/AclValidator.js.map +1 -1
- package/dist/production/src/validation/ActionsValidator.cjs.map +1 -1
- package/dist/production/src/validation/ActionsValidator.js.map +1 -1
- package/dist/production/src/validation/MembershipResolver.cjs.map +1 -1
- package/dist/production/src/validation/MembershipResolver.js.map +1 -1
- package/dist/production/src/validation/ModelValidator.cjs +66 -0
- package/dist/production/src/validation/ModelValidator.cjs.map +1 -1
- package/dist/production/src/validation/ModelValidator.js +66 -0
- package/dist/production/src/validation/ModelValidator.js.map +1 -1
- package/dist/production/src/validation/SchemaValidator.cjs.map +1 -1
- package/dist/production/src/validation/SchemaValidator.js.map +1 -1
- package/dist/production/src/validation/ValidationValidator.cjs.map +1 -1
- package/dist/production/src/validation/ValidationValidator.js.map +1 -1
- package/dist/production/src/validation/errors.cjs.map +1 -1
- package/dist/production/src/validation/errors.js.map +1 -1
- package/dist/tests/cases/unit/jsonSchemaKeywords.test.d.ts +2 -0
- package/dist/tests/cases/unit/jsonSchemaKeywords.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/jsonSchemaToTsType.test.d.ts +2 -0
- package/dist/tests/cases/unit/jsonSchemaToTsType.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/numericColumnCodeGenerator.test.d.ts +2 -0
- package/dist/tests/cases/unit/numericColumnCodeGenerator.test.d.ts.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/acl/index.d.ts +3 -3
- package/dist/types/acl/index.d.ts.map +1 -1
- package/dist/types/dataUtils.d.ts.map +1 -1
- package/dist/types/definition-generator/AclDefinitionCodeGenerator.d.ts +1 -1
- package/dist/types/definition-generator/AclDefinitionCodeGenerator.d.ts.map +1 -1
- package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts +3 -3
- package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts.map +1 -1
- package/dist/types/definition-generator/TsDefinitionGenerator.d.ts +1 -1
- package/dist/types/definition-generator/TsDefinitionGenerator.d.ts.map +1 -1
- package/dist/types/definition-generator/index.d.ts +4 -4
- package/dist/types/definition-generator/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +11 -10
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/json-schema/collectUnsupportedKeywords.d.ts +20 -0
- package/dist/types/json-schema/collectUnsupportedKeywords.d.ts.map +1 -0
- package/dist/types/json-schema/index.d.ts +4 -0
- package/dist/types/json-schema/index.d.ts.map +1 -0
- package/dist/types/json-schema/jsonSchemaToTsType.d.ts +24 -0
- package/dist/types/json-schema/jsonSchemaToTsType.d.ts.map +1 -0
- package/dist/types/json-schema/keywords.d.ts +28 -0
- package/dist/types/json-schema/keywords.d.ts.map +1 -0
- package/dist/types/lax/LaxSchemaConverter.d.ts +2 -2
- package/dist/types/lax/LaxSchemaConverter.d.ts.map +1 -1
- package/dist/types/lax/index.d.ts +2 -2
- package/dist/types/lax/index.d.ts.map +1 -1
- package/dist/types/model/index.d.ts +3 -3
- package/dist/types/model/index.d.ts.map +1 -1
- package/dist/types/model/resolveDefaultColumnType.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/type-schema/index.d.ts +5 -5
- package/dist/types/type-schema/index.d.ts.map +1 -1
- package/dist/types/type-schema/model.d.ts.map +1 -1
- package/dist/types/type-schema/settings.d.ts +14 -0
- package/dist/types/type-schema/settings.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +3 -3
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/validation/AclValidator.d.ts +1 -1
- package/dist/types/validation/AclValidator.d.ts.map +1 -1
- package/dist/types/validation/ActionsValidator.d.ts +1 -1
- package/dist/types/validation/ActionsValidator.d.ts.map +1 -1
- package/dist/types/validation/ModelValidator.d.ts +3 -1
- package/dist/types/validation/ModelValidator.d.ts.map +1 -1
- package/dist/types/validation/SchemaValidator.d.ts +1 -1
- package/dist/types/validation/SchemaValidator.d.ts.map +1 -1
- package/dist/types/validation/ValidationValidator.d.ts +1 -1
- package/dist/types/validation/ValidationValidator.d.ts.map +1 -1
- package/dist/types/validation/errors.d.ts +1 -1
- package/dist/types/validation/errors.d.ts.map +1 -1
- package/dist/types/validation/index.d.ts +6 -6
- package/dist/types/validation/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/acl/PredicateDefinitionProcessor.ts +1 -1
- package/src/acl/index.ts +3 -3
- package/src/dataUtils.ts +1 -0
- package/src/definition-generator/AclDefinitionCodeGenerator.ts +3 -3
- package/src/definition-generator/DefinitionCodeGenerator.ts +44 -7
- package/src/definition-generator/TsDefinitionGenerator.ts +2 -2
- package/src/definition-generator/index.ts +4 -4
- package/src/index.ts +14 -13
- package/src/json-schema/collectUnsupportedKeywords.ts +74 -0
- package/src/json-schema/index.ts +3 -0
- package/src/json-schema/jsonSchemaToTsType.ts +188 -0
- package/src/json-schema/keywords.ts +79 -0
- package/src/lax/LaxSchemaConverter.ts +3 -3
- package/src/lax/index.ts +2 -2
- package/src/model/index.ts +3 -3
- package/src/model/modelUtils.ts +1 -1
- package/src/model/resolveDefaultColumnType.ts +3 -1
- package/src/schemaNormalizer.ts +1 -1
- package/src/type-schema/acl.ts +1 -1
- package/src/type-schema/condition.ts +5 -0
- package/src/type-schema/index.ts +5 -5
- package/src/type-schema/model.ts +12 -0
- package/src/type-schema/settings.ts +4 -0
- package/src/type-schema/where.ts +2 -2
- package/src/utils/index.ts +3 -3
- package/src/validation/AclValidator.ts +4 -4
- package/src/validation/ActionsValidator.ts +4 -4
- package/src/validation/MembershipResolver.ts +3 -3
- package/src/validation/ModelValidator.ts +80 -2
- package/src/validation/SchemaValidator.ts +5 -5
- package/src/validation/ValidationValidator.ts +2 -2
- package/src/validation/errors.ts +2 -0
- package/src/validation/index.ts +6 -6
- package/tests/cases/unit/conditionSchema.test.ts +1 -1
- package/tests/cases/unit/deepCompare.test.ts +1 -1
- package/tests/cases/unit/jsonSchemaKeywords.test.ts +91 -0
- package/tests/cases/unit/jsonSchemaToTsType.test.ts +55 -0
- package/tests/cases/unit/laxSchemaConverter.test.ts +1 -1
- package/tests/cases/unit/membershipResolver.test.ts +1 -1
- package/tests/cases/unit/modelSchema.test.ts +1 -1
- package/tests/cases/unit/modelValidator.test.ts +246 -1
- package/tests/cases/unit/numericColumnCodeGenerator.test.ts +69 -0
- package/tests/cases/unit/printJsvalue.test.ts +1 -1
- package/tests/cases/unit/tsDefinitionGenerator.test.ts +46 -9
- package/tests/cases/unit/whereSchema.test.ts +2 -2
- package/vitest.config.ts +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefinitionCodeGenerator.js","sources":["../../../../../packages/schema-utils/src/definition-generator/DefinitionCodeGenerator.ts"],"sourcesContent":["import { Model, Schema, Writable } from '@contember/schema'\nimport { acceptFieldVisitor, DefaultNamingConventions, isInverseRelation, NamingConventions, resolveDefaultColumnType } from '../model'\nimport { printJsValue } from '../utils/printJsValue'\nimport { DefinitionNamingConventions } from './DefinitionNamingConventions'\nimport { AclDefinitionCodeGenerator } from './AclDefinitionCodeGenerator'\n\nexport class DefinitionCodeGenerator {\n\tconstructor(\n\t\tprivate readonly schemaNamingConventions: NamingConventions = new DefaultNamingConventions(),\n\t\tprivate readonly definitionNamingConventions = new DefinitionNamingConventions(),\n\t\tprivate readonly aclGenerator = new AclDefinitionCodeGenerator(),\n\t) {\n\t}\n\n\tpublic generate(schema: Schema) {\n\t\tconst roles = this.aclGenerator.generateRoles({ acl: schema.acl })\n\t\tconst aclVariables = this.aclGenerator.generateAclVariables({ acl: schema.acl })\n\t\tconst enums = Object.entries(schema.model.enums).map(([name, values]) => this.generateEnum({ name, values })).join('')\n\t\tconst entities = Object.values(schema.model.entities).map(entity => this.generateEntity({ entity, schema })).join('')\n\n\t\treturn `import { c } from '@contember/schema-definition'\\n${roles}${aclVariables}${enums}${entities}`\n\t}\n\n\tprivate generateEnum({ name, values }: { name: string; values: readonly string[] }): string {\n\t\treturn `\\nexport const ${this.formatIdentifier(name)} = c.createEnum(${values.map(it => printJsValue(it)).join(', ')})\\n`\n\t}\n\n\tpublic generateEntity({ entity, schema }: { entity: Model.Entity; schema: Schema }): string {\n\t\tconst uniqueConstraints = Object.values(entity.unique).map(constraint => this.generateUniqueConstraint({ entity, constraint }))\n\t\tconst indexes = Object.values(entity.indexes).map(index => this.generateIndex({ entity, index }))\n\t\tconst views = this.generateView({ entity })\n\n\t\tconst decorators = [...uniqueConstraints, ...indexes, views].filter(it => !!it).map(it => `${it}\\n`).join('')\n\t\tconst acl = this.aclGenerator.generateEntityAcl({ entity, schema })\n\n\t\treturn `\\n${decorators}${acl}export class ${this.formatIdentifier(entity.name)} {\n${Object.values(entity.fields).map(field => this.generateField({ field, entity, schema })).filter(it => !!it).join('\\n')}\n}\\n`\n\t}\n\n\tprivate generateUniqueConstraint({ entity, constraint }: { entity: Model.Entity; constraint: Model.UniqueConstraint | Model.UniqueIndex }): string {\n\t\tconst fieldsList = `${constraint.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Unique(${fieldsList})`\n\t}\n\n\tprivate generateIndex({ entity, index }: { entity: Model.Entity; index: Model.Index }): string {\n\t\tconst fieldsList = `${index.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Index(${fieldsList})`\n\t}\n\n\tprivate generateView({ entity }: { entity: Model.Entity }): string | undefined {\n\t\tif (!entity.view) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst dependenciesExpr = (entity.view.dependencies?.length ?? 0) > 0\n\t\t\t? `, {\\n\\tdependencies: () => [${entity.view.dependencies?.map(it => this.formatIdentifier(it))}]\\n}`\n\t\t\t: ''\n\n\t\treturn `@c.View(\\`${entity.view.sql}\\`${dependenciesExpr})`\n\t}\n\n\tpublic generateField({ entity, field, schema }: { entity: Model.Entity; field: Model.AnyField; schema: Schema }): string | undefined {\n\t\tconst formatRelationFactory = (method: string, relation: Model.AnyRelation) => {\n\t\t\tconst otherSide = isInverseRelation(relation) ? relation.ownedBy : relation.inversedBy\n\t\t\tconst otherSideFormatted = otherSide ? `, ${printJsValue(otherSide)}` : ''\n\t\t\treturn `${method}(${this.formatIdentifier(relation.target)}${otherSideFormatted})`\n\t\t}\n\t\tconst formatEnumRef = (enumName: string, enumValues: Record<string, string>, providedValue?: string, defaultValue?: string): string | undefined => {\n\t\t\tif (!providedValue || providedValue === defaultValue) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst enumValueKey = Object.entries(Model.OrderDirection).find(dir => dir[1] === providedValue)?.[0]\n\t\t\tif (!enumValueKey) {\n\t\t\t\tthrow new Error(`Value ${providedValue} is not defined in enum ${enumName}`)\n\t\t\t}\n\t\t\treturn `${enumName}.${enumValueKey}`\n\t\t}\n\t\tconst formatOrderBy = (orderBy?: readonly Model.OrderBy[]) => {\n\t\t\treturn orderBy?.map(it => {\n\t\t\t\tconst enumExpr = formatEnumRef(`Model.OrderDirection`, Model.OrderDirection, it.direction, Model.OrderDirection.asc)\n\t\t\t\treturn `orderBy(${printJsValue(it.path)}${enumExpr ? `, ${enumExpr}` : ''})`\n\t\t\t}) ?? []\n\t\t}\n\t\tconst formatOnDelete = (onDelete?: Model.OnDelete): string | undefined => {\n\t\t\tif (onDelete === Model.OnDelete.cascade) {\n\t\t\t\treturn 'cascadeOnDelete()'\n\t\t\t}\n\t\t\tif (onDelete === Model.OnDelete.setNull) {\n\t\t\t\treturn 'setNullOnDelete()'\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\tconst formatJoiningColumn = (joiningColumnName: string, fieldName: string): string | undefined => {\n\t\t\tconst defaultJoiningColumn = this.schemaNamingConventions.getJoiningColumnName(fieldName)\n\t\t\tif (defaultJoiningColumn === joiningColumnName) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn `joiningColumn(${printJsValue(joiningColumnName)})`\n\t\t}\n\t\tconst definition = acceptFieldVisitor<(string | undefined)[]>(schema.model, entity, field, {\n\t\t\tvisitColumn: ctx => {\n\t\t\t\treturn this.generateColumn(ctx)\n\t\t\t},\n\t\t\tvisitOneHasMany: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOneInverse', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t\trelation.orphanRemoval ? 'removeOrphan()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\tconst columnNames = this.schemaNamingConventions.getJoiningTableColumnNames(\n\t\t\t\t\tentity.name,\n\t\t\t\t\trelation.name,\n\t\t\t\t\trelation.target,\n\t\t\t\t\trelation.inversedBy,\n\t\t\t\t)\n\t\t\t\tconst defaultJoiningTable = this.schemaNamingConventions.getJoiningTableName(entity.name, relation.name)\n\t\t\t\tconst joiningTable: Writable<Partial<Model.JoiningTable>> = {}\n\t\t\t\tif (relation.joiningTable.tableName !== defaultJoiningTable) {\n\t\t\t\t\tjoiningTable.tableName = relation.joiningTable.tableName\n\t\t\t\t}\n\t\t\t\tif (!relation.joiningTable.eventLog.enabled) {\n\t\t\t\t\tjoiningTable.eventLog = { enabled: false }\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcolumnNames[0] !== relation.joiningTable.joiningColumn.columnName || relation.joiningTable.joiningColumn.onDelete !== Model.OnDelete.cascade\n\t\t\t\t) {\n\t\t\t\t\tjoiningTable.joiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.joiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcolumnNames[1] !== relation.joiningTable.inverseJoiningColumn.columnName\n\t\t\t\t\t|| relation.joiningTable.inverseJoiningColumn.onDelete !== Model.OnDelete.cascade\n\t\t\t\t) {\n\t\t\t\t\tjoiningTable.inverseJoiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.inverseJoiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t\tObject.keys(joiningTable).length > 0 ? `joiningTable(${printJsValue(joiningTable)})` : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasManyInverse', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t})\n\t\tconst definitionCode = definition.filter(it => !!it).join('.')\n\t\tif (field.name === 'id' && definitionCode === 'uuidColumn().notNull()') {\n\t\t\treturn undefined\n\t\t}\n\t\treturn `\\t${this.formatIdentifier(field.name)} = c.${definitionCode}`\n\t}\n\n\tprivate generateColumn({ entity, column }: { entity: Model.Entity; column: Model.AnyColumn }): string[] {\n\t\tlet parts: string[] = []\n\t\tif (column.type === Model.ColumnType.Enum) {\n\t\t\tparts.push(`enumColumn(${column.columnType})`)\n\t\t} else {\n\t\t\tparts.push(`${ColumnToMethodMapping[column.type]}()`)\n\t\t\tconst defaultColumnType = resolveDefaultColumnType(column.type)\n\t\t\tif (defaultColumnType !== column.columnType) {\n\t\t\t\tparts.push(`columnType(${printJsValue(column.columnType)})`)\n\t\t\t}\n\t\t}\n\t\tconst defaultColumnName = this.schemaNamingConventions.getColumnName(column.name)\n\t\tif (defaultColumnName !== column.columnName) {\n\t\t\tparts.push(`columnName(${printJsValue(column.columnName)})`)\n\t\t}\n\t\tif (!column.nullable) {\n\t\t\tparts.push('notNull()')\n\t\t}\n\t\tif (column.default !== undefined) {\n\t\t\tparts.push(`default(${printJsValue(column.default)})`)\n\t\t}\n\t\tif (column.typeAlias) {\n\t\t\tparts.push(`typeAlias(${printJsValue(column.typeAlias)})`)\n\t\t}\n\n\t\t// todo: sequence\n\t\t// todo: maybe single column unique()\n\n\t\treturn parts\n\t}\n\n\tprivate formatIdentifier(id: string): string {\n\t\treturn this.definitionNamingConventions.formatIdentifier(id)\n\t}\n}\n\nconst ColumnToMethodMapping: {\n\t[K in Exclude<Model.ColumnType, Model.ColumnType.Enum>]: string\n} = {\n\t[Model.ColumnType.Bool]: 'boolColumn',\n\t[Model.ColumnType.Date]: 'dateColumn',\n\t[Model.ColumnType.DateTime]: 'dateTimeColumn',\n\t[Model.ColumnType.Time]: 'timeColumn',\n\t[Model.ColumnType.Json]: 'jsonColumn',\n\t[Model.ColumnType.Double]: 'doubleColumn',\n\t[Model.ColumnType.Uuid]: 'uuidColumn',\n\t[Model.ColumnType.Int]: 'intColumn',\n\t[Model.ColumnType.String]: 'stringColumn',\n}\n"],"names":["entity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DefinitionCodeGenerator.js","sources":["../../../../../packages/schema-utils/src/definition-generator/DefinitionCodeGenerator.ts"],"sourcesContent":["import { Model, Schema, Writable } from '@contember/schema'\nimport { acceptFieldVisitor, DefaultNamingConventions, isInverseRelation, NamingConventions, resolveDefaultColumnType } from '../model/index.js'\nimport { printJsValue } from '../utils/printJsValue.js'\nimport { DefinitionNamingConventions } from './DefinitionNamingConventions.js'\nimport { AclDefinitionCodeGenerator } from './AclDefinitionCodeGenerator.js'\n\nexport class DefinitionCodeGenerator {\n\tconstructor(\n\t\tprivate readonly schemaNamingConventions: NamingConventions = new DefaultNamingConventions(),\n\t\tprivate readonly definitionNamingConventions = new DefinitionNamingConventions(),\n\t\tprivate readonly aclGenerator = new AclDefinitionCodeGenerator(),\n\t) {\n\t}\n\n\tpublic generate(schema: Schema) {\n\t\tconst roles = this.aclGenerator.generateRoles({ acl: schema.acl })\n\t\tconst aclVariables = this.aclGenerator.generateAclVariables({ acl: schema.acl })\n\t\tconst enums = Object.entries(schema.model.enums).map(([name, values]) => this.generateEnum({ name, values })).join('')\n\t\tconst entities = Object.values(schema.model.entities).map(entity => this.generateEntity({ entity, schema })).join('')\n\n\t\treturn `import { c } from '@contember/schema-definition'\\n${roles}${aclVariables}${enums}${entities}`\n\t}\n\n\tprivate generateEnum({ name, values }: { name: string; values: readonly string[] }): string {\n\t\treturn `\\nexport const ${this.formatIdentifier(name)} = c.createEnum(${values.map(it => printJsValue(it)).join(', ')})\\n`\n\t}\n\n\tpublic generateEntity({ entity, schema }: { entity: Model.Entity; schema: Schema }): string {\n\t\tconst uniqueConstraints = Object.values(entity.unique).map(constraint => this.generateUniqueConstraint({ entity, constraint }))\n\t\tconst indexes = Object.values(entity.indexes).map(index => this.generateIndex({ entity, index }))\n\t\tconst views = this.generateView({ entity })\n\n\t\tconst decorators = [...uniqueConstraints, ...indexes, views].filter(it => !!it).map(it => `${it}\\n`).join('')\n\t\tconst acl = this.aclGenerator.generateEntityAcl({ entity, schema })\n\n\t\treturn `\\n${decorators}${acl}export class ${this.formatIdentifier(entity.name)} {\n${Object.values(entity.fields).map(field => this.generateField({ field, entity, schema })).filter(it => !!it).join('\\n')}\n}\\n`\n\t}\n\n\tprivate generateUniqueConstraint({ entity, constraint }: { entity: Model.Entity; constraint: Model.UniqueConstraint | Model.UniqueIndex }): string {\n\t\tconst fieldsList = `${constraint.fields.map(it => printJsValue(it)).join(', ')}`\n\n\t\treturn `@c.Unique(${fieldsList})`\n\t}\n\n\tprivate generateIndex({ entity, index }: { entity: Model.Entity; index: Model.Index }): string {\n\t\tconst hasColumnOptions = index.columnOptions !== undefined && Object.keys(index.columnOptions).length > 0\n\t\tif (!index.method && !index.opClass && !index.where && !index.include?.length && !hasColumnOptions) {\n\t\t\treturn `@c.Index(${index.fields.map(it => printJsValue(it)).join(', ')})`\n\t\t}\n\t\tconst options: Record<string, unknown> = {\n\t\t\tfields: hasColumnOptions\n\t\t\t\t? index.fields.map(field => {\n\t\t\t\t\tconst columnOption = index.columnOptions?.[field]\n\t\t\t\t\treturn columnOption && Object.keys(columnOption).length > 0 ? { field, ...columnOption } : field\n\t\t\t\t})\n\t\t\t\t: index.fields,\n\t\t}\n\t\tif (index.method) {\n\t\t\toptions.method = index.method\n\t\t}\n\t\tif (index.opClass) {\n\t\t\toptions.opClass = index.opClass\n\t\t}\n\t\tif (index.include?.length) {\n\t\t\toptions.include = index.include\n\t\t}\n\t\tif (index.where) {\n\t\t\toptions.where = index.where\n\t\t}\n\t\treturn `@c.Index(${printJsValue(options)})`\n\t}\n\n\tprivate generateView({ entity }: { entity: Model.Entity }): string | undefined {\n\t\tif (!entity.view) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst dependenciesExpr = (entity.view.dependencies?.length ?? 0) > 0\n\t\t\t? `, {\\n\\tdependencies: () => [${entity.view.dependencies?.map(it => this.formatIdentifier(it))}]\\n}`\n\t\t\t: ''\n\n\t\treturn `@c.View(\\`${entity.view.sql}\\`${dependenciesExpr})`\n\t}\n\n\tpublic generateField({ entity, field, schema }: { entity: Model.Entity; field: Model.AnyField; schema: Schema }): string | undefined {\n\t\tconst formatRelationFactory = (method: string, relation: Model.AnyRelation) => {\n\t\t\tconst otherSide = isInverseRelation(relation) ? relation.ownedBy : relation.inversedBy\n\t\t\tconst otherSideFormatted = otherSide ? `, ${printJsValue(otherSide)}` : ''\n\t\t\treturn `${method}(${this.formatIdentifier(relation.target)}${otherSideFormatted})`\n\t\t}\n\t\tconst formatEnumRef = (enumName: string, enumValues: Record<string, string>, providedValue?: string, defaultValue?: string): string | undefined => {\n\t\t\tif (!providedValue || providedValue === defaultValue) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst enumValueKey = Object.entries(Model.OrderDirection).find(dir => dir[1] === providedValue)?.[0]\n\t\t\tif (!enumValueKey) {\n\t\t\t\tthrow new Error(`Value ${providedValue} is not defined in enum ${enumName}`)\n\t\t\t}\n\t\t\treturn `${enumName}.${enumValueKey}`\n\t\t}\n\t\tconst formatOrderBy = (orderBy?: readonly Model.OrderBy[]) => {\n\t\t\treturn orderBy?.map(it => {\n\t\t\t\tconst enumExpr = formatEnumRef(`Model.OrderDirection`, Model.OrderDirection, it.direction, Model.OrderDirection.asc)\n\t\t\t\treturn `orderBy(${printJsValue(it.path)}${enumExpr ? `, ${enumExpr}` : ''})`\n\t\t\t}) ?? []\n\t\t}\n\t\tconst formatOnDelete = (onDelete?: Model.OnDelete): string | undefined => {\n\t\t\tif (onDelete === Model.OnDelete.cascade) {\n\t\t\t\treturn 'cascadeOnDelete()'\n\t\t\t}\n\t\t\tif (onDelete === Model.OnDelete.setNull) {\n\t\t\t\treturn 'setNullOnDelete()'\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\tconst formatJoiningColumn = (joiningColumnName: string, fieldName: string): string | undefined => {\n\t\t\tconst defaultJoiningColumn = this.schemaNamingConventions.getJoiningColumnName(fieldName)\n\t\t\tif (defaultJoiningColumn === joiningColumnName) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn `joiningColumn(${printJsValue(joiningColumnName)})`\n\t\t}\n\t\tconst definition = acceptFieldVisitor<(string | undefined)[]>(schema.model, entity, field, {\n\t\t\tvisitColumn: ctx => {\n\t\t\t\treturn this.generateColumn(ctx)\n\t\t\t},\n\t\t\tvisitOneHasMany: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOneInverse', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('oneHasOne', relation),\n\t\t\t\t\t!relation.nullable ? 'notNull()' : undefined,\n\t\t\t\t\tformatOnDelete(relation.joiningColumn.onDelete),\n\t\t\t\t\tformatJoiningColumn(relation.joiningColumn.columnName, relation.name),\n\t\t\t\t\trelation.orphanRemoval ? 'removeOrphan()' : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\tconst columnNames = this.schemaNamingConventions.getJoiningTableColumnNames(\n\t\t\t\t\tentity.name,\n\t\t\t\t\trelation.name,\n\t\t\t\t\trelation.target,\n\t\t\t\t\trelation.inversedBy,\n\t\t\t\t)\n\t\t\t\tconst defaultJoiningTable = this.schemaNamingConventions.getJoiningTableName(entity.name, relation.name)\n\t\t\t\tconst joiningTable: Writable<Partial<Model.JoiningTable>> = {}\n\t\t\t\tif (relation.joiningTable.tableName !== defaultJoiningTable) {\n\t\t\t\t\tjoiningTable.tableName = relation.joiningTable.tableName\n\t\t\t\t}\n\t\t\t\tif (!relation.joiningTable.eventLog.enabled) {\n\t\t\t\t\tjoiningTable.eventLog = { enabled: false }\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcolumnNames[0] !== relation.joiningTable.joiningColumn.columnName || relation.joiningTable.joiningColumn.onDelete !== Model.OnDelete.cascade\n\t\t\t\t) {\n\t\t\t\t\tjoiningTable.joiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.joiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcolumnNames[1] !== relation.joiningTable.inverseJoiningColumn.columnName\n\t\t\t\t\t|| relation.joiningTable.inverseJoiningColumn.onDelete !== Model.OnDelete.cascade\n\t\t\t\t) {\n\t\t\t\t\tjoiningTable.inverseJoiningColumn = {\n\t\t\t\t\t\tcolumnName: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\t\t\tonDelete: relation.joiningTable.inverseJoiningColumn.onDelete,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasMany', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t\tObject.keys(joiningTable).length > 0 ? `joiningTable(${printJsValue(joiningTable)})` : undefined,\n\t\t\t\t]\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ relation }) => {\n\t\t\t\treturn [\n\t\t\t\t\tformatRelationFactory('manyHasManyInverse', relation),\n\t\t\t\t\t...formatOrderBy(relation.orderBy),\n\t\t\t\t]\n\t\t\t},\n\t\t})\n\t\tconst definitionCode = definition.filter(it => !!it).join('.')\n\t\tif (field.name === 'id' && definitionCode === 'uuidColumn().notNull()') {\n\t\t\treturn undefined\n\t\t}\n\t\treturn `\\t${this.formatIdentifier(field.name)} = c.${definitionCode}`\n\t}\n\n\tprivate generateColumn({ entity, column }: { entity: Model.Entity; column: Model.AnyColumn }): string[] {\n\t\tlet parts: string[] = []\n\t\tif (column.type === Model.ColumnType.Enum) {\n\t\t\tparts.push(`enumColumn(${column.columnType})`)\n\t\t} else if (column.type === Model.ColumnType.Numeric) {\n\t\t\t// numericColumn requires precision and scale, parsed from e.g. \"numeric(10, 2)\"\n\t\t\tconst match = /numeric\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i.exec(column.columnType)\n\t\t\tif (match) {\n\t\t\t\tparts.push(`numericColumn(${match[1]}, ${match[2]})`)\n\t\t\t} else {\n\t\t\t\tparts.push('numericColumn(30, 10)')\n\t\t\t\tif (resolveDefaultColumnType(column.type) !== column.columnType) {\n\t\t\t\t\tparts.push(`columnType(${printJsValue(column.columnType)})`)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tparts.push(`${ColumnToMethodMapping[column.type]}()`)\n\t\t\tconst defaultColumnType = resolveDefaultColumnType(column.type)\n\t\t\tif (defaultColumnType !== column.columnType) {\n\t\t\t\tparts.push(`columnType(${printJsValue(column.columnType)})`)\n\t\t\t}\n\t\t}\n\t\tconst defaultColumnName = this.schemaNamingConventions.getColumnName(column.name)\n\t\tif (defaultColumnName !== column.columnName) {\n\t\t\tparts.push(`columnName(${printJsValue(column.columnName)})`)\n\t\t}\n\t\tif (!column.nullable) {\n\t\t\tparts.push('notNull()')\n\t\t}\n\t\tif (column.default !== undefined) {\n\t\t\tparts.push(`default(${printJsValue(column.default)})`)\n\t\t}\n\t\tif (column.typeAlias) {\n\t\t\tparts.push(`typeAlias(${printJsValue(column.typeAlias)})`)\n\t\t}\n\t\tif (column.type === Model.ColumnType.Json && column.schema !== undefined) {\n\t\t\tparts.push(`schema(${printJsValue(column.schema)})`)\n\t\t}\n\n\t\t// todo: sequence\n\t\t// todo: maybe single column unique()\n\n\t\treturn parts\n\t}\n\n\tprivate formatIdentifier(id: string): string {\n\t\treturn this.definitionNamingConventions.formatIdentifier(id)\n\t}\n}\n\nconst ColumnToMethodMapping: {\n\t[K in Exclude<Model.ColumnType, Model.ColumnType.Enum>]: string\n} = {\n\t[Model.ColumnType.Bool]: 'boolColumn',\n\t[Model.ColumnType.Date]: 'dateColumn',\n\t[Model.ColumnType.DateTime]: 'dateTimeColumn',\n\t[Model.ColumnType.Time]: 'timeColumn',\n\t[Model.ColumnType.Json]: 'jsonColumn',\n\t[Model.ColumnType.Double]: 'doubleColumn',\n\t[Model.ColumnType.Numeric]: 'numericColumn',\n\t[Model.ColumnType.Uuid]: 'uuidColumn',\n\t[Model.ColumnType.Int]: 'intColumn',\n\t[Model.ColumnType.String]: 'stringColumn',\n}\n"],"names":["entity"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TsDefinitionGenerator.cjs","sources":["../../../../../packages/schema-utils/src/definition-generator/TsDefinitionGenerator.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { DefaultNamingConventions, NamingConventions } from '../model'\nimport { DefinitionCodeGenerator } from './DefinitionCodeGenerator'\n\n/**\n * @deprecated use {@link DefinitionCodeGenerator}\n */\nexport class TsDefinitionGenerator {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t\tprivate readonly conventions: NamingConventions = new DefaultNamingConventions(),\n\t) {\n\t}\n\n\tpublic generate() {\n\t\tconst generator = new DefinitionCodeGenerator(this.conventions)\n\t\treturn generator.generate(this.schema)\n\t}\n}\n"],"names":["DefaultNamingConventions","DefinitionCodeGenerator"],"mappings":";;;;;AAOO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QACA,cAAiC,IAAIA,kBAAAA,4BACrD;AAFgB,SAAA,SAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEO,WAAW;AACjB,UAAM,YAAY,IAAIC,gDAAwB,KAAK,WAAW;AAC9D,WAAO,UAAU,SAAS,KAAK,MAAM;AAAA,EACtC;AACD;;"}
|
|
1
|
+
{"version":3,"file":"TsDefinitionGenerator.cjs","sources":["../../../../../packages/schema-utils/src/definition-generator/TsDefinitionGenerator.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { DefaultNamingConventions, NamingConventions } from '../model/index.js'\nimport { DefinitionCodeGenerator } from './DefinitionCodeGenerator.js'\n\n/**\n * @deprecated use {@link DefinitionCodeGenerator}\n */\nexport class TsDefinitionGenerator {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t\tprivate readonly conventions: NamingConventions = new DefaultNamingConventions(),\n\t) {\n\t}\n\n\tpublic generate() {\n\t\tconst generator = new DefinitionCodeGenerator(this.conventions)\n\t\treturn generator.generate(this.schema)\n\t}\n}\n"],"names":["DefaultNamingConventions","DefinitionCodeGenerator"],"mappings":";;;;;AAOO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QACA,cAAiC,IAAIA,kBAAAA,4BACrD;AAFgB,SAAA,SAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEO,WAAW;AACjB,UAAM,YAAY,IAAIC,gDAAwB,KAAK,WAAW;AAC9D,WAAO,UAAU,SAAS,KAAK,MAAM;AAAA,EACtC;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TsDefinitionGenerator.js","sources":["../../../../../packages/schema-utils/src/definition-generator/TsDefinitionGenerator.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { DefaultNamingConventions, NamingConventions } from '../model'\nimport { DefinitionCodeGenerator } from './DefinitionCodeGenerator'\n\n/**\n * @deprecated use {@link DefinitionCodeGenerator}\n */\nexport class TsDefinitionGenerator {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t\tprivate readonly conventions: NamingConventions = new DefaultNamingConventions(),\n\t) {\n\t}\n\n\tpublic generate() {\n\t\tconst generator = new DefinitionCodeGenerator(this.conventions)\n\t\treturn generator.generate(this.schema)\n\t}\n}\n"],"names":[],"mappings":";;;AAOO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QACA,cAAiC,IAAI,4BACrD;AAFgB,SAAA,SAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEO,WAAW;AACjB,UAAM,YAAY,IAAI,wBAAwB,KAAK,WAAW;AAC9D,WAAO,UAAU,SAAS,KAAK,MAAM;AAAA,EACtC;AACD;"}
|
|
1
|
+
{"version":3,"file":"TsDefinitionGenerator.js","sources":["../../../../../packages/schema-utils/src/definition-generator/TsDefinitionGenerator.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { DefaultNamingConventions, NamingConventions } from '../model/index.js'\nimport { DefinitionCodeGenerator } from './DefinitionCodeGenerator.js'\n\n/**\n * @deprecated use {@link DefinitionCodeGenerator}\n */\nexport class TsDefinitionGenerator {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t\tprivate readonly conventions: NamingConventions = new DefaultNamingConventions(),\n\t) {\n\t}\n\n\tpublic generate() {\n\t\tconst generator = new DefinitionCodeGenerator(this.conventions)\n\t\treturn generator.generate(this.schema)\n\t}\n}\n"],"names":[],"mappings":";;;AAOO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QACA,cAAiC,IAAI,4BACrD;AAFgB,SAAA,SAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEO,WAAW;AACjB,UAAM,YAAY,IAAI,wBAAwB,KAAK,WAAW;AAC9D,WAAO,UAAU,SAAS,KAAK,MAAM;AAAA,EACtC;AACD;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const keywords = require("./keywords.cjs");
|
|
4
|
+
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
const collectUnsupportedJsonSchemaKeywords = (schema) => {
|
|
6
|
+
const result = [];
|
|
7
|
+
walk(schema, "", result);
|
|
8
|
+
return result;
|
|
9
|
+
};
|
|
10
|
+
const walk = (schema, path, result) => {
|
|
11
|
+
if (!isPlainObject(schema)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
for (const keyword of Object.keys(schema)) {
|
|
15
|
+
if (!keywords.isRecognizedJsonSchemaKeyword(keyword)) {
|
|
16
|
+
result.push({ keyword, path });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const properties = schema.properties;
|
|
20
|
+
if (isPlainObject(properties)) {
|
|
21
|
+
for (const key of Object.keys(properties)) {
|
|
22
|
+
walk(properties[key], `${path}/properties/${key}`, result);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (isPlainObject(schema.additionalProperties)) {
|
|
26
|
+
walk(schema.additionalProperties, `${path}/additionalProperties`, result);
|
|
27
|
+
}
|
|
28
|
+
const items = schema.items;
|
|
29
|
+
if (Array.isArray(items)) {
|
|
30
|
+
items.forEach((item, index) => walk(item, `${path}/items/${index}`, result));
|
|
31
|
+
} else if (items !== void 0) {
|
|
32
|
+
walk(items, `${path}/items`, result);
|
|
33
|
+
}
|
|
34
|
+
for (const combinator of ["allOf", "anyOf", "oneOf"]) {
|
|
35
|
+
const subSchemas = schema[combinator];
|
|
36
|
+
if (Array.isArray(subSchemas)) {
|
|
37
|
+
subSchemas.forEach((sub, index) => walk(sub, `${path}/${combinator}/${index}`, result));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (schema.not !== void 0) {
|
|
41
|
+
walk(schema.not, `${path}/not`, result);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
exports.collectUnsupportedJsonSchemaKeywords = collectUnsupportedJsonSchemaKeywords;
|
|
45
|
+
//# sourceMappingURL=collectUnsupportedKeywords.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectUnsupportedKeywords.cjs","sources":["../../../../../packages/schema-utils/src/json-schema/collectUnsupportedKeywords.ts"],"sourcesContent":["import { JSONValue } from '@contember/schema'\nimport { isRecognizedJsonSchemaKeyword } from './keywords.js'\n\nexport interface UnsupportedJsonSchemaKeyword {\n\t/** The offending keyword, e.g. `$ref` or `format`. */\n\tkeyword: string\n\t/** JSON pointer to the (sub)schema that contains the keyword, e.g. `` (root), `/properties/foo`. */\n\tpath: string\n}\n\nconst isPlainObject = (value: JSONValue): value is { readonly [key: string]: JSONValue } =>\n\ttypeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Recursively walks a supplied JSON Schema and collects every keyword that is neither\n * {@link SUPPORTED_JSON_SCHEMA_KEYWORDS supported} nor an\n * {@link ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS allowed annotation}.\n *\n * Descends into the applicator keywords the validator itself understands — `properties`, `items`,\n * `additionalProperties`, `allOf`, `anyOf`, `oneOf`, `not` — so that an unsupported keyword buried in\n * a nested subschema is still reported (with a JSON pointer to its location).\n *\n * A boolean schema (`true`/`false`) is valid and yields no findings.\n */\nexport const collectUnsupportedJsonSchemaKeywords = (schema: JSONValue): UnsupportedJsonSchemaKeyword[] => {\n\tconst result: UnsupportedJsonSchemaKeyword[] = []\n\twalk(schema, '', result)\n\treturn result\n}\n\nconst walk = (schema: JSONValue, path: string, result: UnsupportedJsonSchemaKeyword[]): void => {\n\tif (!isPlainObject(schema)) {\n\t\t// boolean schema, or a non-schema leaf reached via a forgiving descent – nothing to check\n\t\treturn\n\t}\n\n\tfor (const keyword of Object.keys(schema)) {\n\t\tif (!isRecognizedJsonSchemaKeyword(keyword)) {\n\t\t\tresult.push({ keyword, path })\n\t\t}\n\t}\n\n\t// object subschemas\n\tconst properties = schema.properties\n\tif (isPlainObject(properties)) {\n\t\tfor (const key of Object.keys(properties)) {\n\t\t\twalk(properties[key], `${path}/properties/${key}`, result)\n\t\t}\n\t}\n\n\t// `additionalProperties` may be a boolean or a subschema\n\tif (isPlainObject(schema.additionalProperties)) {\n\t\twalk(schema.additionalProperties, `${path}/additionalProperties`, result)\n\t}\n\n\t// `items` (draft-07 single schema). Tolerate an array form too so we still descend.\n\tconst items = schema.items\n\tif (Array.isArray(items)) {\n\t\titems.forEach((item, index) => walk(item, `${path}/items/${index}`, result))\n\t} else if (items !== undefined) {\n\t\twalk(items, `${path}/items`, result)\n\t}\n\n\t// combinators\n\tfor (const combinator of ['allOf', 'anyOf', 'oneOf'] as const) {\n\t\tconst subSchemas = schema[combinator]\n\t\tif (Array.isArray(subSchemas)) {\n\t\t\tsubSchemas.forEach((sub, index) => walk(sub, `${path}/${combinator}/${index}`, result))\n\t\t}\n\t}\n\tif (schema.not !== undefined) {\n\t\twalk(schema.not, `${path}/not`, result)\n\t}\n}\n"],"names":["isRecognizedJsonSchemaKeyword"],"mappings":";;;AAUA,MAAM,gBAAgB,CAAC,UACtB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAa7D,MAAM,uCAAuC,CAAC,WAAsD;AAC1G,QAAM,SAAyC,CAAA;AAC/C,OAAK,QAAQ,IAAI,MAAM;AACvB,SAAO;AACR;AAEA,MAAM,OAAO,CAAC,QAAmB,MAAc,WAAiD;AAC/F,MAAI,CAAC,cAAc,MAAM,GAAG;AAE3B;AAAA,EACD;AAEA,aAAW,WAAW,OAAO,KAAK,MAAM,GAAG;AAC1C,QAAI,CAACA,SAAAA,8BAA8B,OAAO,GAAG;AAC5C,aAAO,KAAK,EAAE,SAAS,KAAA,CAAM;AAAA,IAC9B;AAAA,EACD;AAGA,QAAM,aAAa,OAAO;AAC1B,MAAI,cAAc,UAAU,GAAG;AAC9B,eAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AAC1C,WAAK,WAAW,GAAG,GAAG,GAAG,IAAI,eAAe,GAAG,IAAI,MAAM;AAAA,IAC1D;AAAA,EACD;AAGA,MAAI,cAAc,OAAO,oBAAoB,GAAG;AAC/C,SAAK,OAAO,sBAAsB,GAAG,IAAI,yBAAyB,MAAM;AAAA,EACzE;AAGA,QAAM,QAAQ,OAAO;AACrB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,QAAQ,CAAC,MAAM,UAAU,KAAK,MAAM,GAAG,IAAI,UAAU,KAAK,IAAI,MAAM,CAAC;AAAA,EAC5E,WAAW,UAAU,QAAW;AAC/B,SAAK,OAAO,GAAG,IAAI,UAAU,MAAM;AAAA,EACpC;AAGA,aAAW,cAAc,CAAC,SAAS,SAAS,OAAO,GAAY;AAC9D,UAAM,aAAa,OAAO,UAAU;AACpC,QAAI,MAAM,QAAQ,UAAU,GAAG;AAC9B,iBAAW,QAAQ,CAAC,KAAK,UAAU,KAAK,KAAK,GAAG,IAAI,IAAI,UAAU,IAAI,KAAK,IAAI,MAAM,CAAC;AAAA,IACvF;AAAA,EACD;AACA,MAAI,OAAO,QAAQ,QAAW;AAC7B,SAAK,OAAO,KAAK,GAAG,IAAI,QAAQ,MAAM;AAAA,EACvC;AACD;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isRecognizedJsonSchemaKeyword } from "./keywords.js";
|
|
2
|
+
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
|
+
const collectUnsupportedJsonSchemaKeywords = (schema) => {
|
|
4
|
+
const result = [];
|
|
5
|
+
walk(schema, "", result);
|
|
6
|
+
return result;
|
|
7
|
+
};
|
|
8
|
+
const walk = (schema, path, result) => {
|
|
9
|
+
if (!isPlainObject(schema)) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
for (const keyword of Object.keys(schema)) {
|
|
13
|
+
if (!isRecognizedJsonSchemaKeyword(keyword)) {
|
|
14
|
+
result.push({ keyword, path });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const properties = schema.properties;
|
|
18
|
+
if (isPlainObject(properties)) {
|
|
19
|
+
for (const key of Object.keys(properties)) {
|
|
20
|
+
walk(properties[key], `${path}/properties/${key}`, result);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (isPlainObject(schema.additionalProperties)) {
|
|
24
|
+
walk(schema.additionalProperties, `${path}/additionalProperties`, result);
|
|
25
|
+
}
|
|
26
|
+
const items = schema.items;
|
|
27
|
+
if (Array.isArray(items)) {
|
|
28
|
+
items.forEach((item, index) => walk(item, `${path}/items/${index}`, result));
|
|
29
|
+
} else if (items !== void 0) {
|
|
30
|
+
walk(items, `${path}/items`, result);
|
|
31
|
+
}
|
|
32
|
+
for (const combinator of ["allOf", "anyOf", "oneOf"]) {
|
|
33
|
+
const subSchemas = schema[combinator];
|
|
34
|
+
if (Array.isArray(subSchemas)) {
|
|
35
|
+
subSchemas.forEach((sub, index) => walk(sub, `${path}/${combinator}/${index}`, result));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (schema.not !== void 0) {
|
|
39
|
+
walk(schema.not, `${path}/not`, result);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
export {
|
|
43
|
+
collectUnsupportedJsonSchemaKeywords
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=collectUnsupportedKeywords.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectUnsupportedKeywords.js","sources":["../../../../../packages/schema-utils/src/json-schema/collectUnsupportedKeywords.ts"],"sourcesContent":["import { JSONValue } from '@contember/schema'\nimport { isRecognizedJsonSchemaKeyword } from './keywords.js'\n\nexport interface UnsupportedJsonSchemaKeyword {\n\t/** The offending keyword, e.g. `$ref` or `format`. */\n\tkeyword: string\n\t/** JSON pointer to the (sub)schema that contains the keyword, e.g. `` (root), `/properties/foo`. */\n\tpath: string\n}\n\nconst isPlainObject = (value: JSONValue): value is { readonly [key: string]: JSONValue } =>\n\ttypeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Recursively walks a supplied JSON Schema and collects every keyword that is neither\n * {@link SUPPORTED_JSON_SCHEMA_KEYWORDS supported} nor an\n * {@link ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS allowed annotation}.\n *\n * Descends into the applicator keywords the validator itself understands — `properties`, `items`,\n * `additionalProperties`, `allOf`, `anyOf`, `oneOf`, `not` — so that an unsupported keyword buried in\n * a nested subschema is still reported (with a JSON pointer to its location).\n *\n * A boolean schema (`true`/`false`) is valid and yields no findings.\n */\nexport const collectUnsupportedJsonSchemaKeywords = (schema: JSONValue): UnsupportedJsonSchemaKeyword[] => {\n\tconst result: UnsupportedJsonSchemaKeyword[] = []\n\twalk(schema, '', result)\n\treturn result\n}\n\nconst walk = (schema: JSONValue, path: string, result: UnsupportedJsonSchemaKeyword[]): void => {\n\tif (!isPlainObject(schema)) {\n\t\t// boolean schema, or a non-schema leaf reached via a forgiving descent – nothing to check\n\t\treturn\n\t}\n\n\tfor (const keyword of Object.keys(schema)) {\n\t\tif (!isRecognizedJsonSchemaKeyword(keyword)) {\n\t\t\tresult.push({ keyword, path })\n\t\t}\n\t}\n\n\t// object subschemas\n\tconst properties = schema.properties\n\tif (isPlainObject(properties)) {\n\t\tfor (const key of Object.keys(properties)) {\n\t\t\twalk(properties[key], `${path}/properties/${key}`, result)\n\t\t}\n\t}\n\n\t// `additionalProperties` may be a boolean or a subschema\n\tif (isPlainObject(schema.additionalProperties)) {\n\t\twalk(schema.additionalProperties, `${path}/additionalProperties`, result)\n\t}\n\n\t// `items` (draft-07 single schema). Tolerate an array form too so we still descend.\n\tconst items = schema.items\n\tif (Array.isArray(items)) {\n\t\titems.forEach((item, index) => walk(item, `${path}/items/${index}`, result))\n\t} else if (items !== undefined) {\n\t\twalk(items, `${path}/items`, result)\n\t}\n\n\t// combinators\n\tfor (const combinator of ['allOf', 'anyOf', 'oneOf'] as const) {\n\t\tconst subSchemas = schema[combinator]\n\t\tif (Array.isArray(subSchemas)) {\n\t\t\tsubSchemas.forEach((sub, index) => walk(sub, `${path}/${combinator}/${index}`, result))\n\t\t}\n\t}\n\tif (schema.not !== undefined) {\n\t\twalk(schema.not, `${path}/not`, result)\n\t}\n}\n"],"names":[],"mappings":";AAUA,MAAM,gBAAgB,CAAC,UACtB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAa7D,MAAM,uCAAuC,CAAC,WAAsD;AAC1G,QAAM,SAAyC,CAAA;AAC/C,OAAK,QAAQ,IAAI,MAAM;AACvB,SAAO;AACR;AAEA,MAAM,OAAO,CAAC,QAAmB,MAAc,WAAiD;AAC/F,MAAI,CAAC,cAAc,MAAM,GAAG;AAE3B;AAAA,EACD;AAEA,aAAW,WAAW,OAAO,KAAK,MAAM,GAAG;AAC1C,QAAI,CAAC,8BAA8B,OAAO,GAAG;AAC5C,aAAO,KAAK,EAAE,SAAS,KAAA,CAAM;AAAA,IAC9B;AAAA,EACD;AAGA,QAAM,aAAa,OAAO;AAC1B,MAAI,cAAc,UAAU,GAAG;AAC9B,eAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AAC1C,WAAK,WAAW,GAAG,GAAG,GAAG,IAAI,eAAe,GAAG,IAAI,MAAM;AAAA,IAC1D;AAAA,EACD;AAGA,MAAI,cAAc,OAAO,oBAAoB,GAAG;AAC/C,SAAK,OAAO,sBAAsB,GAAG,IAAI,yBAAyB,MAAM;AAAA,EACzE;AAGA,QAAM,QAAQ,OAAO;AACrB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,QAAQ,CAAC,MAAM,UAAU,KAAK,MAAM,GAAG,IAAI,UAAU,KAAK,IAAI,MAAM,CAAC;AAAA,EAC5E,WAAW,UAAU,QAAW;AAC/B,SAAK,OAAO,GAAG,IAAI,UAAU,MAAM;AAAA,EACpC;AAGA,aAAW,cAAc,CAAC,SAAS,SAAS,OAAO,GAAY;AAC9D,UAAM,aAAa,OAAO,UAAU;AACpC,QAAI,MAAM,QAAQ,UAAU,GAAG;AAC9B,iBAAW,QAAQ,CAAC,KAAK,UAAU,KAAK,KAAK,GAAG,IAAI,IAAI,UAAU,IAAI,KAAK,IAAI,MAAM,CAAC;AAAA,IACvF;AAAA,EACD;AACA,MAAI,OAAO,QAAQ,QAAW;AAC7B,SAAK,OAAO,KAAK,GAAG,IAAI,QAAQ,MAAM;AAAA,EACvC;AACD;"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const JSON_VALUE_TYPE = "JSONValue";
|
|
4
|
+
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
const isPrimitive = (value) => value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean";
|
|
6
|
+
const literal = (value) => {
|
|
7
|
+
if (value === null) {
|
|
8
|
+
return "null";
|
|
9
|
+
}
|
|
10
|
+
if (typeof value === "string") {
|
|
11
|
+
return JSON.stringify(value);
|
|
12
|
+
}
|
|
13
|
+
return String(value);
|
|
14
|
+
};
|
|
15
|
+
const VALID_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
16
|
+
const propertyKey = (key) => VALID_IDENTIFIER.test(key) ? key : JSON.stringify(key);
|
|
17
|
+
const jsonSchemaToTsType = (schema) => {
|
|
18
|
+
const result = derive(schema);
|
|
19
|
+
return result ?? JSON_VALUE_TYPE;
|
|
20
|
+
};
|
|
21
|
+
const derive = (schema) => {
|
|
22
|
+
if (!isPlainObject(schema)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
if ("const" in schema && schema.const !== void 0) {
|
|
26
|
+
return isPrimitive(schema.const) ? literal(schema.const) : null;
|
|
27
|
+
}
|
|
28
|
+
if (Array.isArray(schema.enum)) {
|
|
29
|
+
if (schema.enum.length === 0 || !schema.enum.every(isPrimitive)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return union(schema.enum.map((it) => literal(it)));
|
|
33
|
+
}
|
|
34
|
+
if (Array.isArray(schema.allOf)) {
|
|
35
|
+
const parts = mapAll(schema.allOf);
|
|
36
|
+
return parts && parts.length > 0 ? intersection(parts) : null;
|
|
37
|
+
}
|
|
38
|
+
if (Array.isArray(schema.anyOf)) {
|
|
39
|
+
const parts = mapAll(schema.anyOf);
|
|
40
|
+
return parts && parts.length > 0 ? union(parts) : null;
|
|
41
|
+
}
|
|
42
|
+
if (Array.isArray(schema.oneOf)) {
|
|
43
|
+
const parts = mapAll(schema.oneOf);
|
|
44
|
+
return parts && parts.length > 0 ? union(parts) : null;
|
|
45
|
+
}
|
|
46
|
+
if ("not" in schema) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
if (schema.type !== void 0) {
|
|
50
|
+
return deriveFromType(schema);
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
};
|
|
54
|
+
const deriveFromType = (schema) => {
|
|
55
|
+
const types = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
56
|
+
const parts = [];
|
|
57
|
+
for (const type of types) {
|
|
58
|
+
const part = deriveScalarOrContainer(type, schema);
|
|
59
|
+
if (part === null) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
parts.push(part);
|
|
63
|
+
}
|
|
64
|
+
return parts.length > 0 ? union(parts) : null;
|
|
65
|
+
};
|
|
66
|
+
const deriveScalarOrContainer = (type, schema) => {
|
|
67
|
+
switch (type) {
|
|
68
|
+
case "string":
|
|
69
|
+
return "string";
|
|
70
|
+
case "number":
|
|
71
|
+
case "integer":
|
|
72
|
+
return "number";
|
|
73
|
+
case "boolean":
|
|
74
|
+
return "boolean";
|
|
75
|
+
case "null":
|
|
76
|
+
return "null";
|
|
77
|
+
case "array":
|
|
78
|
+
return deriveArray(schema);
|
|
79
|
+
case "object":
|
|
80
|
+
return deriveObject(schema);
|
|
81
|
+
default:
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const deriveArray = (schema) => {
|
|
86
|
+
const items = schema.items;
|
|
87
|
+
if (items === void 0) {
|
|
88
|
+
return `readonly ${JSON_VALUE_TYPE}[]`;
|
|
89
|
+
}
|
|
90
|
+
if (Array.isArray(items)) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const itemType = derive(items) ?? JSON_VALUE_TYPE;
|
|
94
|
+
return `readonly (${itemType})[]`;
|
|
95
|
+
};
|
|
96
|
+
const deriveObject = (schema) => {
|
|
97
|
+
const properties = schema.properties;
|
|
98
|
+
if (!isPlainObject(properties) || Object.keys(properties).length === 0) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const requiredList = Array.isArray(schema.required) ? schema.required.filter((it) => typeof it === "string") : [];
|
|
102
|
+
const required = new Set(requiredList);
|
|
103
|
+
const members = [];
|
|
104
|
+
for (const key of Object.keys(properties)) {
|
|
105
|
+
const propType = derive(properties[key]) ?? JSON_VALUE_TYPE;
|
|
106
|
+
const optional = required.has(key) ? "" : "?";
|
|
107
|
+
members.push(`${propertyKey(key)}${optional}: ${propType}`);
|
|
108
|
+
}
|
|
109
|
+
return `{ ${members.join("; ")} }`;
|
|
110
|
+
};
|
|
111
|
+
const mapAll = (schemas) => {
|
|
112
|
+
const parts = [];
|
|
113
|
+
for (const sub of schemas) {
|
|
114
|
+
const part = derive(sub);
|
|
115
|
+
if (part === null) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
parts.push(part);
|
|
119
|
+
}
|
|
120
|
+
return parts;
|
|
121
|
+
};
|
|
122
|
+
const union = (parts) => {
|
|
123
|
+
const unique = [...new Set(parts)];
|
|
124
|
+
return unique.length === 1 ? unique[0] : unique.map(wrapForUnion).join(" | ");
|
|
125
|
+
};
|
|
126
|
+
const intersection = (parts) => {
|
|
127
|
+
const unique = [...new Set(parts)];
|
|
128
|
+
return unique.length === 1 ? unique[0] : unique.map(wrapForUnion).join(" & ");
|
|
129
|
+
};
|
|
130
|
+
const wrapForUnion = (type) => {
|
|
131
|
+
if (type.includes(" | ") || type.includes(" & ")) {
|
|
132
|
+
return `(${type})`;
|
|
133
|
+
}
|
|
134
|
+
return type;
|
|
135
|
+
};
|
|
136
|
+
exports.JSON_VALUE_TYPE = JSON_VALUE_TYPE;
|
|
137
|
+
exports.jsonSchemaToTsType = jsonSchemaToTsType;
|
|
138
|
+
//# sourceMappingURL=jsonSchemaToTsType.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonSchemaToTsType.cjs","sources":["../../../../../packages/schema-utils/src/json-schema/jsonSchemaToTsType.ts"],"sourcesContent":["import { JSONValue } from '@contember/schema'\n\n/**\n * The TypeScript type emitted when a JSON Schema (or a subschema) cannot be faithfully expressed.\n * It is the universal JSON supertype, so falling back to it is always sound — never looser than the\n * actual data could be, just less precise.\n */\nexport const JSON_VALUE_TYPE = 'JSONValue'\n\nconst isPlainObject = (value: JSONValue): value is { readonly [key: string]: JSONValue } =>\n\ttypeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isPrimitive = (value: JSONValue): value is string | number | boolean | null =>\n\tvalue === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'\n\nconst literal = (value: string | number | boolean | null): string => {\n\tif (value === null) {\n\t\treturn 'null'\n\t}\n\tif (typeof value === 'string') {\n\t\treturn JSON.stringify(value)\n\t}\n\treturn String(value)\n}\n\nconst VALID_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/\n\nconst propertyKey = (key: string): string => (VALID_IDENTIFIER.test(key) ? key : JSON.stringify(key))\n\n/**\n * Derives a TypeScript type from the {@link SUPPORTED_JSON_SCHEMA_KEYWORDS supported subset} of JSON\n * Schema. For any construct it cannot faithfully and soundly express it returns {@link JSON_VALUE_TYPE},\n * never a type that is wider than the data could actually be.\n *\n * Mapping:\n * - `const` (primitive) / `enum` (primitives) → literal / union of literals\n * - `type` scalar: string → `string`, number|integer → `number`, boolean → `boolean`, null → `null`\n * - `type: 'object'` (+ `properties`/`required`) → object type with optional vs required props\n * - `type: 'array'` (+ `items`) → `T[]`\n * - `type` array → union of the per-type results\n * - `allOf` → intersection, `anyOf`/`oneOf` → union\n *\n * A boolean schema, an empty schema, or anything not covered → `JSONValue`.\n */\nexport const jsonSchemaToTsType = (schema: JSONValue): string => {\n\tconst result = derive(schema)\n\treturn result ?? JSON_VALUE_TYPE\n}\n\n/** Returns the derived type, or `null` if it must fall back to {@link JSON_VALUE_TYPE}. */\nconst derive = (schema: JSONValue): string | null => {\n\tif (!isPlainObject(schema)) {\n\t\t// boolean schema (`true`/`false`) – not faithfully expressible / not a constraint we model\n\t\treturn null\n\t}\n\n\t// const – only primitives are faithfully expressible as a literal\n\tif ('const' in schema && schema.const !== undefined) {\n\t\treturn isPrimitive(schema.const) ? literal(schema.const) : null\n\t}\n\n\t// enum – union of primitive literals\n\tif (Array.isArray(schema.enum)) {\n\t\tif (schema.enum.length === 0 || !schema.enum.every(isPrimitive)) {\n\t\t\treturn null\n\t\t}\n\t\treturn union(schema.enum.map(it => literal(it as string | number | boolean | null)))\n\t}\n\n\t// combinators (independent of `type`)\n\tif (Array.isArray(schema.allOf)) {\n\t\tconst parts = mapAll(schema.allOf)\n\t\treturn parts && parts.length > 0 ? intersection(parts) : null\n\t}\n\tif (Array.isArray(schema.anyOf)) {\n\t\tconst parts = mapAll(schema.anyOf)\n\t\treturn parts && parts.length > 0 ? union(parts) : null\n\t}\n\tif (Array.isArray(schema.oneOf)) {\n\t\tconst parts = mapAll(schema.oneOf)\n\t\treturn parts && parts.length > 0 ? union(parts) : null\n\t}\n\t// `not` is not expressible as a positive TS type\n\tif ('not' in schema) {\n\t\treturn null\n\t}\n\n\tif (schema.type !== undefined) {\n\t\treturn deriveFromType(schema)\n\t}\n\n\t// no recognized type-narrowing keyword → cannot tighten below JSONValue\n\treturn null\n}\n\nconst deriveFromType = (schema: { readonly [key: string]: JSONValue }): string | null => {\n\tconst types = Array.isArray(schema.type) ? schema.type : [schema.type]\n\tconst parts: string[] = []\n\tfor (const type of types) {\n\t\tconst part = deriveScalarOrContainer(type, schema)\n\t\tif (part === null) {\n\t\t\treturn null\n\t\t}\n\t\tparts.push(part)\n\t}\n\treturn parts.length > 0 ? union(parts) : null\n}\n\nconst deriveScalarOrContainer = (type: JSONValue, schema: { readonly [key: string]: JSONValue }): string | null => {\n\tswitch (type) {\n\t\tcase 'string':\n\t\t\treturn 'string'\n\t\tcase 'number':\n\t\tcase 'integer':\n\t\t\treturn 'number'\n\t\tcase 'boolean':\n\t\t\treturn 'boolean'\n\t\tcase 'null':\n\t\t\treturn 'null'\n\t\tcase 'array':\n\t\t\treturn deriveArray(schema)\n\t\tcase 'object':\n\t\t\treturn deriveObject(schema)\n\t\tdefault:\n\t\t\treturn null\n\t}\n}\n\nconst deriveArray = (schema: { readonly [key: string]: JSONValue }): string | null => {\n\tconst items = schema.items\n\tif (items === undefined) {\n\t\t// array of unknown element type\n\t\treturn `readonly ${JSON_VALUE_TYPE}[]`\n\t}\n\tif (Array.isArray(items)) {\n\t\t// tuple form (`items` as array) is not part of the supported subset\n\t\treturn null\n\t}\n\tconst itemType = derive(items) ?? JSON_VALUE_TYPE\n\treturn `readonly (${itemType})[]`\n}\n\nconst deriveObject = (schema: { readonly [key: string]: JSONValue }): string | null => {\n\tconst properties = schema.properties\n\tif (!isPlainObject(properties) || Object.keys(properties).length === 0) {\n\t\t// closed/open object with no declared properties – stay sound, do not emit `{}`\n\t\treturn null\n\t}\n\tconst requiredList = Array.isArray(schema.required) ? schema.required.filter((it): it is string => typeof it === 'string') : []\n\tconst required = new Set<string>(requiredList)\n\tconst members: string[] = []\n\tfor (const key of Object.keys(properties)) {\n\t\tconst propType = derive(properties[key]) ?? JSON_VALUE_TYPE\n\t\tconst optional = required.has(key) ? '' : '?'\n\t\tmembers.push(`${propertyKey(key)}${optional}: ${propType}`)\n\t}\n\treturn `{ ${members.join('; ')} }`\n}\n\nconst mapAll = (schemas: readonly JSONValue[]): string[] | null => {\n\tconst parts: string[] = []\n\tfor (const sub of schemas) {\n\t\tconst part = derive(sub)\n\t\tif (part === null) {\n\t\t\treturn null\n\t\t}\n\t\tparts.push(part)\n\t}\n\treturn parts\n}\n\nconst union = (parts: readonly string[]): string => {\n\tconst unique = [...new Set(parts)]\n\treturn unique.length === 1 ? unique[0] : unique.map(wrapForUnion).join(' | ')\n}\n\nconst intersection = (parts: readonly string[]): string => {\n\tconst unique = [...new Set(parts)]\n\treturn unique.length === 1 ? unique[0] : unique.map(wrapForUnion).join(' & ')\n}\n\n/** Wrap composite types in parentheses so unions/intersections compose unambiguously. */\nconst wrapForUnion = (type: string): string => {\n\tif (type.includes(' | ') || type.includes(' & ')) {\n\t\treturn `(${type})`\n\t}\n\treturn type\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
const JSON_VALUE_TYPE = "JSONValue";
|
|
2
|
+
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
|
+
const isPrimitive = (value) => value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean";
|
|
4
|
+
const literal = (value) => {
|
|
5
|
+
if (value === null) {
|
|
6
|
+
return "null";
|
|
7
|
+
}
|
|
8
|
+
if (typeof value === "string") {
|
|
9
|
+
return JSON.stringify(value);
|
|
10
|
+
}
|
|
11
|
+
return String(value);
|
|
12
|
+
};
|
|
13
|
+
const VALID_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
14
|
+
const propertyKey = (key) => VALID_IDENTIFIER.test(key) ? key : JSON.stringify(key);
|
|
15
|
+
const jsonSchemaToTsType = (schema) => {
|
|
16
|
+
const result = derive(schema);
|
|
17
|
+
return result ?? JSON_VALUE_TYPE;
|
|
18
|
+
};
|
|
19
|
+
const derive = (schema) => {
|
|
20
|
+
if (!isPlainObject(schema)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
if ("const" in schema && schema.const !== void 0) {
|
|
24
|
+
return isPrimitive(schema.const) ? literal(schema.const) : null;
|
|
25
|
+
}
|
|
26
|
+
if (Array.isArray(schema.enum)) {
|
|
27
|
+
if (schema.enum.length === 0 || !schema.enum.every(isPrimitive)) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return union(schema.enum.map((it) => literal(it)));
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(schema.allOf)) {
|
|
33
|
+
const parts = mapAll(schema.allOf);
|
|
34
|
+
return parts && parts.length > 0 ? intersection(parts) : null;
|
|
35
|
+
}
|
|
36
|
+
if (Array.isArray(schema.anyOf)) {
|
|
37
|
+
const parts = mapAll(schema.anyOf);
|
|
38
|
+
return parts && parts.length > 0 ? union(parts) : null;
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(schema.oneOf)) {
|
|
41
|
+
const parts = mapAll(schema.oneOf);
|
|
42
|
+
return parts && parts.length > 0 ? union(parts) : null;
|
|
43
|
+
}
|
|
44
|
+
if ("not" in schema) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (schema.type !== void 0) {
|
|
48
|
+
return deriveFromType(schema);
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
};
|
|
52
|
+
const deriveFromType = (schema) => {
|
|
53
|
+
const types = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
54
|
+
const parts = [];
|
|
55
|
+
for (const type of types) {
|
|
56
|
+
const part = deriveScalarOrContainer(type, schema);
|
|
57
|
+
if (part === null) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
parts.push(part);
|
|
61
|
+
}
|
|
62
|
+
return parts.length > 0 ? union(parts) : null;
|
|
63
|
+
};
|
|
64
|
+
const deriveScalarOrContainer = (type, schema) => {
|
|
65
|
+
switch (type) {
|
|
66
|
+
case "string":
|
|
67
|
+
return "string";
|
|
68
|
+
case "number":
|
|
69
|
+
case "integer":
|
|
70
|
+
return "number";
|
|
71
|
+
case "boolean":
|
|
72
|
+
return "boolean";
|
|
73
|
+
case "null":
|
|
74
|
+
return "null";
|
|
75
|
+
case "array":
|
|
76
|
+
return deriveArray(schema);
|
|
77
|
+
case "object":
|
|
78
|
+
return deriveObject(schema);
|
|
79
|
+
default:
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const deriveArray = (schema) => {
|
|
84
|
+
const items = schema.items;
|
|
85
|
+
if (items === void 0) {
|
|
86
|
+
return `readonly ${JSON_VALUE_TYPE}[]`;
|
|
87
|
+
}
|
|
88
|
+
if (Array.isArray(items)) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const itemType = derive(items) ?? JSON_VALUE_TYPE;
|
|
92
|
+
return `readonly (${itemType})[]`;
|
|
93
|
+
};
|
|
94
|
+
const deriveObject = (schema) => {
|
|
95
|
+
const properties = schema.properties;
|
|
96
|
+
if (!isPlainObject(properties) || Object.keys(properties).length === 0) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const requiredList = Array.isArray(schema.required) ? schema.required.filter((it) => typeof it === "string") : [];
|
|
100
|
+
const required = new Set(requiredList);
|
|
101
|
+
const members = [];
|
|
102
|
+
for (const key of Object.keys(properties)) {
|
|
103
|
+
const propType = derive(properties[key]) ?? JSON_VALUE_TYPE;
|
|
104
|
+
const optional = required.has(key) ? "" : "?";
|
|
105
|
+
members.push(`${propertyKey(key)}${optional}: ${propType}`);
|
|
106
|
+
}
|
|
107
|
+
return `{ ${members.join("; ")} }`;
|
|
108
|
+
};
|
|
109
|
+
const mapAll = (schemas) => {
|
|
110
|
+
const parts = [];
|
|
111
|
+
for (const sub of schemas) {
|
|
112
|
+
const part = derive(sub);
|
|
113
|
+
if (part === null) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
parts.push(part);
|
|
117
|
+
}
|
|
118
|
+
return parts;
|
|
119
|
+
};
|
|
120
|
+
const union = (parts) => {
|
|
121
|
+
const unique = [...new Set(parts)];
|
|
122
|
+
return unique.length === 1 ? unique[0] : unique.map(wrapForUnion).join(" | ");
|
|
123
|
+
};
|
|
124
|
+
const intersection = (parts) => {
|
|
125
|
+
const unique = [...new Set(parts)];
|
|
126
|
+
return unique.length === 1 ? unique[0] : unique.map(wrapForUnion).join(" & ");
|
|
127
|
+
};
|
|
128
|
+
const wrapForUnion = (type) => {
|
|
129
|
+
if (type.includes(" | ") || type.includes(" & ")) {
|
|
130
|
+
return `(${type})`;
|
|
131
|
+
}
|
|
132
|
+
return type;
|
|
133
|
+
};
|
|
134
|
+
export {
|
|
135
|
+
JSON_VALUE_TYPE,
|
|
136
|
+
jsonSchemaToTsType
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=jsonSchemaToTsType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonSchemaToTsType.js","sources":["../../../../../packages/schema-utils/src/json-schema/jsonSchemaToTsType.ts"],"sourcesContent":["import { JSONValue } from '@contember/schema'\n\n/**\n * The TypeScript type emitted when a JSON Schema (or a subschema) cannot be faithfully expressed.\n * It is the universal JSON supertype, so falling back to it is always sound — never looser than the\n * actual data could be, just less precise.\n */\nexport const JSON_VALUE_TYPE = 'JSONValue'\n\nconst isPlainObject = (value: JSONValue): value is { readonly [key: string]: JSONValue } =>\n\ttypeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isPrimitive = (value: JSONValue): value is string | number | boolean | null =>\n\tvalue === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'\n\nconst literal = (value: string | number | boolean | null): string => {\n\tif (value === null) {\n\t\treturn 'null'\n\t}\n\tif (typeof value === 'string') {\n\t\treturn JSON.stringify(value)\n\t}\n\treturn String(value)\n}\n\nconst VALID_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/\n\nconst propertyKey = (key: string): string => (VALID_IDENTIFIER.test(key) ? key : JSON.stringify(key))\n\n/**\n * Derives a TypeScript type from the {@link SUPPORTED_JSON_SCHEMA_KEYWORDS supported subset} of JSON\n * Schema. For any construct it cannot faithfully and soundly express it returns {@link JSON_VALUE_TYPE},\n * never a type that is wider than the data could actually be.\n *\n * Mapping:\n * - `const` (primitive) / `enum` (primitives) → literal / union of literals\n * - `type` scalar: string → `string`, number|integer → `number`, boolean → `boolean`, null → `null`\n * - `type: 'object'` (+ `properties`/`required`) → object type with optional vs required props\n * - `type: 'array'` (+ `items`) → `T[]`\n * - `type` array → union of the per-type results\n * - `allOf` → intersection, `anyOf`/`oneOf` → union\n *\n * A boolean schema, an empty schema, or anything not covered → `JSONValue`.\n */\nexport const jsonSchemaToTsType = (schema: JSONValue): string => {\n\tconst result = derive(schema)\n\treturn result ?? JSON_VALUE_TYPE\n}\n\n/** Returns the derived type, or `null` if it must fall back to {@link JSON_VALUE_TYPE}. */\nconst derive = (schema: JSONValue): string | null => {\n\tif (!isPlainObject(schema)) {\n\t\t// boolean schema (`true`/`false`) – not faithfully expressible / not a constraint we model\n\t\treturn null\n\t}\n\n\t// const – only primitives are faithfully expressible as a literal\n\tif ('const' in schema && schema.const !== undefined) {\n\t\treturn isPrimitive(schema.const) ? literal(schema.const) : null\n\t}\n\n\t// enum – union of primitive literals\n\tif (Array.isArray(schema.enum)) {\n\t\tif (schema.enum.length === 0 || !schema.enum.every(isPrimitive)) {\n\t\t\treturn null\n\t\t}\n\t\treturn union(schema.enum.map(it => literal(it as string | number | boolean | null)))\n\t}\n\n\t// combinators (independent of `type`)\n\tif (Array.isArray(schema.allOf)) {\n\t\tconst parts = mapAll(schema.allOf)\n\t\treturn parts && parts.length > 0 ? intersection(parts) : null\n\t}\n\tif (Array.isArray(schema.anyOf)) {\n\t\tconst parts = mapAll(schema.anyOf)\n\t\treturn parts && parts.length > 0 ? union(parts) : null\n\t}\n\tif (Array.isArray(schema.oneOf)) {\n\t\tconst parts = mapAll(schema.oneOf)\n\t\treturn parts && parts.length > 0 ? union(parts) : null\n\t}\n\t// `not` is not expressible as a positive TS type\n\tif ('not' in schema) {\n\t\treturn null\n\t}\n\n\tif (schema.type !== undefined) {\n\t\treturn deriveFromType(schema)\n\t}\n\n\t// no recognized type-narrowing keyword → cannot tighten below JSONValue\n\treturn null\n}\n\nconst deriveFromType = (schema: { readonly [key: string]: JSONValue }): string | null => {\n\tconst types = Array.isArray(schema.type) ? schema.type : [schema.type]\n\tconst parts: string[] = []\n\tfor (const type of types) {\n\t\tconst part = deriveScalarOrContainer(type, schema)\n\t\tif (part === null) {\n\t\t\treturn null\n\t\t}\n\t\tparts.push(part)\n\t}\n\treturn parts.length > 0 ? union(parts) : null\n}\n\nconst deriveScalarOrContainer = (type: JSONValue, schema: { readonly [key: string]: JSONValue }): string | null => {\n\tswitch (type) {\n\t\tcase 'string':\n\t\t\treturn 'string'\n\t\tcase 'number':\n\t\tcase 'integer':\n\t\t\treturn 'number'\n\t\tcase 'boolean':\n\t\t\treturn 'boolean'\n\t\tcase 'null':\n\t\t\treturn 'null'\n\t\tcase 'array':\n\t\t\treturn deriveArray(schema)\n\t\tcase 'object':\n\t\t\treturn deriveObject(schema)\n\t\tdefault:\n\t\t\treturn null\n\t}\n}\n\nconst deriveArray = (schema: { readonly [key: string]: JSONValue }): string | null => {\n\tconst items = schema.items\n\tif (items === undefined) {\n\t\t// array of unknown element type\n\t\treturn `readonly ${JSON_VALUE_TYPE}[]`\n\t}\n\tif (Array.isArray(items)) {\n\t\t// tuple form (`items` as array) is not part of the supported subset\n\t\treturn null\n\t}\n\tconst itemType = derive(items) ?? JSON_VALUE_TYPE\n\treturn `readonly (${itemType})[]`\n}\n\nconst deriveObject = (schema: { readonly [key: string]: JSONValue }): string | null => {\n\tconst properties = schema.properties\n\tif (!isPlainObject(properties) || Object.keys(properties).length === 0) {\n\t\t// closed/open object with no declared properties – stay sound, do not emit `{}`\n\t\treturn null\n\t}\n\tconst requiredList = Array.isArray(schema.required) ? schema.required.filter((it): it is string => typeof it === 'string') : []\n\tconst required = new Set<string>(requiredList)\n\tconst members: string[] = []\n\tfor (const key of Object.keys(properties)) {\n\t\tconst propType = derive(properties[key]) ?? JSON_VALUE_TYPE\n\t\tconst optional = required.has(key) ? '' : '?'\n\t\tmembers.push(`${propertyKey(key)}${optional}: ${propType}`)\n\t}\n\treturn `{ ${members.join('; ')} }`\n}\n\nconst mapAll = (schemas: readonly JSONValue[]): string[] | null => {\n\tconst parts: string[] = []\n\tfor (const sub of schemas) {\n\t\tconst part = derive(sub)\n\t\tif (part === null) {\n\t\t\treturn null\n\t\t}\n\t\tparts.push(part)\n\t}\n\treturn parts\n}\n\nconst union = (parts: readonly string[]): string => {\n\tconst unique = [...new Set(parts)]\n\treturn unique.length === 1 ? unique[0] : unique.map(wrapForUnion).join(' | ')\n}\n\nconst intersection = (parts: readonly string[]): string => {\n\tconst unique = [...new Set(parts)]\n\treturn unique.length === 1 ? unique[0] : unique.map(wrapForUnion).join(' & ')\n}\n\n/** Wrap composite types in parentheses so unions/intersections compose unambiguously. */\nconst wrapForUnion = (type: string): string => {\n\tif (type.includes(' | ') || type.includes(' & ')) {\n\t\treturn `(${type})`\n\t}\n\treturn type\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const SUPPORTED_JSON_SCHEMA_KEYWORDS = [
|
|
4
|
+
// generic
|
|
5
|
+
"type",
|
|
6
|
+
"enum",
|
|
7
|
+
"const",
|
|
8
|
+
// object
|
|
9
|
+
"properties",
|
|
10
|
+
"required",
|
|
11
|
+
"additionalProperties",
|
|
12
|
+
"minProperties",
|
|
13
|
+
"maxProperties",
|
|
14
|
+
// array (draft-07 style `items` applied to all elements)
|
|
15
|
+
"items",
|
|
16
|
+
"minItems",
|
|
17
|
+
"maxItems",
|
|
18
|
+
"uniqueItems",
|
|
19
|
+
// string
|
|
20
|
+
"minLength",
|
|
21
|
+
"maxLength",
|
|
22
|
+
"pattern",
|
|
23
|
+
// number
|
|
24
|
+
"minimum",
|
|
25
|
+
"maximum",
|
|
26
|
+
"exclusiveMinimum",
|
|
27
|
+
"exclusiveMaximum",
|
|
28
|
+
"multipleOf",
|
|
29
|
+
// combinators
|
|
30
|
+
"allOf",
|
|
31
|
+
"anyOf",
|
|
32
|
+
"oneOf",
|
|
33
|
+
"not"
|
|
34
|
+
];
|
|
35
|
+
const ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS = [
|
|
36
|
+
"title",
|
|
37
|
+
"description",
|
|
38
|
+
"$schema",
|
|
39
|
+
"$id",
|
|
40
|
+
"$comment",
|
|
41
|
+
"examples",
|
|
42
|
+
"default",
|
|
43
|
+
"readOnly",
|
|
44
|
+
"writeOnly",
|
|
45
|
+
"deprecated"
|
|
46
|
+
];
|
|
47
|
+
const supportedKeywordSet = new Set(SUPPORTED_JSON_SCHEMA_KEYWORDS);
|
|
48
|
+
const annotationKeywordSet = new Set(ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS);
|
|
49
|
+
const isSupportedJsonSchemaKeyword = (keyword) => supportedKeywordSet.has(keyword);
|
|
50
|
+
const isAllowedJsonSchemaAnnotationKeyword = (keyword) => annotationKeywordSet.has(keyword);
|
|
51
|
+
const isRecognizedJsonSchemaKeyword = (keyword) => supportedKeywordSet.has(keyword) || annotationKeywordSet.has(keyword);
|
|
52
|
+
exports.ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS = ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS;
|
|
53
|
+
exports.SUPPORTED_JSON_SCHEMA_KEYWORDS = SUPPORTED_JSON_SCHEMA_KEYWORDS;
|
|
54
|
+
exports.isAllowedJsonSchemaAnnotationKeyword = isAllowedJsonSchemaAnnotationKeyword;
|
|
55
|
+
exports.isRecognizedJsonSchemaKeyword = isRecognizedJsonSchemaKeyword;
|
|
56
|
+
exports.isSupportedJsonSchemaKeyword = isSupportedJsonSchemaKeyword;
|
|
57
|
+
//# sourceMappingURL=keywords.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keywords.cjs","sources":["../../../../../packages/schema-utils/src/json-schema/keywords.ts"],"sourcesContent":["/**\n * The single source of truth for the JSON Schema subset Contember supports on a\n * {@link Model.ColumnType.Json} column.\n *\n * Three independent consumers MUST agree on this set:\n * - the runtime input validator (`@contember/engine-content-api` `validateJsonSchema`),\n * - the schema-build keyword check ({@link collectUnsupportedJsonSchemaKeywords}, wired into\n * `ModelValidator`),\n * - the generated-client type derivation (`@contember/client-content-generator` `jsonSchemaToTsType`).\n *\n * Keep this list in sync with the keywords actually honored by the validator. Adding a keyword here\n * without also implementing it in the validator would make the schema-build check accept a schema the\n * runtime silently ignores — exactly the bug this set exists to prevent.\n */\nexport const SUPPORTED_JSON_SCHEMA_KEYWORDS = [\n\t// generic\n\t'type',\n\t'enum',\n\t'const',\n\t// object\n\t'properties',\n\t'required',\n\t'additionalProperties',\n\t'minProperties',\n\t'maxProperties',\n\t// array (draft-07 style `items` applied to all elements)\n\t'items',\n\t'minItems',\n\t'maxItems',\n\t'uniqueItems',\n\t// string\n\t'minLength',\n\t'maxLength',\n\t'pattern',\n\t// number\n\t'minimum',\n\t'maximum',\n\t'exclusiveMinimum',\n\t'exclusiveMaximum',\n\t'multipleOf',\n\t// combinators\n\t'allOf',\n\t'anyOf',\n\t'oneOf',\n\t'not',\n] as const\n\nexport type SupportedJsonSchemaKeyword = (typeof SUPPORTED_JSON_SCHEMA_KEYWORDS)[number]\n\n/**\n * Non-validating annotation/metadata keywords. They have no effect on validation but are explicitly\n * allowed in a supplied schema so that documentation, defaults and authoring hints do not trigger a\n * \"unsupported keyword\" schema error.\n */\nexport const ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS = [\n\t'title',\n\t'description',\n\t'$schema',\n\t'$id',\n\t'$comment',\n\t'examples',\n\t'default',\n\t'readOnly',\n\t'writeOnly',\n\t'deprecated',\n] as const\n\nexport type AllowedJsonSchemaAnnotationKeyword = (typeof ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS)[number]\n\nconst supportedKeywordSet: ReadonlySet<string> = new Set<string>(SUPPORTED_JSON_SCHEMA_KEYWORDS)\nconst annotationKeywordSet: ReadonlySet<string> = new Set<string>(ALLOWED_JSON_SCHEMA_ANNOTATION_KEYWORDS)\n\nexport const isSupportedJsonSchemaKeyword = (keyword: string): keyword is SupportedJsonSchemaKeyword => supportedKeywordSet.has(keyword)\n\nexport const isAllowedJsonSchemaAnnotationKeyword = (keyword: string): keyword is AllowedJsonSchemaAnnotationKeyword =>\n\tannotationKeywordSet.has(keyword)\n\n/** A keyword is recognized if it is either a supported validation keyword or an allowed annotation. */\nexport const isRecognizedJsonSchemaKeyword = (keyword: string): boolean => supportedKeywordSet.has(keyword) || annotationKeywordSet.has(keyword)\n"],"names":[],"mappings":";;AAcO,MAAM,iCAAiC;AAAA;AAAA,EAE7C;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AASO,MAAM,0CAA0C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAIA,MAAM,sBAA2C,IAAI,IAAY,8BAA8B;AAC/F,MAAM,uBAA4C,IAAI,IAAY,uCAAuC;AAElG,MAAM,+BAA+B,CAAC,YAA2D,oBAAoB,IAAI,OAAO;AAEhI,MAAM,uCAAuC,CAAC,YACpD,qBAAqB,IAAI,OAAO;AAG1B,MAAM,gCAAgC,CAAC,YAA6B,oBAAoB,IAAI,OAAO,KAAK,qBAAqB,IAAI,OAAO;;;;;;"}
|