@contember/schema-definition 1.2.0-alpha.9 → 1.2.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/dist/src/acl/builder/EntitySelector.d.ts +1 -1
- package/dist/src/acl/builder/EntitySelector.d.ts.map +1 -1
- package/dist/src/acl/builder/EntitySelector.js +2 -2
- package/dist/src/acl/builder/EntitySelector.js.map +1 -1
- package/dist/src/acl/definition/internal/AclFactory.d.ts.map +1 -1
- package/dist/src/acl/definition/internal/AclFactory.js +1 -0
- package/dist/src/acl/definition/internal/AclFactory.js.map +1 -1
- package/dist/src/acl/definition/internal/EntityPredicateResolver.d.ts.map +1 -1
- package/dist/src/acl/definition/internal/EntityPredicateResolver.js +15 -8
- package/dist/src/acl/definition/internal/EntityPredicateResolver.js.map +1 -1
- package/dist/src/acl/definition/roles.d.ts +4 -6
- package/dist/src/acl/definition/roles.d.ts.map +1 -1
- package/dist/src/acl/definition/variables.d.ts +4 -4
- package/dist/src/acl/definition/variables.d.ts.map +1 -1
- package/dist/src/acl/definition/variables.js +5 -5
- package/dist/src/acl/definition/variables.js.map +1 -1
- package/dist/src/createSchema.d.ts.map +1 -1
- package/dist/src/createSchema.js +2 -1
- package/dist/src/createSchema.js.map +1 -1
- package/dist/src/model/builder/SchemaBuilder.d.ts +1 -1
- package/dist/src/model/builder/SchemaBuilder.d.ts.map +1 -1
- package/dist/src/model/builder/SchemaBuilder.js +2 -2
- package/dist/src/model/builder/SchemaBuilder.js.map +1 -1
- package/dist/src/model/builder/SchemaBuilderInternal.d.ts +1 -1
- package/dist/src/model/builder/SchemaBuilderInternal.d.ts.map +1 -1
- package/dist/src/model/builder/internal/ColumnProcessor.d.ts +1 -1
- package/dist/src/model/builder/internal/ColumnProcessor.d.ts.map +1 -1
- package/dist/src/model/builder/internal/ColumnProcessor.js +2 -2
- package/dist/src/model/builder/internal/ColumnProcessor.js.map +1 -1
- package/dist/src/model/builder/internal/ManyHasManyProcessor.d.ts +1 -1
- package/dist/src/model/builder/internal/ManyHasManyProcessor.d.ts.map +1 -1
- package/dist/src/model/builder/internal/ManyHasOneProcessor.d.ts +1 -1
- package/dist/src/model/builder/internal/ManyHasOneProcessor.d.ts.map +1 -1
- package/dist/src/model/builder/internal/OneHasManyProcessor.d.ts +1 -1
- package/dist/src/model/builder/internal/OneHasManyProcessor.d.ts.map +1 -1
- package/dist/src/model/builder/internal/OneHasOneProcessor.d.ts +1 -1
- package/dist/src/model/builder/internal/OneHasOneProcessor.d.ts.map +1 -1
- package/dist/src/model/definition/ViewDefinition.js +2 -2
- package/dist/src/model/definition/ViewDefinition.js.map +1 -1
- package/dist/src/model/definition/extensions.d.ts +6 -1
- package/dist/src/model/definition/extensions.d.ts.map +1 -1
- package/dist/src/model/definition/extensions.js.map +1 -1
- package/dist/src/model/definition/fieldDefinitions/ColumnDefinition.d.ts +1 -1
- package/dist/src/model/definition/fieldDefinitions/ColumnDefinition.d.ts.map +1 -1
- package/dist/src/model/definition/fieldDefinitions/ColumnDefinition.js +3 -3
- package/dist/src/model/definition/fieldDefinitions/ColumnDefinition.js.map +1 -1
- package/dist/src/model/definition/fieldDefinitions/FieldDefinition.d.ts +1 -1
- package/dist/src/model/definition/fieldDefinitions/FieldDefinition.d.ts.map +1 -1
- package/dist/src/model/definition/index.d.ts.map +1 -1
- package/dist/src/model/definition/index.js +2 -2
- package/dist/src/model/definition/index.js.map +1 -1
- package/dist/src/model/definition/internal/SchemaBuilder.d.ts +1 -1
- package/dist/src/model/definition/internal/SchemaBuilder.d.ts.map +1 -1
- package/dist/src/model/definition/internal/SchemaBuilder.js +8 -1
- package/dist/src/model/definition/internal/SchemaBuilder.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/tests/unit/extendEntity.test.d.ts +2 -0
- package/dist/tests/unit/extendEntity.test.d.ts.map +1 -0
- package/dist/tests/unit/extendEntity.test.js +42 -0
- package/dist/tests/unit/extendEntity.test.js.map +1 -0
- package/dist/tests/unit/readAclDefinitions.test.js +91 -0
- package/dist/tests/unit/readAclDefinitions.test.js.map +1 -1
- package/package.json +3 -3
- package/src/acl/builder/EntitySelector.ts +2 -2
- package/src/acl/definition/internal/AclFactory.ts +1 -0
- package/src/acl/definition/internal/EntityPredicateResolver.ts +13 -7
- package/src/acl/definition/roles.ts +6 -6
- package/src/acl/definition/variables.ts +6 -5
- package/src/createSchema.ts +2 -1
- package/src/model/builder/SchemaBuilder.ts +1 -1
- package/src/model/builder/SchemaBuilderInternal.ts +1 -1
- package/src/model/builder/internal/ColumnProcessor.ts +2 -3
- package/src/model/builder/internal/ManyHasManyProcessor.ts +1 -1
- package/src/model/builder/internal/ManyHasOneProcessor.ts +1 -1
- package/src/model/builder/internal/OneHasManyProcessor.ts +1 -1
- package/src/model/builder/internal/OneHasOneProcessor.ts +1 -1
- package/src/model/definition/ViewDefinition.ts +2 -2
- package/src/model/definition/extensions.ts +7 -1
- package/src/model/definition/fieldDefinitions/ColumnDefinition.ts +4 -4
- package/src/model/definition/fieldDefinitions/FieldDefinition.ts +1 -1
- package/src/model/definition/index.ts +1 -1
- package/src/model/definition/internal/SchemaBuilder.ts +9 -3
- package/tests/unit/extendEntity.test.ts +42 -0
- package/tests/unit/readAclDefinitions.test.ts +92 -0
- package/dist/src/model/definition/NamingConventions.d.ts +0 -17
- package/dist/src/model/definition/NamingConventions.d.ts.map +0 -1
- package/dist/src/model/definition/NamingConventions.js +0 -29
- package/dist/src/model/definition/NamingConventions.js.map +0 -1
- package/dist/src/model/utils/getColumnType.d.ts +0 -3
- package/dist/src/model/utils/getColumnType.d.ts.map +0 -1
- package/dist/src/model/utils/getColumnType.js +0 -29
- package/dist/src/model/utils/getColumnType.js.map +0 -1
- package/dist/src/model/utils/index.d.ts +0 -2
- package/dist/src/model/utils/index.d.ts.map +0 -1
- package/dist/src/model/utils/index.js +0 -18
- package/dist/src/model/utils/index.js.map +0 -1
- package/src/model/definition/NamingConventions.ts +0 -53
- package/src/model/utils/getColumnType.ts +0 -25
- package/src/model/utils/index.ts +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Role } from './roles'
|
|
2
|
-
import { Acl } from '@contember/schema'
|
|
2
|
+
import { Acl, Input } from '@contember/schema'
|
|
3
3
|
|
|
4
4
|
export class VariableDefinition<Name extends string = string, Roles extends Role<string> = Role<string>, Variable extends Acl.Variable = Acl.Variable> {
|
|
5
5
|
constructor(
|
|
@@ -10,24 +10,24 @@ export class VariableDefinition<Name extends string = string, Roles extends Role
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
14
13
|
export const createEntityVariable = <R extends Role<string>, Name extends string>(
|
|
15
14
|
name: Name,
|
|
16
15
|
entityName: string,
|
|
17
16
|
roles: R | R[],
|
|
17
|
+
fallback?: Input.Condition,
|
|
18
18
|
): VariableDefinition<Name, R, Acl.EntityVariable> => {
|
|
19
19
|
return new VariableDefinition(
|
|
20
20
|
name,
|
|
21
21
|
Array.isArray(roles) ? roles : [roles],
|
|
22
|
-
{ type: Acl.VariableType.entity, entityName },
|
|
22
|
+
{ type: Acl.VariableType.entity, entityName, ...(fallback ? { fallback } : {}) },
|
|
23
23
|
)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
27
26
|
export const createPredefinedVariable = <R extends Role<string>, Name extends string>(
|
|
28
27
|
name: Name,
|
|
29
28
|
value: Acl.PredefinedVariableValue,
|
|
30
29
|
roles: R | R[],
|
|
30
|
+
fallback?: Input.Condition,
|
|
31
31
|
): VariableDefinition<Name, R, Acl.EntityVariable> => {
|
|
32
32
|
return new VariableDefinition(
|
|
33
33
|
name,
|
|
@@ -39,10 +39,11 @@ export const createPredefinedVariable = <R extends Role<string>, Name extends st
|
|
|
39
39
|
export const createConditionVariable = <R extends Role<string>, Name extends string>(
|
|
40
40
|
name: Name,
|
|
41
41
|
roles: R | R[],
|
|
42
|
+
fallback?: Input.Condition,
|
|
42
43
|
): VariableDefinition<Name, R, Acl.ConditionVariable> => {
|
|
43
44
|
return new VariableDefinition(
|
|
44
45
|
name,
|
|
45
46
|
Array.isArray(roles) ? roles : [roles],
|
|
46
|
-
{ type: Acl.VariableType.condition
|
|
47
|
+
{ type: Acl.VariableType.condition, ...(fallback ? { fallback } : {}) },
|
|
47
48
|
)
|
|
48
49
|
}
|
package/src/createSchema.ts
CHANGED
|
@@ -2,11 +2,12 @@ import { SchemaDefinition } from './model'
|
|
|
2
2
|
import * as InputValidation from './validation'
|
|
3
3
|
import * as AclDefinition from './acl/definition'
|
|
4
4
|
import { Schema } from '@contember/schema'
|
|
5
|
+
import { emptySchema } from '@contember/schema-utils'
|
|
5
6
|
|
|
6
7
|
export const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema): Schema => {
|
|
7
8
|
const model = SchemaDefinition.createModel(definitions)
|
|
8
9
|
const validation = InputValidation.parseDefinition(definitions)
|
|
9
10
|
const acl = AclDefinition.createAcl(definitions, model)
|
|
10
|
-
const schema = { model, validation, acl }
|
|
11
|
+
const schema = { ...emptySchema, model, validation, acl }
|
|
11
12
|
return modifyCallback ? modifyCallback(schema) : schema
|
|
12
13
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Model } from '@contember/schema'
|
|
2
2
|
import EntityBuilder from './EntityBuilder'
|
|
3
|
-
import { DefaultNamingConventions, NamingConventions } from '
|
|
3
|
+
import { DefaultNamingConventions, NamingConventions } from '@contember/schema-utils'
|
|
4
4
|
import SchemaBuilderInternal from './SchemaBuilderInternal'
|
|
5
5
|
import { EntityConfigurator } from './types'
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ import ManyHasManyProcessor from './internal/ManyHasManyProcessor'
|
|
|
8
8
|
import OneHasOneProcessor from './internal/OneHasOneProcessor'
|
|
9
9
|
import OneHasManyProcessor from './internal/OneHasManyProcessor'
|
|
10
10
|
import ManyHasOneProcessor from './internal/ManyHasOneProcessor'
|
|
11
|
-
import { NamingConventions } from '
|
|
11
|
+
import { NamingConventions } from '@contember/schema-utils'
|
|
12
12
|
import FieldBuilder from './FieldBuilder'
|
|
13
13
|
|
|
14
14
|
export default class SchemaBuilderInternal {
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import FieldProcessor from './FieldProcessor'
|
|
2
2
|
import ColumnBuilder from '../ColumnBuilder'
|
|
3
|
-
import { NamingConventions } from '../../definition/NamingConventions'
|
|
4
3
|
import { Model } from '@contember/schema'
|
|
5
|
-
import {
|
|
4
|
+
import { NamingConventions, resolveDefaultColumnType } from '@contember/schema-utils'
|
|
6
5
|
|
|
7
6
|
export default class ColumnProcessor implements FieldProcessor<ColumnBuilder.Options> {
|
|
8
7
|
private conventions: NamingConventions
|
|
@@ -34,7 +33,7 @@ export default class ColumnProcessor implements FieldProcessor<ColumnBuilder.Opt
|
|
|
34
33
|
return {
|
|
35
34
|
...common,
|
|
36
35
|
type,
|
|
37
|
-
columnType:
|
|
36
|
+
columnType: resolveDefaultColumnType(type),
|
|
38
37
|
...(options.typeAlias !== undefined ? { typeAlias: options.typeAlias } : {}),
|
|
39
38
|
}
|
|
40
39
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import FieldProcessor from './FieldProcessor'
|
|
2
2
|
import ManyHasManyBuilder from '../ManyHasManyBuilder'
|
|
3
3
|
import { Model } from '@contember/schema'
|
|
4
|
-
import { NamingConventions } from '
|
|
4
|
+
import { NamingConventions } from '@contember/schema-utils'
|
|
5
5
|
|
|
6
6
|
export default class ManyHasManyProcessor implements FieldProcessor<ManyHasManyBuilder.Options> {
|
|
7
7
|
private conventions: NamingConventions
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import FieldProcessor from './FieldProcessor'
|
|
2
2
|
import { Model } from '@contember/schema'
|
|
3
3
|
import ManyHasOneBuilder from '../ManyHasOneBuilder'
|
|
4
|
-
import { NamingConventions } from '
|
|
4
|
+
import { NamingConventions } from '@contember/schema-utils'
|
|
5
5
|
|
|
6
6
|
export default class ManyHasOneProcessor implements FieldProcessor<ManyHasOneBuilder.Options> {
|
|
7
7
|
private conventions: NamingConventions
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import FieldProcessor from './FieldProcessor'
|
|
2
2
|
import OneHasManyBuilder from '../OneHasManyBuilder'
|
|
3
3
|
import { Model } from '@contember/schema'
|
|
4
|
-
import { NamingConventions } from '
|
|
4
|
+
import { NamingConventions } from '@contember/schema-utils'
|
|
5
5
|
|
|
6
6
|
export default class OneHasManyProcessor implements FieldProcessor<OneHasManyBuilder.Options> {
|
|
7
7
|
private conventions: NamingConventions
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import OneHasOneBuilder from '../OneHasOneBuilder'
|
|
2
2
|
import FieldProcessor from './FieldProcessor'
|
|
3
3
|
import { Model } from '@contember/schema'
|
|
4
|
-
import { NamingConventions } from '
|
|
4
|
+
import { NamingConventions } from '@contember/schema-utils'
|
|
5
5
|
|
|
6
6
|
export default class OneHasOneProcessor implements FieldProcessor<OneHasOneBuilder.Options> {
|
|
7
7
|
private conventions: NamingConventions
|
|
@@ -2,7 +2,7 @@ import { extendEntity } from './extensions'
|
|
|
2
2
|
import { EntityConstructor } from './types'
|
|
3
3
|
|
|
4
4
|
export const View = (sql: string, { dependencies }: { dependencies?: (() => EntityConstructor[]) | EntityConstructor[] } = {}) =>
|
|
5
|
-
extendEntity(({ entity,
|
|
5
|
+
extendEntity(({ entity, entityRegistry }) => {
|
|
6
6
|
const dependenciesResolved = typeof dependencies === 'function' ? dependencies() : dependencies
|
|
7
7
|
if (dependenciesResolved?.some(it => it === undefined)) {
|
|
8
8
|
throw `"undefined" value detected in dependencies of view entity ${entity.name}. This is possibly caused by circular imports.
|
|
@@ -18,7 +18,7 @@ dependencies: () => [MyEntity]
|
|
|
18
18
|
...entity,
|
|
19
19
|
view: {
|
|
20
20
|
sql,
|
|
21
|
-
...(dependenciesResolved ? { dependencies: dependenciesResolved.map(it =>
|
|
21
|
+
...(dependenciesResolved ? { dependencies: dependenciesResolved.map(it => entityRegistry.getName(it)) } : {}),
|
|
22
22
|
},
|
|
23
23
|
})
|
|
24
24
|
})
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { Model } from '@contember/schema'
|
|
2
2
|
import { DecoratorFunction, EntityConstructor, FieldsDefinition } from './types'
|
|
3
|
-
import { EntityRegistry } from './internal'
|
|
3
|
+
import { EntityRegistry, EnumRegistry } from './internal'
|
|
4
|
+
import { NamingConventions } from '@contember/schema-utils'
|
|
4
5
|
|
|
5
6
|
interface EntityExtensionArgs {
|
|
6
7
|
entity: Model.Entity
|
|
7
8
|
definition: FieldsDefinition
|
|
9
|
+
conventions: NamingConventions
|
|
10
|
+
enumRegistry: EnumRegistry
|
|
11
|
+
entityRegistry: EntityRegistry
|
|
12
|
+
|
|
13
|
+
/** @deprecated use entityRegistry */
|
|
8
14
|
registry: EntityRegistry
|
|
9
15
|
}
|
|
10
16
|
|
|
@@ -2,7 +2,7 @@ import { Model } from '@contember/schema'
|
|
|
2
2
|
import { Interface } from '../types'
|
|
3
3
|
import { CreateFieldContext, FieldDefinition } from './FieldDefinition'
|
|
4
4
|
import { EnumDefinition } from '../EnumDefinition'
|
|
5
|
-
import {
|
|
5
|
+
import { resolveDefaultColumnType } from '@contember/schema-utils'
|
|
6
6
|
|
|
7
7
|
export class ColumnDefinition extends FieldDefinition<ColumnDefinitionOptions> {
|
|
8
8
|
type = 'ColumnDefinition' as const
|
|
@@ -34,8 +34,8 @@ export class ColumnDefinition extends FieldDefinition<ColumnDefinitionOptions> {
|
|
|
34
34
|
return this.withOption('nullable', false)
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
public sequence(options?: Model.ColumnTypeDefinition['sequence']): Interface<ColumnDefinition> {
|
|
38
|
-
return this.withOption('sequence',
|
|
37
|
+
public sequence(options?: Partial<Model.ColumnTypeDefinition['sequence']>): Interface<ColumnDefinition> {
|
|
38
|
+
return this.withOption('sequence', { precedence: 'BY DEFAULT', ...options })
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
public unique(): Interface<ColumnDefinition> {
|
|
@@ -79,7 +79,7 @@ export class ColumnDefinition extends FieldDefinition<ColumnDefinitionOptions> {
|
|
|
79
79
|
return {
|
|
80
80
|
...common,
|
|
81
81
|
type: type,
|
|
82
|
-
columnType: columnType ||
|
|
82
|
+
columnType: columnType || resolveDefaultColumnType(type),
|
|
83
83
|
...(typeAlias !== undefined ? { typeAlias } : {}),
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Model } from '@contember/schema'
|
|
2
|
-
import { NamingConventions } from '
|
|
2
|
+
import { NamingConventions } from '@contember/schema-utils'
|
|
3
3
|
import { EntityRegistry, EnumRegistry } from '../internal'
|
|
4
4
|
|
|
5
5
|
export abstract class FieldDefinition<O> {
|
|
@@ -2,10 +2,10 @@ import { EntityConstructor, Interface } from './types'
|
|
|
2
2
|
import { Model } from '@contember/schema'
|
|
3
3
|
import { EnumDefinition } from './EnumDefinition'
|
|
4
4
|
import { SchemaBuilder } from './internal'
|
|
5
|
-
import { DefaultNamingConventions } from './NamingConventions'
|
|
6
5
|
import 'reflect-metadata'
|
|
7
6
|
import { FieldDefinition } from './fieldDefinitions'
|
|
8
7
|
import { isEntityConstructor } from '../../utils'
|
|
8
|
+
import { DefaultNamingConventions } from '@contember/schema-utils'
|
|
9
9
|
|
|
10
10
|
export * from './fieldDefinitions'
|
|
11
11
|
export * from './EventLogDefinition'
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { Model, Writable } from '@contember/schema'
|
|
2
|
-
import { NamingHelper } from '@contember/schema-utils'
|
|
2
|
+
import { NamingConventions, NamingHelper } from '@contember/schema-utils'
|
|
3
3
|
import 'reflect-metadata'
|
|
4
4
|
import { tuple } from '../../../utils'
|
|
5
5
|
import { EntityConstructor, FieldsDefinition } from '../types'
|
|
6
|
-
import { NamingConventions } from '../NamingConventions'
|
|
7
6
|
import { EnumDefinition } from '../EnumDefinition'
|
|
8
7
|
import { EntityRegistry } from './EntityRegistry'
|
|
9
8
|
import { EnumRegistry } from './EnumRegistry'
|
|
@@ -61,7 +60,14 @@ export class SchemaBuilder {
|
|
|
61
60
|
enabled: true,
|
|
62
61
|
},
|
|
63
62
|
}
|
|
64
|
-
return applyEntityExtensions(definition, {
|
|
63
|
+
return applyEntityExtensions(definition, {
|
|
64
|
+
entity,
|
|
65
|
+
definition: definitionInstance,
|
|
66
|
+
registry: this.entityRegistry,
|
|
67
|
+
entityRegistry: this.entityRegistry,
|
|
68
|
+
conventions: this.conventions,
|
|
69
|
+
enumRegistry: this.enumRegistry,
|
|
70
|
+
})
|
|
65
71
|
})
|
|
66
72
|
|
|
67
73
|
return {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Model } from '@contember/schema'
|
|
2
|
+
import { assert, test } from 'vitest'
|
|
3
|
+
import { createSchema, SchemaDefinition as def } from '../../src'
|
|
4
|
+
import { extendEntity, FieldDefinition } from '../../src/model/definition'
|
|
5
|
+
import { DecoratorFunction } from '../../src/model/definition/types'
|
|
6
|
+
|
|
7
|
+
namespace ExtendedModel {
|
|
8
|
+
export class Article {
|
|
9
|
+
title = def.stringColumn()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const addField = (name: string, field: FieldDefinition<any>): DecoratorFunction<any> => {
|
|
13
|
+
return extendEntity(({ entity, conventions, entityRegistry, enumRegistry }) => ({
|
|
14
|
+
...entity,
|
|
15
|
+
fields: {
|
|
16
|
+
...entity.fields,
|
|
17
|
+
[name]: field.createField({
|
|
18
|
+
name,
|
|
19
|
+
enumRegistry,
|
|
20
|
+
entityRegistry,
|
|
21
|
+
conventions,
|
|
22
|
+
entityName: entity.name,
|
|
23
|
+
}),
|
|
24
|
+
},
|
|
25
|
+
}))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
addField('lead', def.stringColumn())(Article)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
test('add a field to entity using an extension', () => {
|
|
33
|
+
const schema = createSchema(ExtendedModel)
|
|
34
|
+
|
|
35
|
+
assert.deepEqual(schema.model.entities.Article.fields.lead, {
|
|
36
|
+
columnName: 'lead',
|
|
37
|
+
name: 'lead',
|
|
38
|
+
columnType: 'text',
|
|
39
|
+
type: Model.ColumnType.String,
|
|
40
|
+
nullable: true,
|
|
41
|
+
})
|
|
42
|
+
})
|
|
@@ -24,6 +24,32 @@ test('simple definitions', () => {
|
|
|
24
24
|
`)
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
+
|
|
28
|
+
namespace RoleOptions {
|
|
29
|
+
export const publicRole = acl.createRole('public', {
|
|
30
|
+
debug: true,
|
|
31
|
+
s3: {
|
|
32
|
+
foo: 'bar',
|
|
33
|
+
},
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
test('role options', () => {
|
|
38
|
+
const schema = createSchema(RoleOptions)
|
|
39
|
+
expect(schema.acl.roles.public).toMatchInlineSnapshot(`
|
|
40
|
+
{
|
|
41
|
+
"debug": true,
|
|
42
|
+
"entities": {},
|
|
43
|
+
"s3": {
|
|
44
|
+
"foo": "bar",
|
|
45
|
+
},
|
|
46
|
+
"stages": "*",
|
|
47
|
+
"variables": {},
|
|
48
|
+
}
|
|
49
|
+
`)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
|
|
27
53
|
namespace ModelWithPredicate {
|
|
28
54
|
export const publicRole = acl.createRole('public')
|
|
29
55
|
|
|
@@ -181,6 +207,72 @@ test('definition with multiple predicates on a single field', () => {
|
|
|
181
207
|
})
|
|
182
208
|
|
|
183
209
|
|
|
210
|
+
namespace ModelWithJoinedPredicateCollision {
|
|
211
|
+
export const publicRole = acl.createRole('public')
|
|
212
|
+
|
|
213
|
+
@acl.allow(publicRole, {
|
|
214
|
+
when: { isPublishedLoremIpsumDolorSitAmet: { eq: true } },
|
|
215
|
+
read: ['title'],
|
|
216
|
+
})
|
|
217
|
+
@acl.allow(publicRole, {
|
|
218
|
+
when: { isPublishedLoremIpsumDolorSitAmet: { eq: false } },
|
|
219
|
+
read: ['title', 'isPublishedLoremIpsumDolorSitAmet'],
|
|
220
|
+
})
|
|
221
|
+
@acl.allow(publicRole, {
|
|
222
|
+
when: { isPublishedLoremIpsumDolorSitAmet: { eq: false } },
|
|
223
|
+
read: ['isPublishedLoremIpsumDolorSitAmet'],
|
|
224
|
+
})
|
|
225
|
+
export class Book {
|
|
226
|
+
title = def.stringColumn()
|
|
227
|
+
isPublishedLoremIpsumDolorSitAmet = def.boolColumn()
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
test('definition with collision', () => {
|
|
232
|
+
const schema = createSchema(ModelWithJoinedPredicateCollision)
|
|
233
|
+
expect(schema.acl.roles.public.entities.Book).toMatchInlineSnapshot(`
|
|
234
|
+
{
|
|
235
|
+
"operations": {
|
|
236
|
+
"read": {
|
|
237
|
+
"isPublishedLoremIpsumDolorSitAmet": "or_isPublishedLoremIpsumDolor_1",
|
|
238
|
+
"title": "or_isPublishedLoremIpsumDolor",
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
"predicates": {
|
|
242
|
+
"or_isPublishedLoremIpsumDolor": {
|
|
243
|
+
"or": [
|
|
244
|
+
{
|
|
245
|
+
"isPublishedLoremIpsumDolorSitAmet": {
|
|
246
|
+
"eq": false,
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"isPublishedLoremIpsumDolorSitAmet": {
|
|
251
|
+
"eq": true,
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
},
|
|
256
|
+
"or_isPublishedLoremIpsumDolor_1": {
|
|
257
|
+
"or": [
|
|
258
|
+
{
|
|
259
|
+
"isPublishedLoremIpsumDolorSitAmet": {
|
|
260
|
+
"eq": false,
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"isPublishedLoremIpsumDolorSitAmet": {
|
|
265
|
+
"eq": false,
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
}
|
|
272
|
+
`)
|
|
273
|
+
})
|
|
274
|
+
|
|
275
|
+
|
|
184
276
|
namespace ModelWithMultipleRolesForSinglePredicate {
|
|
185
277
|
export const publicRole = acl.createRole('public')
|
|
186
278
|
export const adminRole = acl.createRole('admin')
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export interface NamingConventions {
|
|
2
|
-
getPrimaryField(): string;
|
|
3
|
-
getColumnName(fieldName: string): string;
|
|
4
|
-
getTableName(entityName: string): string;
|
|
5
|
-
getJoiningColumnName(relationName: string): string;
|
|
6
|
-
getJoiningTableName(entity: string, relation: string): string;
|
|
7
|
-
getJoiningTableColumnNames(owningEntity: string, owningRelation: string, inverseEntity: string, inverseRelation?: string): [string, string];
|
|
8
|
-
}
|
|
9
|
-
export declare class DefaultNamingConventions implements NamingConventions {
|
|
10
|
-
getPrimaryField(): string;
|
|
11
|
-
getColumnName(fieldName: string): string;
|
|
12
|
-
getTableName(entityName: string): string;
|
|
13
|
-
getJoiningColumnName(relationName: string): string;
|
|
14
|
-
getJoiningTableName(entity: string, relation: string): string;
|
|
15
|
-
getJoiningTableColumnNames(owningEntity: string, owningRelation: string, inverseEntity: string, inverseRelation?: string): [string, string];
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=NamingConventions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NamingConventions.d.ts","sourceRoot":"","sources":["../../../../src/model/definition/NamingConventions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,eAAe,IAAI,MAAM,CAAA;IAEzB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;IAExC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;IAExC,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;IAElD,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IAE7D,0BAA0B,CACzB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,GACtB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnB;AAGD,qBAAa,wBAAyB,YAAW,iBAAiB;IACjE,eAAe,IAAI,MAAM;IAIzB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIxC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIxC,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAIlD,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI7D,0BAA0B,CACzB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,GACtB,CAAC,MAAM,EAAE,MAAM,CAAC;CAMnB"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DefaultNamingConventions = void 0;
|
|
4
|
-
const toUnderscore = (s) => s.replace(/([A-Z]+)/g, (x, y) => '_' + y.toLowerCase()).replace(/^_/, '');
|
|
5
|
-
class DefaultNamingConventions {
|
|
6
|
-
getPrimaryField() {
|
|
7
|
-
return 'id';
|
|
8
|
-
}
|
|
9
|
-
getColumnName(fieldName) {
|
|
10
|
-
return toUnderscore(fieldName);
|
|
11
|
-
}
|
|
12
|
-
getTableName(entityName) {
|
|
13
|
-
return toUnderscore(entityName);
|
|
14
|
-
}
|
|
15
|
-
getJoiningColumnName(relationName) {
|
|
16
|
-
return toUnderscore(relationName) + '_id';
|
|
17
|
-
}
|
|
18
|
-
getJoiningTableName(entity, relation) {
|
|
19
|
-
return toUnderscore(entity) + '_' + toUnderscore(relation);
|
|
20
|
-
}
|
|
21
|
-
getJoiningTableColumnNames(owningEntity, owningRelation, inverseEntity, inverseRelation) {
|
|
22
|
-
return [
|
|
23
|
-
toUnderscore(owningEntity) + '_id',
|
|
24
|
-
toUnderscore(inverseEntity === owningEntity ? owningRelation : inverseEntity) + '_id',
|
|
25
|
-
];
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
exports.DefaultNamingConventions = DefaultNamingConventions;
|
|
29
|
-
//# sourceMappingURL=NamingConventions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NamingConventions.js","sourceRoot":"","sources":["../../../../src/model/definition/NamingConventions.ts"],"names":[],"mappings":";;;AAmBA,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC7G,MAAa,wBAAwB;IACpC,eAAe;QACd,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,aAAa,CAAC,SAAiB;QAC9B,OAAO,YAAY,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;IAED,YAAY,CAAC,UAAkB;QAC9B,OAAO,YAAY,CAAC,UAAU,CAAC,CAAA;IAChC,CAAC;IAED,oBAAoB,CAAC,YAAoB;QACxC,OAAO,YAAY,CAAC,YAAY,CAAC,GAAG,KAAK,CAAA;IAC1C,CAAC;IAED,mBAAmB,CAAC,MAAc,EAAE,QAAgB;QACnD,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAED,0BAA0B,CACzB,YAAoB,EACpB,cAAsB,EACtB,aAAqB,EACrB,eAAwB;QAExB,OAAO;YACN,YAAY,CAAC,YAAY,CAAC,GAAG,KAAK;YAClC,YAAY,CAAC,aAAa,KAAK,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,KAAK;SACrF,CAAA;IACF,CAAC;CACD;AAhCD,4DAgCC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getColumnType.d.ts","sourceRoot":"","sources":["../../../../src/model/utils/getColumnType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAGzC,eAAO,MAAM,aAAa,SAAU,QAAQ,MAAM,UAAU,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,KAAG,MAqBtF,CAAA"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getColumnType = void 0;
|
|
4
|
-
const schema_1 = require("@contember/schema");
|
|
5
|
-
const utils_1 = require("../../utils");
|
|
6
|
-
const getColumnType = (type) => {
|
|
7
|
-
switch (type) {
|
|
8
|
-
case schema_1.Model.ColumnType.Int:
|
|
9
|
-
return 'integer';
|
|
10
|
-
case schema_1.Model.ColumnType.Double:
|
|
11
|
-
return 'double precision';
|
|
12
|
-
case schema_1.Model.ColumnType.String:
|
|
13
|
-
return 'text';
|
|
14
|
-
case schema_1.Model.ColumnType.Uuid:
|
|
15
|
-
return 'uuid';
|
|
16
|
-
case schema_1.Model.ColumnType.Bool:
|
|
17
|
-
return 'boolean';
|
|
18
|
-
case schema_1.Model.ColumnType.DateTime:
|
|
19
|
-
return 'timestamptz';
|
|
20
|
-
case schema_1.Model.ColumnType.Date:
|
|
21
|
-
return 'date';
|
|
22
|
-
case schema_1.Model.ColumnType.Json:
|
|
23
|
-
return 'jsonb';
|
|
24
|
-
default:
|
|
25
|
-
return (0, utils_1.assertNever)(type);
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
exports.getColumnType = getColumnType;
|
|
29
|
-
//# sourceMappingURL=getColumnType.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getColumnType.js","sourceRoot":"","sources":["../../../../src/model/utils/getColumnType.ts"],"names":[],"mappings":";;;AAAA,8CAAyC;AACzC,uCAAyC;AAElC,MAAM,aAAa,GAAG,CAAC,IAAsD,EAAU,EAAE;IAC/F,QAAQ,IAAI,EAAE;QACb,KAAK,cAAK,CAAC,UAAU,CAAC,GAAG;YACxB,OAAO,SAAS,CAAA;QACjB,KAAK,cAAK,CAAC,UAAU,CAAC,MAAM;YAC3B,OAAO,kBAAkB,CAAA;QAC1B,KAAK,cAAK,CAAC,UAAU,CAAC,MAAM;YAC3B,OAAO,MAAM,CAAA;QACd,KAAK,cAAK,CAAC,UAAU,CAAC,IAAI;YACzB,OAAO,MAAM,CAAA;QACd,KAAK,cAAK,CAAC,UAAU,CAAC,IAAI;YACzB,OAAO,SAAS,CAAA;QACjB,KAAK,cAAK,CAAC,UAAU,CAAC,QAAQ;YAC7B,OAAO,aAAa,CAAA;QACrB,KAAK,cAAK,CAAC,UAAU,CAAC,IAAI;YACzB,OAAO,MAAM,CAAA;QACd,KAAK,cAAK,CAAC,UAAU,CAAC,IAAI;YACzB,OAAO,OAAO,CAAA;QACf;YACC,OAAO,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;KACzB;AACF,CAAC,CAAA;AArBY,QAAA,aAAa,iBAqBzB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/model/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./getColumnType"), exports);
|
|
18
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/model/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA+B"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
export interface NamingConventions {
|
|
2
|
-
getPrimaryField(): string
|
|
3
|
-
|
|
4
|
-
getColumnName(fieldName: string): string
|
|
5
|
-
|
|
6
|
-
getTableName(entityName: string): string
|
|
7
|
-
|
|
8
|
-
getJoiningColumnName(relationName: string): string
|
|
9
|
-
|
|
10
|
-
getJoiningTableName(entity: string, relation: string): string
|
|
11
|
-
|
|
12
|
-
getJoiningTableColumnNames(
|
|
13
|
-
owningEntity: string,
|
|
14
|
-
owningRelation: string,
|
|
15
|
-
inverseEntity: string,
|
|
16
|
-
inverseRelation?: string,
|
|
17
|
-
): [string, string]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const toUnderscore = (s: string) => s.replace(/([A-Z]+)/g, (x, y) => '_' + y.toLowerCase()).replace(/^_/, '')
|
|
21
|
-
export class DefaultNamingConventions implements NamingConventions {
|
|
22
|
-
getPrimaryField(): string {
|
|
23
|
-
return 'id'
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
getColumnName(fieldName: string): string {
|
|
27
|
-
return toUnderscore(fieldName)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
getTableName(entityName: string): string {
|
|
31
|
-
return toUnderscore(entityName)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
getJoiningColumnName(relationName: string): string {
|
|
35
|
-
return toUnderscore(relationName) + '_id'
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
getJoiningTableName(entity: string, relation: string): string {
|
|
39
|
-
return toUnderscore(entity) + '_' + toUnderscore(relation)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
getJoiningTableColumnNames(
|
|
43
|
-
owningEntity: string,
|
|
44
|
-
owningRelation: string,
|
|
45
|
-
inverseEntity: string,
|
|
46
|
-
inverseRelation?: string,
|
|
47
|
-
): [string, string] {
|
|
48
|
-
return [
|
|
49
|
-
toUnderscore(owningEntity) + '_id',
|
|
50
|
-
toUnderscore(inverseEntity === owningEntity ? owningRelation : inverseEntity) + '_id',
|
|
51
|
-
]
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Model } from '@contember/schema'
|
|
2
|
-
import { assertNever } from '../../utils'
|
|
3
|
-
|
|
4
|
-
export const getColumnType = (type: Exclude<Model.ColumnType, Model.ColumnType.Enum>): string => {
|
|
5
|
-
switch (type) {
|
|
6
|
-
case Model.ColumnType.Int:
|
|
7
|
-
return 'integer'
|
|
8
|
-
case Model.ColumnType.Double:
|
|
9
|
-
return 'double precision'
|
|
10
|
-
case Model.ColumnType.String:
|
|
11
|
-
return 'text'
|
|
12
|
-
case Model.ColumnType.Uuid:
|
|
13
|
-
return 'uuid'
|
|
14
|
-
case Model.ColumnType.Bool:
|
|
15
|
-
return 'boolean'
|
|
16
|
-
case Model.ColumnType.DateTime:
|
|
17
|
-
return 'timestamptz'
|
|
18
|
-
case Model.ColumnType.Date:
|
|
19
|
-
return 'date'
|
|
20
|
-
case Model.ColumnType.Json:
|
|
21
|
-
return 'jsonb'
|
|
22
|
-
default:
|
|
23
|
-
return assertNever(type)
|
|
24
|
-
}
|
|
25
|
-
}
|
package/src/model/utils/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './getColumnType'
|