@contember/schema-utils 2.1.0-alpha.9 → 2.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +30 -0
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/acl/AllowAllPermissionFactory.cjs.map +1 -1
- package/dist/development/src/acl/AllowAllPermissionFactory.js.map +1 -1
- package/dist/development/src/acl/PredicateDefinitionProcessor.cjs +1 -3
- package/dist/development/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
- package/dist/development/src/acl/PredicateDefinitionProcessor.js +1 -3
- package/dist/development/src/acl/PredicateDefinitionProcessor.js.map +1 -1
- package/dist/development/src/acl/schemaUtils.cjs.map +1 -1
- package/dist/development/src/acl/schemaUtils.js.map +1 -1
- package/dist/development/src/dataUtils.cjs.map +1 -1
- package/dist/development/src/dataUtils.js.map +1 -1
- package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs +8 -7
- package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
- package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js +8 -7
- package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
- package/dist/development/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
- package/dist/development/src/definition-generator/DefinitionNamingConventions.cjs +50 -1
- package/dist/development/src/definition-generator/DefinitionNamingConventions.cjs.map +1 -1
- package/dist/development/src/definition-generator/DefinitionNamingConventions.js +50 -1
- package/dist/development/src/definition-generator/DefinitionNamingConventions.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/lax/LaxSchemaConverter.cjs.map +1 -1
- package/dist/development/src/lax/LaxSchemaConverter.js.map +1 -1
- package/dist/development/src/lax/schema.cjs.map +1 -1
- package/dist/development/src/lax/schema.js.map +1 -1
- package/dist/development/src/model/NamingConventions.cjs.map +1 -1
- package/dist/development/src/model/NamingConventions.js.map +1 -1
- package/dist/development/src/model/modelUtils.cjs +7 -9
- package/dist/development/src/model/modelUtils.cjs.map +1 -1
- package/dist/development/src/model/modelUtils.js +7 -9
- package/dist/development/src/model/modelUtils.js.map +1 -1
- package/dist/development/src/model/resolveDefaultColumnType.cjs.map +1 -1
- package/dist/development/src/model/resolveDefaultColumnType.js.map +1 -1
- package/dist/development/src/schemaChecksum.cjs.map +1 -1
- package/dist/development/src/schemaChecksum.js.map +1 -1
- package/dist/development/src/schemaFilter.cjs.map +1 -1
- package/dist/development/src/schemaFilter.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 +15 -12
- package/dist/development/src/type-schema/acl.cjs.map +1 -1
- package/dist/development/src/type-schema/acl.js +15 -12
- package/dist/development/src/type-schema/acl.js.map +1 -1
- package/dist/development/src/type-schema/actions.cjs +2 -1
- package/dist/development/src/type-schema/actions.cjs.map +1 -1
- package/dist/development/src/type-schema/actions.js +2 -1
- package/dist/development/src/type-schema/actions.js.map +1 -1
- package/dist/development/src/type-schema/condition.cjs +4 -1
- package/dist/development/src/type-schema/condition.cjs.map +1 -1
- package/dist/development/src/type-schema/condition.js +4 -1
- package/dist/development/src/type-schema/condition.js.map +1 -1
- package/dist/development/src/type-schema/model.cjs +10 -5
- package/dist/development/src/type-schema/model.cjs.map +1 -1
- package/dist/development/src/type-schema/model.js +10 -5
- package/dist/development/src/type-schema/model.js.map +1 -1
- package/dist/development/src/type-schema/settings.cjs +3 -0
- package/dist/development/src/type-schema/settings.cjs.map +1 -1
- package/dist/development/src/type-schema/settings.js +3 -0
- package/dist/development/src/type-schema/settings.js.map +1 -1
- package/dist/development/src/type-schema/validation.cjs.map +1 -1
- package/dist/development/src/type-schema/validation.js.map +1 -1
- package/dist/development/src/type-schema/where.cjs +11 -9
- package/dist/development/src/type-schema/where.cjs.map +1 -1
- package/dist/development/src/type-schema/where.js +11 -9
- package/dist/development/src/type-schema/where.js.map +1 -1
- package/dist/development/src/utils/assertNever.cjs.map +1 -1
- package/dist/development/src/utils/assertNever.js.map +1 -1
- package/dist/development/src/utils/deepCompare.cjs +1 -1
- package/dist/development/src/utils/deepCompare.cjs.map +1 -1
- package/dist/development/src/utils/deepCompare.js +1 -1
- package/dist/development/src/utils/deepCompare.js.map +1 -1
- package/dist/development/src/utils/isIt.cjs.map +1 -1
- package/dist/development/src/utils/isIt.js.map +1 -1
- package/dist/development/src/utils/printJsValue.cjs.map +1 -1
- package/dist/development/src/utils/printJsValue.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 +10 -7
- package/dist/development/src/validation/MembershipResolver.cjs.map +1 -1
- package/dist/development/src/validation/MembershipResolver.js +10 -7
- package/dist/development/src/validation/MembershipResolver.js.map +1 -1
- package/dist/development/src/validation/ModelValidator.cjs +20 -5
- package/dist/development/src/validation/ModelValidator.cjs.map +1 -1
- package/dist/development/src/validation/ModelValidator.js +20 -5
- 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.map +1 -1
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/acl/AllowAllPermissionFactory.cjs.map +1 -1
- package/dist/production/src/acl/AllowAllPermissionFactory.js.map +1 -1
- package/dist/production/src/acl/PredicateDefinitionProcessor.cjs +1 -3
- package/dist/production/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
- package/dist/production/src/acl/PredicateDefinitionProcessor.js +1 -3
- package/dist/production/src/acl/PredicateDefinitionProcessor.js.map +1 -1
- package/dist/production/src/acl/schemaUtils.cjs.map +1 -1
- package/dist/production/src/acl/schemaUtils.js.map +1 -1
- package/dist/production/src/dataUtils.cjs.map +1 -1
- package/dist/production/src/dataUtils.js.map +1 -1
- package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs +8 -7
- package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
- package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js +8 -7
- package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
- package/dist/production/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
- package/dist/production/src/definition-generator/DefinitionNamingConventions.cjs +50 -1
- package/dist/production/src/definition-generator/DefinitionNamingConventions.cjs.map +1 -1
- package/dist/production/src/definition-generator/DefinitionNamingConventions.js +50 -1
- package/dist/production/src/definition-generator/DefinitionNamingConventions.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/lax/LaxSchemaConverter.cjs.map +1 -1
- package/dist/production/src/lax/LaxSchemaConverter.js.map +1 -1
- package/dist/production/src/lax/schema.cjs.map +1 -1
- package/dist/production/src/lax/schema.js.map +1 -1
- package/dist/production/src/model/NamingConventions.cjs.map +1 -1
- package/dist/production/src/model/NamingConventions.js.map +1 -1
- package/dist/production/src/model/modelUtils.cjs +7 -9
- package/dist/production/src/model/modelUtils.cjs.map +1 -1
- package/dist/production/src/model/modelUtils.js +7 -9
- package/dist/production/src/model/modelUtils.js.map +1 -1
- package/dist/production/src/model/resolveDefaultColumnType.cjs.map +1 -1
- package/dist/production/src/model/resolveDefaultColumnType.js.map +1 -1
- package/dist/production/src/schemaChecksum.cjs.map +1 -1
- package/dist/production/src/schemaChecksum.js.map +1 -1
- package/dist/production/src/schemaFilter.cjs.map +1 -1
- package/dist/production/src/schemaFilter.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 +15 -12
- package/dist/production/src/type-schema/acl.cjs.map +1 -1
- package/dist/production/src/type-schema/acl.js +15 -12
- package/dist/production/src/type-schema/acl.js.map +1 -1
- package/dist/production/src/type-schema/actions.cjs +2 -1
- package/dist/production/src/type-schema/actions.cjs.map +1 -1
- package/dist/production/src/type-schema/actions.js +2 -1
- package/dist/production/src/type-schema/actions.js.map +1 -1
- package/dist/production/src/type-schema/condition.cjs +4 -1
- package/dist/production/src/type-schema/condition.cjs.map +1 -1
- package/dist/production/src/type-schema/condition.js +4 -1
- package/dist/production/src/type-schema/condition.js.map +1 -1
- package/dist/production/src/type-schema/model.cjs +10 -5
- package/dist/production/src/type-schema/model.cjs.map +1 -1
- package/dist/production/src/type-schema/model.js +10 -5
- package/dist/production/src/type-schema/model.js.map +1 -1
- package/dist/production/src/type-schema/settings.cjs +3 -0
- package/dist/production/src/type-schema/settings.cjs.map +1 -1
- package/dist/production/src/type-schema/settings.js +3 -0
- package/dist/production/src/type-schema/settings.js.map +1 -1
- package/dist/production/src/type-schema/validation.cjs.map +1 -1
- package/dist/production/src/type-schema/validation.js.map +1 -1
- package/dist/production/src/type-schema/where.cjs +11 -9
- package/dist/production/src/type-schema/where.cjs.map +1 -1
- package/dist/production/src/type-schema/where.js +11 -9
- package/dist/production/src/type-schema/where.js.map +1 -1
- package/dist/production/src/utils/assertNever.cjs.map +1 -1
- package/dist/production/src/utils/assertNever.js.map +1 -1
- package/dist/production/src/utils/deepCompare.cjs +1 -1
- package/dist/production/src/utils/deepCompare.cjs.map +1 -1
- package/dist/production/src/utils/deepCompare.js +1 -1
- package/dist/production/src/utils/deepCompare.js.map +1 -1
- package/dist/production/src/utils/isIt.cjs.map +1 -1
- package/dist/production/src/utils/isIt.js.map +1 -1
- package/dist/production/src/utils/printJsValue.cjs.map +1 -1
- package/dist/production/src/utils/printJsValue.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 +10 -7
- package/dist/production/src/validation/MembershipResolver.cjs.map +1 -1
- package/dist/production/src/validation/MembershipResolver.js +10 -7
- package/dist/production/src/validation/MembershipResolver.js.map +1 -1
- package/dist/production/src/validation/ModelValidator.cjs +20 -5
- package/dist/production/src/validation/ModelValidator.cjs.map +1 -1
- package/dist/production/src/validation/ModelValidator.js +20 -5
- 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/tsconfig.tsbuildinfo +1 -1
- package/dist/types/acl/PredicateDefinitionProcessor.d.ts.map +1 -1
- package/dist/types/definition-generator/AclDefinitionCodeGenerator.d.ts.map +1 -1
- package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts.map +1 -1
- package/dist/types/definition-generator/DefinitionNamingConventions.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lax/LaxSchemaConverter.d.ts.map +1 -1
- package/dist/types/lax/schema.d.ts.map +1 -1
- package/dist/types/model/modelUtils.d.ts.map +1 -1
- package/dist/types/schemaChecksum.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/type-schema/acl.d.ts.map +1 -1
- package/dist/types/type-schema/actions.d.ts +1 -0
- package/dist/types/type-schema/actions.d.ts.map +1 -1
- package/dist/types/type-schema/model.d.ts.map +1 -1
- package/dist/types/type-schema/settings.d.ts +11 -0
- package/dist/types/type-schema/settings.d.ts.map +1 -1
- package/dist/types/type-schema/validation.d.ts.map +1 -1
- package/dist/types/type-schema/where.d.ts.map +1 -1
- package/dist/types/utils/printJsValue.d.ts.map +1 -1
- package/dist/types/validation/AclValidator.d.ts.map +1 -1
- package/dist/types/validation/ActionsValidator.d.ts.map +1 -1
- package/dist/types/validation/MembershipResolver.d.ts +1 -1
- package/dist/types/validation/MembershipResolver.d.ts.map +1 -1
- package/dist/types/validation/ModelValidator.d.ts.map +1 -1
- package/dist/types/validation/SchemaValidator.d.ts.map +1 -1
- package/dist/types/validation/ValidationValidator.d.ts.map +1 -1
- package/dist/types/validation/errors.d.ts.map +1 -1
- package/package.json +11 -6
- package/src/acl/AllowAllPermissionFactory.ts +1 -1
- package/src/acl/PredicateDefinitionProcessor.ts +5 -7
- package/src/dataUtils.ts +1 -1
- package/src/definition-generator/AclDefinitionCodeGenerator.ts +7 -8
- package/src/definition-generator/DefinitionCodeGenerator.ts +8 -14
- package/src/definition-generator/DefinitionNamingConventions.ts +50 -1
- package/src/index.ts +2 -2
- package/src/lax/LaxSchemaConverter.ts +0 -4
- package/src/lax/schema.ts +4 -1
- package/src/model/modelUtils.ts +2 -4
- package/src/schemaChecksum.ts +0 -1
- package/src/schemaFilter.ts +1 -1
- package/src/type-schema/acl.ts +15 -12
- package/src/type-schema/actions.ts +1 -2
- package/src/type-schema/condition.ts +25 -20
- package/src/type-schema/model.ts +12 -8
- package/src/type-schema/settings.ts +3 -0
- package/src/type-schema/validation.ts +5 -4
- package/src/type-schema/where.ts +11 -9
- package/src/utils/deepCompare.ts +1 -1
- package/src/utils/printJsValue.ts +23 -25
- package/src/validation/AclValidator.ts +0 -2
- package/src/validation/ActionsValidator.ts +7 -7
- package/src/validation/MembershipResolver.ts +10 -9
- package/src/validation/ModelValidator.ts +43 -32
- package/src/validation/SchemaValidator.ts +7 -6
- package/src/validation/ValidationValidator.ts +1 -3
- package/src/validation/errors.ts +0 -3
- package/tests/cases/unit/conditionSchema.test.ts +1 -2
- package/tests/cases/unit/deepCompare.test.ts +2 -3
- package/tests/cases/unit/laxSchemaConverter.test.ts +0 -4
- package/tests/cases/unit/membershipResolver.test.ts +136 -49
- package/tests/cases/unit/modelSchema.test.ts +4 -4
- package/tests/cases/unit/modelValidator.test.ts +0 -1
- package/tests/cases/unit/printJsvalue.test.ts +11 -7
- package/tests/cases/unit/whereSchema.test.ts +19 -18
- package/tests/cases/unit/schemas/.eslintignore +0 -1
- package/vitest.config.ts +0 -3
|
@@ -28,9 +28,7 @@ class PredicateDefinitionProcessor {
|
|
|
28
28
|
key,
|
|
29
29
|
])
|
|
30
30
|
} else if (key === 'and' || key === 'or') {
|
|
31
|
-
result[key] = (value as Acl.PredicateDefinition[]).map(it =>
|
|
32
|
-
this.processInternal(entity, it, handler, [...path, key]),
|
|
33
|
-
)
|
|
31
|
+
result[key] = (value as Acl.PredicateDefinition[]).map(it => this.processInternal(entity, it, handler, [...path, key]))
|
|
34
32
|
} else if (!entity.fields[key] && handler.handleUndefinedField) {
|
|
35
33
|
const undefinedResult = handler.handleUndefinedField({ entity, name: key, value, path })
|
|
36
34
|
if (undefinedResult !== undefined) {
|
|
@@ -57,10 +55,10 @@ class PredicateDefinitionProcessor {
|
|
|
57
55
|
path,
|
|
58
56
|
})
|
|
59
57
|
if (
|
|
60
|
-
typeof processedValue === 'object'
|
|
61
|
-
processedValue !== null
|
|
62
|
-
'constructor' in processedValue
|
|
63
|
-
processedValue.constructor.name === 'Object'
|
|
58
|
+
typeof processedValue === 'object'
|
|
59
|
+
&& processedValue !== null
|
|
60
|
+
&& 'constructor' in processedValue
|
|
61
|
+
&& processedValue.constructor.name === 'Object'
|
|
64
62
|
) {
|
|
65
63
|
return this.processInternal(
|
|
66
64
|
targetEntity,
|
package/src/dataUtils.ts
CHANGED
|
@@ -3,21 +3,21 @@ import { IndentDecider, Literal, printJsValue } from '../utils/printJsValue'
|
|
|
3
3
|
import { Acl, Model, Schema } from '@contember/schema'
|
|
4
4
|
import { DefinitionNamingConventions } from './DefinitionNamingConventions'
|
|
5
5
|
|
|
6
|
-
|
|
7
6
|
const indentFirstLevel: IndentDecider = (val, path) => path.length === 0
|
|
8
7
|
|
|
9
8
|
export class AclDefinitionCodeGenerator {
|
|
10
|
-
|
|
11
9
|
constructor(
|
|
12
10
|
private readonly definitionNamingConventions = new DefinitionNamingConventions(),
|
|
13
11
|
) {
|
|
14
12
|
}
|
|
15
13
|
|
|
16
14
|
public generateRoles({ acl }: { acl: Acl.Schema }): string {
|
|
17
|
-
return Object.entries(acl.roles).map(([name, values]) =>
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
return Object.entries(acl.roles).map(([name, values]) =>
|
|
16
|
+
this.generateRole({
|
|
17
|
+
name,
|
|
18
|
+
values,
|
|
19
|
+
})
|
|
20
|
+
).join('')
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
private generateRole({ name, values }: { name: string; values: Acl.RolePermissions }): string {
|
|
@@ -52,7 +52,7 @@ export class AclDefinitionCodeGenerator {
|
|
|
52
52
|
return variablesOutput.join('')
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
public generateEntityAcl({ entity, schema }: { entity: Model.Entity; schema: Schema
|
|
55
|
+
public generateEntityAcl({ entity, schema }: { entity: Model.Entity; schema: Schema }): string {
|
|
56
56
|
const aclOutput: string[] = []
|
|
57
57
|
const numberOfEntityFieldsWithoutId = Object.keys(entity.fields).length - 1
|
|
58
58
|
for (const [roleName, roleDefinition] of Object.entries(schema.acl.roles)) {
|
|
@@ -110,7 +110,6 @@ export class AclDefinitionCodeGenerator {
|
|
|
110
110
|
for (const op of ['read', 'create', 'update'] as const) {
|
|
111
111
|
const fields = Object.entries(operations[op] ?? {}).filter(([, it]) => it === predicate).map(([it]) => it)
|
|
112
112
|
if (fields.length === 0) {
|
|
113
|
-
continue
|
|
114
113
|
} else if (fields.length === numberOfEntityFieldsWithoutId) {
|
|
115
114
|
result[op] = true
|
|
116
115
|
} else {
|
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
import { Model, Schema, Writable } from '@contember/schema'
|
|
2
|
-
import {
|
|
3
|
-
acceptFieldVisitor,
|
|
4
|
-
DefaultNamingConventions,
|
|
5
|
-
isInverseRelation,
|
|
6
|
-
NamingConventions,
|
|
7
|
-
resolveDefaultColumnType,
|
|
8
|
-
} from '../model'
|
|
2
|
+
import { acceptFieldVisitor, DefaultNamingConventions, isInverseRelation, NamingConventions, resolveDefaultColumnType } from '../model'
|
|
9
3
|
import { printJsValue } from '../utils/printJsValue'
|
|
10
4
|
import { DefinitionNamingConventions } from './DefinitionNamingConventions'
|
|
11
5
|
import { AclDefinitionCodeGenerator } from './AclDefinitionCodeGenerator'
|
|
12
6
|
|
|
13
|
-
|
|
14
7
|
export class DefinitionCodeGenerator {
|
|
15
8
|
constructor(
|
|
16
9
|
private readonly schemaNamingConventions: NamingConventions = new DefaultNamingConventions(),
|
|
@@ -57,7 +50,6 @@ ${Object.values(entity.fields).map(field => this.generateField({ field, entity,
|
|
|
57
50
|
return `@c.Index(${fieldsList})`
|
|
58
51
|
}
|
|
59
52
|
|
|
60
|
-
|
|
61
53
|
private generateView({ entity }: { entity: Model.Entity }): string | undefined {
|
|
62
54
|
if (!entity.view) {
|
|
63
55
|
return undefined
|
|
@@ -85,7 +77,6 @@ ${Object.values(entity.fields).map(field => this.generateField({ field, entity,
|
|
|
85
77
|
throw new Error(`Value ${providedValue} is not defined in enum ${enumName}`)
|
|
86
78
|
}
|
|
87
79
|
return `${enumName}.${enumValueKey}`
|
|
88
|
-
|
|
89
80
|
}
|
|
90
81
|
const formatOrderBy = (orderBy?: readonly Model.OrderBy[]) => {
|
|
91
82
|
return orderBy?.map(it => {
|
|
@@ -157,13 +148,18 @@ ${Object.values(entity.fields).map(field => this.generateField({ field, entity,
|
|
|
157
148
|
if (!relation.joiningTable.eventLog.enabled) {
|
|
158
149
|
joiningTable.eventLog = { enabled: false }
|
|
159
150
|
}
|
|
160
|
-
if (
|
|
151
|
+
if (
|
|
152
|
+
columnNames[0] !== relation.joiningTable.joiningColumn.columnName || relation.joiningTable.joiningColumn.onDelete !== Model.OnDelete.cascade
|
|
153
|
+
) {
|
|
161
154
|
joiningTable.joiningColumn = {
|
|
162
155
|
columnName: relation.joiningTable.joiningColumn.columnName,
|
|
163
156
|
onDelete: relation.joiningTable.joiningColumn.onDelete,
|
|
164
157
|
}
|
|
165
158
|
}
|
|
166
|
-
if (
|
|
159
|
+
if (
|
|
160
|
+
columnNames[1] !== relation.joiningTable.inverseJoiningColumn.columnName
|
|
161
|
+
|| relation.joiningTable.inverseJoiningColumn.onDelete !== Model.OnDelete.cascade
|
|
162
|
+
) {
|
|
167
163
|
joiningTable.inverseJoiningColumn = {
|
|
168
164
|
columnName: relation.joiningTable.inverseJoiningColumn.columnName,
|
|
169
165
|
onDelete: relation.joiningTable.inverseJoiningColumn.onDelete,
|
|
@@ -215,7 +211,6 @@ ${Object.values(entity.fields).map(field => this.generateField({ field, entity,
|
|
|
215
211
|
parts.push(`typeAlias(${printJsValue(column.typeAlias)})`)
|
|
216
212
|
}
|
|
217
213
|
|
|
218
|
-
|
|
219
214
|
// todo: sequence
|
|
220
215
|
// todo: maybe single column unique()
|
|
221
216
|
|
|
@@ -227,7 +222,6 @@ ${Object.values(entity.fields).map(field => this.generateField({ field, entity,
|
|
|
227
222
|
}
|
|
228
223
|
}
|
|
229
224
|
|
|
230
|
-
|
|
231
225
|
const ColumnToMethodMapping: {
|
|
232
226
|
[K in Exclude<Model.ColumnType, Model.ColumnType.Enum>]: string
|
|
233
227
|
} = {
|
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
export class DefinitionNamingConventions {
|
|
2
|
-
private static reservedWords = new Set([
|
|
2
|
+
private static reservedWords = new Set([
|
|
3
|
+
'do',
|
|
4
|
+
'if',
|
|
5
|
+
'in',
|
|
6
|
+
'for',
|
|
7
|
+
'let',
|
|
8
|
+
'new',
|
|
9
|
+
'try',
|
|
10
|
+
'var',
|
|
11
|
+
'case',
|
|
12
|
+
'else',
|
|
13
|
+
'enum',
|
|
14
|
+
'eval',
|
|
15
|
+
'null',
|
|
16
|
+
'this',
|
|
17
|
+
'true',
|
|
18
|
+
'void',
|
|
19
|
+
'with',
|
|
20
|
+
'await',
|
|
21
|
+
'break',
|
|
22
|
+
'catch',
|
|
23
|
+
'class',
|
|
24
|
+
'const',
|
|
25
|
+
'false',
|
|
26
|
+
'super',
|
|
27
|
+
'throw',
|
|
28
|
+
'while',
|
|
29
|
+
'yield',
|
|
30
|
+
'delete',
|
|
31
|
+
'export',
|
|
32
|
+
'import',
|
|
33
|
+
'public',
|
|
34
|
+
'return',
|
|
35
|
+
'static',
|
|
36
|
+
'switch',
|
|
37
|
+
'typeof',
|
|
38
|
+
'default',
|
|
39
|
+
'extends',
|
|
40
|
+
'finally',
|
|
41
|
+
'package',
|
|
42
|
+
'private',
|
|
43
|
+
'continue',
|
|
44
|
+
'debugger',
|
|
45
|
+
'function',
|
|
46
|
+
'arguments',
|
|
47
|
+
'interface',
|
|
48
|
+
'protected',
|
|
49
|
+
'implements',
|
|
50
|
+
'instanceof',
|
|
51
|
+
])
|
|
3
52
|
|
|
4
53
|
public formatIdentifier(id: string): string {
|
|
5
54
|
// todo: validate
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Schema } from '@contember/schema'
|
|
2
2
|
import { emptyModelSchema } from './model'
|
|
3
3
|
import * as Typesafe from '@contember/typesafe'
|
|
4
|
-
import { aclSchema, modelSchema,
|
|
4
|
+
import { aclSchema, modelSchema, settingsSchema, validationSchema } from './type-schema'
|
|
5
5
|
import { actionsSchema } from './type-schema/actions'
|
|
6
6
|
|
|
7
7
|
export * from './definition-generator'
|
|
@@ -13,7 +13,7 @@ export * from './validation'
|
|
|
13
13
|
export * from './schemaNormalizer'
|
|
14
14
|
export * from './schemaFilter'
|
|
15
15
|
export * from './schemaChecksum'
|
|
16
|
-
export {
|
|
16
|
+
export { compareArraysIgnoreOrder, deepCompare } from './utils'
|
|
17
17
|
|
|
18
18
|
export const emptySchema: Schema = {
|
|
19
19
|
model: emptyModelSchema,
|
|
@@ -26,7 +26,6 @@ export class LaxSchemaConverter {
|
|
|
26
26
|
const builder = new LaxSchemaBuilder(this.schema, this.conventions)
|
|
27
27
|
return builder.build()
|
|
28
28
|
}
|
|
29
|
-
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
class LaxSchemaBuilder {
|
|
@@ -44,10 +43,8 @@ class LaxSchemaBuilder {
|
|
|
44
43
|
for (const [fieldName, fieldDefinition] of Object.entries(entityDefinition.fields)) {
|
|
45
44
|
if (isColumnDefinition(fieldDefinition)) {
|
|
46
45
|
this.processColumn(entityName, fieldName, fieldDefinition)
|
|
47
|
-
|
|
48
46
|
} else if (fieldDefinition.type === 'enum') {
|
|
49
47
|
this.processEnum(entityName, fieldName, fieldDefinition)
|
|
50
|
-
|
|
51
48
|
} else {
|
|
52
49
|
this.processRelation(entityName, fieldName, fieldDefinition)
|
|
53
50
|
}
|
|
@@ -188,7 +185,6 @@ class LaxSchemaBuilder {
|
|
|
188
185
|
;(entity.fields as Writable<Model.Entity['fields']>)[field.name] = field
|
|
189
186
|
}
|
|
190
187
|
|
|
191
|
-
|
|
192
188
|
private getEntity(entityName: string): Model.Entity {
|
|
193
189
|
return this.entities[entityName] ??= {
|
|
194
190
|
name: entityName,
|
package/src/lax/schema.ts
CHANGED
|
@@ -46,7 +46,10 @@ const LaxSchemaField = Typesafe.discriminatedUnion('type', {
|
|
|
46
46
|
export type LaxSchemaField = ReturnType<typeof LaxSchemaField>
|
|
47
47
|
export type LaxSchemaEnum = Extract<LaxSchemaField, { type: 'enum' }>
|
|
48
48
|
export type LaxSchemaColumn = Extract<LaxSchemaField, { type: 'int' | 'float' | 'boolean' | 'string' | 'json' | 'datetime' | 'date' | 'uuid' }>
|
|
49
|
-
export type LaxSchemaRelation = Extract<
|
|
49
|
+
export type LaxSchemaRelation = Extract<
|
|
50
|
+
LaxSchemaField,
|
|
51
|
+
{ type: 'oneHasOne' | 'oneHasOneInverse' | 'manyHasMany' | 'manyHasManyInverse' | 'oneHasMany' | 'manyHasOne' }
|
|
52
|
+
>
|
|
50
53
|
|
|
51
54
|
const LaxSchemaEntity = Typesafe.object({
|
|
52
55
|
fields: Typesafe.record(Typesafe.string, LaxSchemaField),
|
package/src/model/modelUtils.ts
CHANGED
|
@@ -14,8 +14,7 @@ export class ModelError extends Error {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
const createEntityNotFoundError = (entityName: string) =>
|
|
18
|
-
new ModelError(ModelErrorCode.ENTITY_NOT_FOUND, `Entity ${entityName} not found`)
|
|
17
|
+
const createEntityNotFoundError = (entityName: string) => new ModelError(ModelErrorCode.ENTITY_NOT_FOUND, `Entity ${entityName} not found`)
|
|
19
18
|
|
|
20
19
|
const createFieldNotFoundError = (entityName: string, fieldName: string) =>
|
|
21
20
|
new ModelError(ModelErrorCode.FIELD_NOT_FOUND, `Field ${fieldName} of entity ${entityName} not found`)
|
|
@@ -184,8 +183,7 @@ export const acceptRelationTypeVisitor = <T>(
|
|
|
184
183
|
relation: relationObj,
|
|
185
184
|
targetEntity: targetEntity,
|
|
186
185
|
targetRelation: targetRelation as Model.ManyHasManyOwningRelation,
|
|
187
|
-
}
|
|
188
|
-
)
|
|
186
|
+
})
|
|
189
187
|
case Model.RelationType.OneHasOne:
|
|
190
188
|
return visitor.visitOneHasOneInverse({
|
|
191
189
|
type: 'oneHasOneInverse',
|
package/src/schemaChecksum.ts
CHANGED
package/src/schemaFilter.ts
CHANGED
package/src/type-schema/acl.ts
CHANGED
|
@@ -2,19 +2,22 @@ import { Acl, Model } from '@contember/schema'
|
|
|
2
2
|
import * as Typesafe from '@contember/typesafe'
|
|
3
3
|
import { conditionSchema } from './condition'
|
|
4
4
|
|
|
5
|
-
const membershipMatchRuleSchema = Typesafe.
|
|
6
|
-
Typesafe.
|
|
7
|
-
Typesafe.
|
|
8
|
-
Typesafe.
|
|
9
|
-
Typesafe.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Typesafe.
|
|
13
|
-
Typesafe.
|
|
14
|
-
Typesafe.
|
|
5
|
+
const membershipMatchRuleSchema = Typesafe.union(
|
|
6
|
+
Typesafe.boolean,
|
|
7
|
+
Typesafe.record(
|
|
8
|
+
Typesafe.string,
|
|
9
|
+
Typesafe.union(
|
|
10
|
+
Typesafe.literal(true),
|
|
11
|
+
Typesafe.partial({
|
|
12
|
+
variables: Typesafe.union(
|
|
13
|
+
Typesafe.literal(true),
|
|
14
|
+
Typesafe.record(
|
|
15
|
+
Typesafe.string,
|
|
16
|
+
Typesafe.union(Typesafe.literal(true), Typesafe.string),
|
|
17
|
+
),
|
|
15
18
|
),
|
|
16
|
-
),
|
|
17
|
-
|
|
19
|
+
}),
|
|
20
|
+
),
|
|
18
21
|
),
|
|
19
22
|
)
|
|
20
23
|
|
|
@@ -45,12 +45,12 @@ const watchTriggerSchema = Typesafe.intersection(
|
|
|
45
45
|
Typesafe.partial({
|
|
46
46
|
selection: selectionNodeSchemaFactory(),
|
|
47
47
|
priority: Typesafe.integer,
|
|
48
|
+
withNodes: Typesafe.boolean,
|
|
48
49
|
}),
|
|
49
50
|
)
|
|
50
51
|
|
|
51
52
|
const watchTriggerSchemaCheck: Typesafe.Equals<Actions.WatchTrigger, ReturnType<typeof watchTriggerSchema>> = true
|
|
52
53
|
|
|
53
|
-
|
|
54
54
|
const basicTriggerSchema = Typesafe.intersection(
|
|
55
55
|
Typesafe.object({
|
|
56
56
|
type: Typesafe.literal('basic'),
|
|
@@ -69,7 +69,6 @@ const basicTriggerSchema = Typesafe.intersection(
|
|
|
69
69
|
|
|
70
70
|
const basicTriggerSchemaCheck: Typesafe.Equals<Actions.BasicTrigger, ReturnType<typeof basicTriggerSchema>> = true
|
|
71
71
|
|
|
72
|
-
|
|
73
72
|
const anyTriggerSchema = Typesafe.union(
|
|
74
73
|
watchTriggerSchema,
|
|
75
74
|
basicTriggerSchema,
|
|
@@ -25,24 +25,31 @@ const conditionSchemaInner = <T extends Json>(metadata: ResolvedColumnMetadata<T
|
|
|
25
25
|
isNull: Typesafe.boolean,
|
|
26
26
|
never: Typesafe.true_,
|
|
27
27
|
always: Typesafe.true_,
|
|
28
|
-
...(metadata.isJson !== true
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
28
|
+
...(metadata.isJson !== true
|
|
29
|
+
? {
|
|
30
|
+
eq: inner,
|
|
31
|
+
notEq: inner,
|
|
32
|
+
in: Typesafe.array(inner),
|
|
33
|
+
notIn: Typesafe.array(inner),
|
|
34
|
+
lt: inner,
|
|
35
|
+
lte: inner,
|
|
36
|
+
gt: inner,
|
|
37
|
+
gte: inner,
|
|
38
|
+
}
|
|
39
|
+
: {
|
|
40
|
+
// For JSON columns, allow includes operator
|
|
41
|
+
includes: inner,
|
|
42
|
+
}),
|
|
43
|
+
...(metadata.isString !== false
|
|
44
|
+
? {
|
|
45
|
+
contains: Typesafe.string,
|
|
46
|
+
startsWith: Typesafe.string,
|
|
47
|
+
endsWith: Typesafe.string,
|
|
48
|
+
containsCI: Typesafe.string,
|
|
49
|
+
startsWithCI: Typesafe.string,
|
|
50
|
+
endsWithCI: Typesafe.string,
|
|
51
|
+
}
|
|
52
|
+
: {}),
|
|
46
53
|
}))
|
|
47
54
|
return objectSchema(input, path) as Input.Condition<T>
|
|
48
55
|
}
|
|
@@ -54,11 +61,9 @@ const resolveColumnMetadata = (type: Model.ColumnType): ResolvedColumnMetadata<a
|
|
|
54
61
|
type: resolvedType,
|
|
55
62
|
isJson: type === Model.ColumnType.Json,
|
|
56
63
|
isString: type === Model.ColumnType.String,
|
|
57
|
-
|
|
58
64
|
}
|
|
59
65
|
}
|
|
60
66
|
|
|
61
|
-
|
|
62
67
|
const resolveColumnTypeSchema = (type: Model.ColumnType) => {
|
|
63
68
|
switch (type) {
|
|
64
69
|
case Model.ColumnType.Bool:
|
package/src/type-schema/model.ts
CHANGED
|
@@ -52,7 +52,6 @@ const oneHasOneInverseRelationSchema = Typesafe.object({
|
|
|
52
52
|
})
|
|
53
53
|
const oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true
|
|
54
54
|
|
|
55
|
-
|
|
56
55
|
const oneHasOneOwningRelationSchema = Typesafe.intersection(
|
|
57
56
|
Typesafe.object({
|
|
58
57
|
type: Typesafe.literal(Model.RelationType.OneHasOne),
|
|
@@ -69,9 +68,12 @@ const oneHasOneOwningRelationSchema = Typesafe.intersection(
|
|
|
69
68
|
|
|
70
69
|
const oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true
|
|
71
70
|
|
|
72
|
-
const eventLogSchema = Typesafe.coalesce(
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
const eventLogSchema = Typesafe.coalesce(
|
|
72
|
+
Typesafe.object({
|
|
73
|
+
enabled: Typesafe.boolean,
|
|
74
|
+
}),
|
|
75
|
+
{ enabled: true },
|
|
76
|
+
) as Typesafe.Type<{ readonly enabled: boolean }>
|
|
75
77
|
|
|
76
78
|
const manyHasManyOwningRelationSchema = Typesafe.intersection(
|
|
77
79
|
Typesafe.object({
|
|
@@ -90,7 +92,8 @@ const manyHasManyOwningRelationSchema = Typesafe.intersection(
|
|
|
90
92
|
orderBy: orderBySchema,
|
|
91
93
|
}),
|
|
92
94
|
)
|
|
93
|
-
const manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> =
|
|
95
|
+
const manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> =
|
|
96
|
+
true
|
|
94
97
|
|
|
95
98
|
const manyHasManyInverseRelationSchema = Typesafe.intersection(
|
|
96
99
|
Typesafe.object({
|
|
@@ -103,7 +106,8 @@ const manyHasManyInverseRelationSchema = Typesafe.intersection(
|
|
|
103
106
|
orderBy: orderBySchema,
|
|
104
107
|
}),
|
|
105
108
|
)
|
|
106
|
-
const manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> =
|
|
109
|
+
const manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> =
|
|
110
|
+
true
|
|
107
111
|
|
|
108
112
|
const intersectionSchema = Typesafe.intersection(
|
|
109
113
|
Typesafe.object({
|
|
@@ -162,13 +166,13 @@ const viewSchemaInner = Typesafe.intersection(
|
|
|
162
166
|
const viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true
|
|
163
167
|
const viewSchema: Typesafe.Type<Model.View> = viewSchemaInner
|
|
164
168
|
|
|
165
|
-
|
|
166
169
|
const indexSchemaBase = Typesafe.intersection(
|
|
167
170
|
Typesafe.object({
|
|
168
171
|
fields: Typesafe.array(Typesafe.string),
|
|
169
172
|
}),
|
|
170
173
|
Typesafe.partial({
|
|
171
174
|
name: Typesafe.string,
|
|
175
|
+
method: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),
|
|
172
176
|
}),
|
|
173
177
|
)
|
|
174
178
|
const indexCheck: Typesafe.Equals<Model.Index, ReturnType<typeof indexSchemaBase>> = true
|
|
@@ -198,6 +202,7 @@ const uniqueIndex = Typesafe.intersection(
|
|
|
198
202
|
}),
|
|
199
203
|
Typesafe.partial({
|
|
200
204
|
nulls: Typesafe.enumeration('distinct', 'not distinct'),
|
|
205
|
+
method: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),
|
|
201
206
|
}),
|
|
202
207
|
)
|
|
203
208
|
const uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true
|
|
@@ -229,4 +234,3 @@ export const modelSchema = Typesafe.object({
|
|
|
229
234
|
entities: Typesafe.record(Typesafe.string, entitySchema),
|
|
230
235
|
enums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),
|
|
231
236
|
})
|
|
232
|
-
|
|
@@ -13,6 +13,9 @@ export const settingsSchema = Typesafe.partial({
|
|
|
13
13
|
shortDateResponse: Typesafe.boolean,
|
|
14
14
|
uuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7)),
|
|
15
15
|
}),
|
|
16
|
+
actions: Typesafe.partial({
|
|
17
|
+
returnTriggeredActions: Typesafe.boolean,
|
|
18
|
+
}),
|
|
16
19
|
})
|
|
17
20
|
|
|
18
21
|
const settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true
|
|
@@ -9,10 +9,11 @@ const messageSchema = Typesafe.intersection(
|
|
|
9
9
|
parameters: Typesafe.array(Typesafe.union(Typesafe.string, Typesafe.number)),
|
|
10
10
|
}),
|
|
11
11
|
)
|
|
12
|
-
const literalArgumentFactory = <T extends Typesafe.Json>(inner: Typesafe.Type<T>) =>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
const literalArgumentFactory = <T extends Typesafe.Json>(inner: Typesafe.Type<T>) =>
|
|
13
|
+
Typesafe.object({
|
|
14
|
+
type: Typesafe.literal(Validation.ArgumentType.literal),
|
|
15
|
+
value: inner,
|
|
16
|
+
})
|
|
16
17
|
|
|
17
18
|
const validatorArgumentSchema = Typesafe.object({
|
|
18
19
|
type: Typesafe.literal(Validation.ArgumentType.validator),
|
package/src/type-schema/where.ts
CHANGED
|
@@ -12,15 +12,17 @@ export const whereSchema = ({ schema, entity }: {
|
|
|
12
12
|
and: Typesafe.array(whereSchema({ schema, entity })),
|
|
13
13
|
or: Typesafe.array(whereSchema({ schema, entity })),
|
|
14
14
|
not: whereSchema({ schema, entity }),
|
|
15
|
-
...Object.fromEntries(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
...Object.fromEntries(
|
|
16
|
+
Object.values(entity.fields).map((it): [string, Typesafe.Type<Input.Where[any]>] => {
|
|
17
|
+
return [
|
|
18
|
+
it.name,
|
|
19
|
+
acceptFieldVisitor(schema, entity, it.name, {
|
|
20
|
+
visitColumn: ({ column }) => conditionSchema(column.type),
|
|
21
|
+
visitRelation: ({ targetEntity }) => whereSchema({ schema, entity: targetEntity }),
|
|
22
|
+
}),
|
|
23
|
+
]
|
|
24
|
+
}),
|
|
25
|
+
),
|
|
24
26
|
}))
|
|
25
27
|
|
|
26
28
|
return whereSchemaInner(input, path)
|
package/src/utils/deepCompare.ts
CHANGED
|
@@ -6,7 +6,6 @@ export class Literal {
|
|
|
6
6
|
export type FormatterPath = ({ type: 'array' } | { type: 'object'; key: string })[]
|
|
7
7
|
export type IndentDecider = (value: any, path: FormatterPath) => boolean
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
export const printJsValue = (value: any, shouldIndentCb: IndentDecider = () => false, path: FormatterPath = []): string => {
|
|
11
10
|
if (value instanceof Literal) {
|
|
12
11
|
return value.value
|
|
@@ -18,7 +17,7 @@ export const printJsValue = (value: any, shouldIndentCb: IndentDecider = () => f
|
|
|
18
17
|
return value.toString(10) + 'n'
|
|
19
18
|
}
|
|
20
19
|
if (typeof value === 'string') {
|
|
21
|
-
return `'${value.replaceAll(/'/g, '
|
|
20
|
+
return `'${value.replaceAll(/'/g, "\\'")}'`
|
|
22
21
|
}
|
|
23
22
|
const shouldIndent = shouldIndentCb(value, path)
|
|
24
23
|
if (!shouldIndent) {
|
|
@@ -29,32 +28,31 @@ export const printJsValue = (value: any, shouldIndentCb: IndentDecider = () => f
|
|
|
29
28
|
const nl = '\n'
|
|
30
29
|
|
|
31
30
|
if (Array.isArray(value)) {
|
|
32
|
-
return
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
return ''
|
|
32
|
+
+ '['
|
|
33
|
+
+ value.map((it, index, arr) =>
|
|
34
|
+
(shouldIndent ? nl + indent(1) : '')
|
|
35
|
+
+ printJsValue(it, shouldIndentCb, [...path, { type: 'array' }])
|
|
36
|
+
+ (shouldIndent ? ',' : ((index + 1) < arr.length ? ', ' : ''))
|
|
37
|
+
).join('')
|
|
38
|
+
+ (shouldIndent ? nl + indent(0) : '')
|
|
39
|
+
+ ']'
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
return ''
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
43
|
+
+ '{'
|
|
44
|
+
+ (shouldIndent ? '' : ' ')
|
|
45
|
+
+ Object.entries(value).map(([key, value], index, arr) => {
|
|
46
|
+
const formattedKey = isSimpleIdentifier(key) ? key : `[${printJsValue(key)}]`
|
|
47
|
+
return ''
|
|
48
|
+
+ (shouldIndent ? nl + indent(1) : '')
|
|
49
|
+
+ formattedKey
|
|
50
|
+
+ ': '
|
|
51
|
+
+ printJsValue(value, shouldIndentCb, [...path, { type: 'object', key }])
|
|
52
|
+
+ (shouldIndent ? ',' : ((index + 1) < arr.length ? ', ' : ''))
|
|
53
|
+
}).join('')
|
|
54
|
+
+ (shouldIndent ? nl + indent(0) : ' ')
|
|
55
|
+
+ '}'
|
|
58
56
|
}
|
|
59
57
|
|
|
60
58
|
const isSimpleIdentifier = (identifier: string): boolean => {
|
|
@@ -4,7 +4,6 @@ import { getEntity } from '../model'
|
|
|
4
4
|
import { ErrorBuilder, ValidationError } from './errors'
|
|
5
5
|
import { conditionSchema } from '../type-schema'
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
export class AclValidator {
|
|
9
8
|
constructor(private readonly model: Model.Schema) {}
|
|
10
9
|
|
|
@@ -28,7 +27,6 @@ export class AclValidator {
|
|
|
28
27
|
roles: string[],
|
|
29
28
|
errorBuilder: ErrorBuilder,
|
|
30
29
|
): void {
|
|
31
|
-
|
|
32
30
|
this.validateInherits(permissions.inherits, roles, errorBuilder.for('inherits'))
|
|
33
31
|
this.validateVariables(permissions.variables, errorBuilder.for('variables'))
|
|
34
32
|
this.validatePermissions(permissions.entities, (permissions.variables as Acl.Variables) || {}, errorBuilder.for('entities'))
|