@contember/engine-system-api 1.1.0-alpha.4 → 1.1.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/src/index.js +5 -1
  2. package/dist/src/index.js.map +1 -1
  3. package/dist/src/migrations/index.js +5 -1
  4. package/dist/src/migrations/index.js.map +1 -1
  5. package/dist/src/model/ProjectTruncateExecutor.d.ts.map +1 -1
  6. package/dist/src/model/ProjectTruncateExecutor.js +6 -3
  7. package/dist/src/model/ProjectTruncateExecutor.js.map +1 -1
  8. package/dist/src/model/authorization/index.js +5 -1
  9. package/dist/src/model/authorization/index.js.map +1 -1
  10. package/dist/src/model/commands/events/index.js +5 -1
  11. package/dist/src/model/commands/events/index.js.map +1 -1
  12. package/dist/src/model/commands/index.js +5 -1
  13. package/dist/src/model/commands/index.js.map +1 -1
  14. package/dist/src/model/commands/migrations/index.js +5 -1
  15. package/dist/src/model/commands/migrations/index.js.map +1 -1
  16. package/dist/src/model/commands/stages/index.js +5 -1
  17. package/dist/src/model/commands/stages/index.js.map +1 -1
  18. package/dist/src/model/database/index.js +5 -1
  19. package/dist/src/model/database/index.js.map +1 -1
  20. package/dist/src/model/dependencies/index.js +5 -1
  21. package/dist/src/model/dependencies/index.js.map +1 -1
  22. package/dist/src/model/dependencies/tenant/index.js +5 -1
  23. package/dist/src/model/dependencies/tenant/index.js.map +1 -1
  24. package/dist/src/model/dtos/index.js +5 -1
  25. package/dist/src/model/dtos/index.js.map +1 -1
  26. package/dist/src/model/events/index.js +5 -1
  27. package/dist/src/model/events/index.js.map +1 -1
  28. package/dist/src/model/helpers/index.js +5 -1
  29. package/dist/src/model/helpers/index.js.map +1 -1
  30. package/dist/src/model/index.js +5 -1
  31. package/dist/src/model/index.js.map +1 -1
  32. package/dist/src/model/migrations/index.js +5 -1
  33. package/dist/src/model/migrations/index.js.map +1 -1
  34. package/dist/src/model/queries/events/index.js +5 -1
  35. package/dist/src/model/queries/events/index.js.map +1 -1
  36. package/dist/src/model/queries/index.js +5 -1
  37. package/dist/src/model/queries/index.js.map +1 -1
  38. package/dist/src/model/queries/migrations/index.js +5 -1
  39. package/dist/src/model/queries/migrations/index.js.map +1 -1
  40. package/dist/src/model/queries/stages/index.js +5 -1
  41. package/dist/src/model/queries/stages/index.js.map +1 -1
  42. package/dist/src/model/stages/index.js +5 -1
  43. package/dist/src/model/stages/index.js.map +1 -1
  44. package/dist/src/resolvers/ResolverFactory.d.ts +2 -0
  45. package/dist/src/resolvers/ResolverFactory.d.ts.map +1 -1
  46. package/dist/src/resolvers/ResolverFactory.js +24 -1
  47. package/dist/src/resolvers/ResolverFactory.js.map +1 -1
  48. package/dist/src/resolvers/SystemResolverContext.js +2 -2
  49. package/dist/src/resolvers/SystemResolverContext.js.map +1 -1
  50. package/dist/src/resolvers/index.js +5 -1
  51. package/dist/src/resolvers/index.js.map +1 -1
  52. package/dist/src/resolvers/mutation/index.js +5 -1
  53. package/dist/src/resolvers/mutation/index.js.map +1 -1
  54. package/dist/src/resolvers/query/EventsQueryResolver.js +2 -2
  55. package/dist/src/resolvers/query/EventsQueryResolver.js.map +1 -1
  56. package/dist/src/resolvers/query/index.js +5 -1
  57. package/dist/src/resolvers/query/index.js.map +1 -1
  58. package/dist/src/resolvers/types/index.js +5 -1
  59. package/dist/src/resolvers/types/index.js.map +1 -1
  60. package/dist/src/schema/index.js +5 -1
  61. package/dist/src/schema/index.js.map +1 -1
  62. package/dist/src/schema/system.graphql.d.ts.map +1 -1
  63. package/dist/src/schema/system.graphql.js +6 -5
  64. package/dist/src/schema/system.graphql.js.map +1 -1
  65. package/dist/src/schema/types.d.ts +20 -10
  66. package/dist/src/schema/types.d.ts.map +1 -1
  67. package/dist/src/schema/types.js.map +1 -1
  68. package/dist/src/tsconfig.tsbuildinfo +1 -1
  69. package/dist/src/utils/index.js +5 -1
  70. package/dist/src/utils/index.js.map +1 -1
  71. package/dist/tests/cases/integration/systemApi/projectInitializer.test.js +3 -25
  72. package/dist/tests/cases/integration/systemApi/projectInitializer.test.js.map +1 -1
  73. package/dist/tests/cases/migrations/2020-05-06-150000-composed-primary.test.js +3 -24
  74. package/dist/tests/cases/migrations/2020-05-06-150000-composed-primary.test.js.map +1 -1
  75. package/dist/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.js +3 -24
  76. package/dist/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.js.map +1 -1
  77. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  78. package/package.json +15 -17
  79. package/src/model/ProjectTruncateExecutor.ts +6 -3
  80. package/src/resolvers/ResolverFactory.ts +24 -0
  81. package/src/resolvers/SystemResolverContext.ts +1 -1
  82. package/src/resolvers/query/EventsQueryResolver.ts +1 -1
  83. package/src/schema/system.graphql.ts +6 -5
  84. package/src/schema/types.ts +23 -9
  85. package/tests/cases/integration/systemApi/projectInitializer.test.ts +4 -6
  86. package/tests/cases/migrations/2020-05-06-150000-composed-primary.test.ts +1 -4
  87. package/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.ts +2 -3
  88. package/vite.config.js +3 -0
  89. package/dist/tests/src/asserts.d.ts +0 -17
  90. package/dist/tests/src/asserts.d.ts.map +0 -1
  91. package/dist/tests/src/asserts.js +0 -81
  92. package/dist/tests/src/asserts.js.map +0 -1
  93. package/tests/src/asserts.ts +0 -91
package/package.json CHANGED
@@ -1,39 +1,37 @@
1
1
  {
2
2
  "name": "@contember/engine-system-api",
3
- "version": "1.1.0-alpha.4",
3
+ "version": "1.1.0-alpha.7",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
7
7
  "scripts": {
8
8
  "generate": "gql-gen --config graphql.codegen.yml",
9
- "test": "uvu dist/tests/cases/ \\\\.js$"
9
+ "test": "vitest"
10
10
  },
11
11
  "dependencies": {
12
- "@contember/authorization": "^1.1.0-alpha.4",
13
- "@contember/database": "^1.1.0-alpha.4",
14
- "@contember/database-migrations": "^1.1.0-alpha.4",
15
- "@contember/dic": "^1.1.0-alpha.4",
16
- "@contember/engine-common": "^1.1.0-alpha.4",
17
- "@contember/graphql-utils": "^1.1.0-alpha.4",
18
- "@contember/queryable": "^1.1.0-alpha.4",
19
- "@contember/schema": "^1.1.0-alpha.4",
20
- "@contember/schema-migrations": "^1.1.0-alpha.4",
21
- "@contember/schema-utils": "^1.1.0-alpha.4",
12
+ "@contember/authorization": "^1.1.0-alpha.7",
13
+ "@contember/database": "^1.1.0-alpha.7",
14
+ "@contember/database-migrations": "^1.1.0-alpha.7",
15
+ "@contember/dic": "^1.1.0-alpha.7",
16
+ "@contember/engine-common": "^1.1.0-alpha.7",
17
+ "@contember/graphql-utils": "^1.1.0-alpha.7",
18
+ "@contember/queryable": "^1.1.0-alpha.7",
19
+ "@contember/schema": "^1.1.0-alpha.7",
20
+ "@contember/schema-migrations": "^1.1.0-alpha.7",
21
+ "@contember/schema-utils": "^1.1.0-alpha.7",
22
22
  "@graphql-tools/utils": "^7.10.0",
23
- "apollo-server-errors": "^2.4.0",
24
23
  "graphql-tag": "^2.12.5"
25
24
  },
26
25
  "devDependencies": {
27
- "@contember/engine-api-tester": "^1.1.0-alpha.4",
28
- "@contember/schema-definition": "^1.1.0-alpha.4",
26
+ "@contember/engine-api-tester": "^1.1.0-alpha.7",
27
+ "@contember/schema-definition": "^1.1.0-alpha.7",
29
28
  "@graphql-codegen/cli": "^1.15.2",
30
29
  "@graphql-codegen/typescript": "^1.15.2",
31
30
  "@graphql-codegen/typescript-operations": "^1.15.2",
32
31
  "@graphql-codegen/typescript-resolvers": "^1.15.2",
33
32
  "@types/node": "^17.0.5",
34
33
  "graphql": "^15.4.0",
35
- "pg": "^8.5.0",
36
- "uvu": "^0.5.3"
34
+ "pg": "^8.5.0"
37
35
  },
38
36
  "peerDependencies": {
39
37
  "graphql": ">= 14.6.0",
@@ -8,11 +8,14 @@ import { StagesQuery } from './queries'
8
8
 
9
9
  export class ProjectTruncateExecutor {
10
10
  public async truncateProject(db: DatabaseContext, project: ProjectConfig, schema: Schema) {
11
+ const tableNames = Object.values(schema.model.entities).filter(it => !it.view).map(it => it.tableName)
12
+ const junctionTableNames = getJunctionTables(schema.model).map(it => it.tableName)
13
+ const allTableNames = [...tableNames, ...junctionTableNames]
14
+ if (allTableNames.length === 0) {
15
+ return
16
+ }
11
17
  await db.transaction(async trx => {
12
18
  await trx.client.query('SET CONSTRAINTS ALL DEFERRED')
13
- const tableNames = Object.values(schema.model.entities).filter(it => !it.view).map(it => it.tableName)
14
- const junctionTableNames = getJunctionTables(schema.model).map(it => it.tableName)
15
- const allTableNames = [...tableNames, ...junctionTableNames]
16
19
  const stages = await db.queryHandler.fetch(new StagesQuery())
17
20
  for (const stage of stages) {
18
21
  const wrappedNames = allTableNames.map(it => `${wrapIdentifier(stage.schema)}.${wrapIdentifier(it)}`)
@@ -4,6 +4,7 @@ import { assertNever } from '../utils'
4
4
  import { MigrateMutationResolver, MigrationAlterMutationResolver, TruncateMutationResolver } from './mutation'
5
5
  import { DateTimeType, JSONType } from '@contember/graphql-utils'
6
6
  import { EventOldValuesResolver } from './types'
7
+ import { GraphQLError, GraphQLScalarType, Kind } from 'graphql'
7
8
 
8
9
  export class ResolverFactory {
9
10
  public constructor(
@@ -20,6 +21,7 @@ export class ResolverFactory {
20
21
  const resolvers: Resolvers & Required<Pick<Resolvers, 'Mutation'>> = {
21
22
  DateTime: DateTimeType,
22
23
  Json: JSONType,
24
+ PrimaryKey: PrimaryKeyType,
23
25
  Event: {
24
26
  __resolveType: (obj: Event) => {
25
27
  switch (obj.type) {
@@ -61,3 +63,25 @@ export class ResolverFactory {
61
63
  return resolvers
62
64
  }
63
65
  }
66
+
67
+ const parseValue = (value: any) => {
68
+ if ((typeof value === 'string' && value !== '') || typeof value === 'number' && isFinite(value) && Math.floor(value) === value) {
69
+ return value
70
+ }
71
+ throw new GraphQLError('PrimaryKey cannot represent value: ' + JSON.stringify(value))
72
+ }
73
+ export const PrimaryKeyType = new GraphQLScalarType({
74
+ name: 'PrimaryKey',
75
+ description: 'PrimaryKey custom scalar type. Can be Int or String',
76
+ serialize: parseValue,
77
+ parseValue: parseValue,
78
+ parseLiteral(ast) {
79
+ if (ast.kind === Kind.STRING) {
80
+ return ast.value
81
+ }
82
+ if (ast.kind === Kind.INT) {
83
+ return Number.parseInt(ast.value, 10)
84
+ }
85
+ return null
86
+ },
87
+ })
@@ -1,6 +1,6 @@
1
1
  import { Authorizator } from '@contember/authorization'
2
2
  import { Schema } from '@contember/schema'
3
- import { ForbiddenError } from 'apollo-server-errors'
3
+ import { ForbiddenError } from '@contember/graphql-utils'
4
4
  import { DatabaseContext, Identity, SchemaVersionBuilder } from '../model'
5
5
  import { ProjectConfig } from '../types'
6
6
  import { StagePermissionsFactory } from '../model/authorization/StagePermissionsFactory'
@@ -3,7 +3,7 @@ import { SystemResolverContext } from '../SystemResolverContext'
3
3
  import { QueryResolver } from '../Resolver'
4
4
  import { EventsOrder, QueryEventsArgs, ResolversTypes } from '../../schema'
5
5
  import { AuthorizationActions, EventResponseBuilder, EventsQuery, StageBySlugQuery } from '../../model'
6
- import { UserInputError } from 'apollo-server-errors'
6
+ import { UserInputError } from '@contember/graphql-utils'
7
7
 
8
8
  export class EventsQueryResolver implements QueryResolver<'events'> {
9
9
  constructor(
@@ -4,6 +4,7 @@ import { DocumentNode } from 'graphql'
4
4
  const schema: DocumentNode = gql`
5
5
  scalar DateTime
6
6
  scalar Json
7
+ scalar PrimaryKey
7
8
 
8
9
  schema {
9
10
  query: Query
@@ -55,7 +56,7 @@ const schema: DocumentNode = gql`
55
56
 
56
57
  input EventFilterRow {
57
58
  tableName: String!
58
- primaryKey: [String!]!
59
+ primaryKey: [PrimaryKey!]!
59
60
  }
60
61
 
61
62
  interface Event {
@@ -68,7 +69,7 @@ const schema: DocumentNode = gql`
68
69
  appliedAt: DateTime!
69
70
  type: EventType!
70
71
  tableName: String!
71
- primaryKey: [String!]!
72
+ primaryKey: [PrimaryKey!]!
72
73
  }
73
74
 
74
75
  enum EventType {
@@ -87,7 +88,7 @@ const schema: DocumentNode = gql`
87
88
  appliedAt: DateTime!
88
89
  type: EventType!
89
90
  tableName: String!
90
- primaryKey: [String!]!
91
+ primaryKey: [PrimaryKey!]!
91
92
  oldValues: Json!
92
93
  diffValues: Json!
93
94
  }
@@ -102,7 +103,7 @@ const schema: DocumentNode = gql`
102
103
  appliedAt: DateTime!
103
104
  type: EventType!
104
105
  tableName: String!
105
- primaryKey: [String!]!
106
+ primaryKey: [PrimaryKey!]!
106
107
  oldValues: Json!
107
108
  }
108
109
 
@@ -116,7 +117,7 @@ const schema: DocumentNode = gql`
116
117
  appliedAt: DateTime!
117
118
  type: EventType!
118
119
  tableName: String!
119
- primaryKey: [String!]!
120
+ primaryKey: [PrimaryKey!]!
120
121
  newValues: Json!
121
122
  }
122
123
 
@@ -13,6 +13,7 @@ export type Scalars = {
13
13
  Float: number
14
14
  DateTime: Date
15
15
  Json: unknown
16
+ PrimaryKey: any
16
17
  }
17
18
 
18
19
  export type CreateEvent = Event & {
@@ -26,7 +27,7 @@ export type CreateEvent = Event & {
26
27
  readonly appliedAt: Scalars['DateTime']
27
28
  readonly type: EventType
28
29
  readonly tableName: Scalars['String']
29
- readonly primaryKey: ReadonlyArray<Scalars['String']>
30
+ readonly primaryKey: ReadonlyArray<Scalars['PrimaryKey']>
30
31
  readonly newValues: Scalars['Json']
31
32
  }
32
33
 
@@ -42,7 +43,7 @@ export type DeleteEvent = Event & {
42
43
  readonly appliedAt: Scalars['DateTime']
43
44
  readonly type: EventType
44
45
  readonly tableName: Scalars['String']
45
- readonly primaryKey: ReadonlyArray<Scalars['String']>
46
+ readonly primaryKey: ReadonlyArray<Scalars['PrimaryKey']>
46
47
  readonly oldValues: Scalars['Json']
47
48
  }
48
49
 
@@ -56,12 +57,12 @@ export type Event = {
56
57
  readonly appliedAt: Scalars['DateTime']
57
58
  readonly type: EventType
58
59
  readonly tableName: Scalars['String']
59
- readonly primaryKey: ReadonlyArray<Scalars['String']>
60
+ readonly primaryKey: ReadonlyArray<Scalars['PrimaryKey']>
60
61
  }
61
62
 
62
63
  export type EventFilterRow = {
63
64
  readonly tableName: Scalars['String']
64
- readonly primaryKey: ReadonlyArray<Scalars['String']>
65
+ readonly primaryKey: ReadonlyArray<Scalars['PrimaryKey']>
65
66
  }
66
67
 
67
68
  export enum EventType {
@@ -218,6 +219,7 @@ export type MutationMigrationModifyArgs = {
218
219
  modification: MigrationModification
219
220
  }
220
221
 
222
+
221
223
  export type Query = {
222
224
  readonly __typename?: 'Query'
223
225
  readonly stages: ReadonlyArray<Stage>
@@ -258,7 +260,7 @@ export type UpdateEvent = Event & {
258
260
  readonly appliedAt: Scalars['DateTime']
259
261
  readonly type: EventType
260
262
  readonly tableName: Scalars['String']
261
- readonly primaryKey: ReadonlyArray<Scalars['String']>
263
+ readonly primaryKey: ReadonlyArray<Scalars['PrimaryKey']>
262
264
  readonly oldValues: Scalars['Json']
263
265
  readonly diffValues: Scalars['Json']
264
266
  }
@@ -268,6 +270,10 @@ export type UpdateEvent = Event & {
268
270
  export type ResolverTypeWrapper<T> = Promise<T> | T
269
271
 
270
272
 
273
+ export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
274
+ resolve: ResolverFn<TResult, TParent, TContext, TArgs>
275
+ }
276
+
271
277
  export type LegacyStitchingResolver<TResult, TParent, TContext, TArgs> = {
272
278
  fragment: string
273
279
  resolve: ResolverFn<TResult, TParent, TContext, TArgs>
@@ -280,6 +286,7 @@ export type NewStitchingResolver<TResult, TParent, TContext, TArgs> = {
280
286
  export type StitchingResolver<TResult, TParent, TContext, TArgs> = LegacyStitchingResolver<TResult, TParent, TContext, TArgs> | NewStitchingResolver<TResult, TParent, TContext, TArgs>
281
287
  export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
282
288
  | ResolverFn<TResult, TParent, TContext, TArgs>
289
+ | ResolverWithResolve<TResult, TParent, TContext, TArgs>
283
290
  | StitchingResolver<TResult, TParent, TContext, TArgs>
284
291
 
285
292
  export type ResolverFn<TResult, TParent, TContext, TArgs> = (
@@ -369,6 +376,7 @@ export type ResolversTypes = {
369
376
  MigrationModifyErrorCode: MigrationModifyErrorCode
370
377
  MigrationModifyResponse: ResolverTypeWrapper<MigrationModifyResponse>
371
378
  Mutation: ResolverTypeWrapper<{}>
379
+ PrimaryKey: ResolverTypeWrapper<Scalars['PrimaryKey']>
372
380
  Query: ResolverTypeWrapper<{}>
373
381
  Stage: ResolverTypeWrapper<Stage>
374
382
  TruncateResponse: ResolverTypeWrapper<TruncateResponse>
@@ -400,6 +408,7 @@ export type ResolversParentTypes = {
400
408
  MigrationModifyError: MigrationModifyError
401
409
  MigrationModifyResponse: MigrationModifyResponse
402
410
  Mutation: {}
411
+ PrimaryKey: Scalars['PrimaryKey']
403
412
  Query: {}
404
413
  Stage: Stage
405
414
  TruncateResponse: TruncateResponse
@@ -416,7 +425,7 @@ export type CreateEventResolvers<ContextType = any, ParentType extends Resolvers
416
425
  appliedAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
417
426
  type?: Resolver<ResolversTypes['EventType'], ParentType, ContextType>
418
427
  tableName?: Resolver<ResolversTypes['String'], ParentType, ContextType>
419
- primaryKey?: Resolver<ReadonlyArray<ResolversTypes['String']>, ParentType, ContextType>
428
+ primaryKey?: Resolver<ReadonlyArray<ResolversTypes['PrimaryKey']>, ParentType, ContextType>
420
429
  newValues?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
421
430
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
422
431
  }
@@ -435,7 +444,7 @@ export type DeleteEventResolvers<ContextType = any, ParentType extends Resolvers
435
444
  appliedAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
436
445
  type?: Resolver<ResolversTypes['EventType'], ParentType, ContextType>
437
446
  tableName?: Resolver<ResolversTypes['String'], ParentType, ContextType>
438
- primaryKey?: Resolver<ReadonlyArray<ResolversTypes['String']>, ParentType, ContextType>
447
+ primaryKey?: Resolver<ReadonlyArray<ResolversTypes['PrimaryKey']>, ParentType, ContextType>
439
448
  oldValues?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
440
449
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
441
450
  }
@@ -451,7 +460,7 @@ export type EventResolvers<ContextType = any, ParentType extends ResolversParent
451
460
  appliedAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
452
461
  type?: Resolver<ResolversTypes['EventType'], ParentType, ContextType>
453
462
  tableName?: Resolver<ResolversTypes['String'], ParentType, ContextType>
454
- primaryKey?: Resolver<ReadonlyArray<ResolversTypes['String']>, ParentType, ContextType>
463
+ primaryKey?: Resolver<ReadonlyArray<ResolversTypes['PrimaryKey']>, ParentType, ContextType>
455
464
  }
456
465
 
457
466
  export type ExecutedMigrationResolvers<ContextType = any, ParentType extends ResolversParentTypes['ExecutedMigration'] = ResolversParentTypes['ExecutedMigration']> = {
@@ -520,6 +529,10 @@ export type MutationResolvers<ContextType = any, ParentType extends ResolversPar
520
529
  truncate?: Resolver<ResolversTypes['TruncateResponse'], ParentType, ContextType>
521
530
  }
522
531
 
532
+ export interface PrimaryKeyScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['PrimaryKey'], any> {
533
+ name: 'PrimaryKey'
534
+ }
535
+
523
536
  export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
524
537
  stages?: Resolver<ReadonlyArray<ResolversTypes['Stage']>, ParentType, ContextType>
525
538
  executedMigrations?: Resolver<ReadonlyArray<ResolversTypes['ExecutedMigration']>, ParentType, ContextType, RequireFields<QueryExecutedMigrationsArgs, never>>
@@ -548,7 +561,7 @@ export type UpdateEventResolvers<ContextType = any, ParentType extends Resolvers
548
561
  appliedAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
549
562
  type?: Resolver<ResolversTypes['EventType'], ParentType, ContextType>
550
563
  tableName?: Resolver<ResolversTypes['String'], ParentType, ContextType>
551
- primaryKey?: Resolver<ReadonlyArray<ResolversTypes['String']>, ParentType, ContextType>
564
+ primaryKey?: Resolver<ReadonlyArray<ResolversTypes['PrimaryKey']>, ParentType, ContextType>
552
565
  oldValues?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
553
566
  diffValues?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
554
567
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
@@ -569,6 +582,7 @@ export type Resolvers<ContextType = any> = {
569
582
  MigrationModifyError?: MigrationModifyErrorResolvers<ContextType>
570
583
  MigrationModifyResponse?: MigrationModifyResponseResolvers<ContextType>
571
584
  Mutation?: MutationResolvers<ContextType>
585
+ PrimaryKey?: GraphQLScalarType
572
586
  Query?: QueryResolvers<ContextType>
573
587
  Stage?: StageResolvers<ContextType>
574
588
  TruncateResponse?: TruncateResponseResolvers<ContextType>
@@ -1,13 +1,12 @@
1
1
  import { ApiTester } from '@contember/engine-api-tester'
2
2
  import { ProjectConfig, StageConfig } from '../../../../src'
3
- import { suite } from 'uvu'
4
- import * as assert from '../../../src/asserts'
3
+ import { assert, test } from 'vitest'
4
+
5
5
  import { Logger } from '@contember/engine-common'
6
6
 
7
- const projectInitializerTest = suite('Project initializer')
8
7
  const nullLogger = new Logger(() => {})
9
8
 
10
- projectInitializerTest('create stage', async () => {
9
+ test('create stage', async () => {
11
10
  const prodStage: StageConfig = {
12
11
  name: 'Prod',
13
12
  slug: 'prod',
@@ -25,9 +24,8 @@ projectInitializerTest('create stage', async () => {
25
24
 
26
25
  await tester.systemContainer.projectInitializer.initialize(tester.databaseContextFactory, project, nullLogger)
27
26
  const createdStagesA = await tester.stages.refreshCreatedStages()
28
- assert.contains(createdStagesA, 'prod')
27
+ assert.ok(createdStagesA.has('prod'))
29
28
 
30
29
  await tester.cleanup()
31
30
  })
32
31
 
33
- projectInitializerTest.run()
@@ -1,8 +1,7 @@
1
1
  import migration from '../../../src/migrations/2020-05-06-150000-composed-primary'
2
2
  import { createMigrationBuilder } from '@contember/database-migrations'
3
3
  import { sampleProject } from '@contember/engine-api-tester'
4
- import { test } from 'uvu'
5
- import * as assert from 'uvu/assert'
4
+ import { test, assert } from 'vitest'
6
5
 
7
6
  test('many-has-many-primary migration sql', async () => {
8
7
  const builder = createMigrationBuilder()
@@ -222,5 +221,3 @@ DROP FUNCTION "make_diff"("old" jsonb, "new" jsonb);
222
221
  `,
223
222
  )
224
223
  })
225
-
226
- test.run()
@@ -1,8 +1,8 @@
1
1
  import migration from '../../../src/migrations/2020-06-01-103000-event-trigger-perf'
2
2
  import { createMigrationBuilder } from '@contember/database-migrations'
3
3
  import { sampleProject } from '@contember/engine-api-tester'
4
- import { test } from 'uvu'
5
- import * as assert from 'uvu/assert'
4
+ import { test, assert } from 'vitest'
5
+
6
6
 
7
7
  test('event-trigger-performance sql', async () => {
8
8
  const builder = createMigrationBuilder()
@@ -165,4 +165,3 @@ CREATE TRIGGER "log_event_statement"
165
165
  )
166
166
  })
167
167
 
168
- test.run()
package/vite.config.js ADDED
@@ -0,0 +1,3 @@
1
+ import { createViteConfig } from '../../scripts/vite/createViteConfig'
2
+
3
+ export default createViteConfig()
@@ -1,17 +0,0 @@
1
- import * as uvuAssert from 'uvu/assert';
2
- export * from 'uvu/assert';
3
- export declare function assert(bool: boolean, actual: any, expects: any, operator: string, detailer: false | ((actual: any, expected: any) => string), backup: string, msg?: uvuAssert.Message): void;
4
- export declare function throwsAsync(cb: Promise<any> | (() => Promise<any>), exp?: uvuAssert.Message | RegExp | Function, msg?: uvuAssert.Message): Promise<void>;
5
- export declare const contains: <T>(actual: Iterable<T> | T[], expects: T, msg?: uvuAssert.Message | undefined) => void;
6
- export declare const not: {
7
- contains: <T>(actual: Iterable<T> | T[], expects: T, msg?: uvuAssert.Message | undefined) => void;
8
- ok(actual: any, msg?: uvuAssert.Message | undefined): void;
9
- equal(actual: any, expects: any, msg?: uvuAssert.Message | undefined): void;
10
- type(actual: any, expects: uvuAssert.Types, msg?: uvuAssert.Message | undefined): void;
11
- instance(actual: any, expects: any, msg?: uvuAssert.Message | undefined): void;
12
- snapshot(actual: string, expects: string, msg?: uvuAssert.Message | undefined): void;
13
- fixture(actual: string, expects: string, msg?: uvuAssert.Message | undefined): void;
14
- match(actual: string, expects: string | RegExp, msg?: uvuAssert.Message | undefined): void;
15
- throws(fn: Function, expects?: Function | RegExp | uvuAssert.Message | undefined, msg?: uvuAssert.Message | undefined): void;
16
- };
17
- //# sourceMappingURL=asserts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"asserts.d.ts","sourceRoot":"","sources":["../../../tests/src/asserts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,YAAY,CAAA;AAEvC,cAAc,YAAY,CAAA;AAK1B,wBAAgB,MAAM,CACrB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,MAAM,CAAC,EAC1D,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,SAAS,CAAC,OAAO,QAWvB;AAMD,wBAAsB,WAAW,CAChC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EACvC,GAAG,CAAC,EAAE,SAAS,CAAC,OAAO,GAAG,MAAM,GAAG,QAAQ,EAC3C,GAAG,CAAC,EAAE,SAAS,CAAC,OAAO,iBA4BvB;AAED,eAAO,MAAM,QAAQ,qFAA8D,IAWlF,CAAA;AACD,eAAO,MAAM,GAAG;iGAEsD,IAAI;;;;;;;;;CAYzE,CAAA"}
@@ -1,81 +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
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
- };
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.not = exports.contains = exports.throwsAsync = exports.assert = void 0;
26
- const uvuAssert = __importStar(require("uvu/assert"));
27
- __exportStar(require("uvu/assert"), exports);
28
- /*
29
- based on https://github.com/lukeed/uvu/blob/30c10e038e5b99c993f26b93bf411c966a9896eb/src/assert.js#L26, because it is not exported
30
- */
31
- function assert(bool, actual, expects, operator, detailer, backup, msg) {
32
- if (bool) {
33
- return;
34
- }
35
- const message = msg || backup;
36
- if (message instanceof Error) {
37
- throw message;
38
- }
39
- const details = (detailer && detailer(actual, expects)) || undefined;
40
- throw new uvuAssert.Assertion({ actual, expects, operator, message, details, generated: !msg });
41
- }
42
- exports.assert = assert;
43
- /*
44
- based on https://github.com/lukeed/uvu/blob/30c10e038e5b99c993f26b93bf411c966a9896eb/src/assert.js#L80
45
- with async function support
46
- */
47
- async function throwsAsync(cb, exp, msg) {
48
- if (!msg && typeof exp === 'string') {
49
- msg = exp;
50
- exp = undefined;
51
- }
52
- try {
53
- await (typeof cb === 'function' ? cb() : cb);
54
- assert(false, false, true, 'throws', false, 'Expected function to throw', msg);
55
- }
56
- catch (err) {
57
- if (err instanceof uvuAssert.Assertion)
58
- throw err;
59
- if (typeof exp === 'function') {
60
- assert(exp(err), false, true, 'throws', false, 'Expected function to throw matching exception', msg);
61
- }
62
- else if (exp instanceof RegExp && err instanceof Error) {
63
- let tmp = '`' + String(exp) + '`';
64
- assert(exp.test(err.message), false, true, 'throws', false, `Expected function to throw exception matching ${tmp} pattern`, msg);
65
- }
66
- }
67
- }
68
- exports.throwsAsync = throwsAsync;
69
- const contains = (actual, expects, msg) => {
70
- const actualArr = [...actual];
71
- assert(actualArr.includes(expects), actualArr, expects, 'contains', false, 'Expected value to include the element', msg);
72
- };
73
- exports.contains = contains;
74
- exports.not = {
75
- ...uvuAssert.not,
76
- contains: (actual, expects, msg) => {
77
- const actualArr = [...actual];
78
- assert(!actualArr.includes(expects), actualArr, expects, 'not.contains', false, 'Expected value not to include the element', msg);
79
- },
80
- };
81
- //# sourceMappingURL=asserts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"asserts.js","sourceRoot":"","sources":["../../../tests/src/asserts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAAuC;AAEvC,6CAA0B;AAE1B;;GAEG;AACH,SAAgB,MAAM,CACrB,IAAa,EACb,MAAW,EACX,OAAY,EACZ,QAAgB,EAChB,QAA0D,EAC1D,MAAc,EACd,GAAuB;IAEvB,IAAI,IAAI,EAAE;QACT,OAAM;KACN;IACD,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,CAAA;IAC7B,IAAI,OAAO,YAAY,KAAK,EAAE;QAC7B,MAAM,OAAO,CAAA;KACb;IACD,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,SAAS,CAAA;IACpE,MAAM,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;AAChG,CAAC;AAlBD,wBAkBC;AAED;;;GAGG;AACI,KAAK,UAAU,WAAW,CAChC,EAAuC,EACvC,GAA2C,EAC3C,GAAuB;IAEvB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QACpC,GAAG,GAAG,GAAG,CAAA;QACT,GAAG,GAAG,SAAS,CAAA;KACf;IAED,IAAI;QACH,MAAM,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC5C,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,4BAA4B,EAAE,GAAG,CAAC,CAAA;KAC9E;IAAC,OAAO,GAAG,EAAE;QACb,IAAI,GAAG,YAAY,SAAS,CAAC,SAAS;YAAE,MAAM,GAAG,CAAA;QAEjD,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;YAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,+CAA+C,EAAE,GAAG,CAAC,CAAA;SACpG;aAAM,IAAI,GAAG,YAAY,MAAM,IAAI,GAAG,YAAY,KAAK,EAAE;YACzD,IAAI,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;YACjC,MAAM,CACL,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EACrB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,iDAAiD,GAAG,UAAU,EAC9D,GAAG,CACH,CAAA;SACD;KACD;AACF,CAAC;AA/BD,kCA+BC;AAEM,MAAM,QAAQ,GAAG,CAAI,MAAyB,EAAE,OAAU,EAAE,GAAa,EAAQ,EAAE;IACzF,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IAC7B,MAAM,CACL,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC3B,SAAS,EACT,OAAO,EACP,UAAU,EACV,KAAK,EACL,uCAAuC,EACvC,GAAG,CACH,CAAA;AACF,CAAC,CAAA;AAXY,QAAA,QAAQ,YAWpB;AACY,QAAA,GAAG,GAAG;IAClB,GAAG,SAAS,CAAC,GAAG;IAChB,QAAQ,EAAE,CAAI,MAAyB,EAAE,OAAU,EAAE,GAAa,EAAQ,EAAE;QAC3E,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;QAC7B,MAAM,CACL,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC5B,SAAS,EACT,OAAO,EACP,cAAc,EACd,KAAK,EACL,2CAA2C,EAC3C,GAAG,CACH,CAAA;IACF,CAAC;CACD,CAAA"}
@@ -1,91 +0,0 @@
1
- import * as uvuAssert from 'uvu/assert'
2
- import { Message } from 'uvu/assert'
3
- export * from 'uvu/assert'
4
-
5
- /*
6
- based on https://github.com/lukeed/uvu/blob/30c10e038e5b99c993f26b93bf411c966a9896eb/src/assert.js#L26, because it is not exported
7
- */
8
- export function assert(
9
- bool: boolean,
10
- actual: any,
11
- expects: any,
12
- operator: string,
13
- detailer: false | ((actual: any, expected: any) => string),
14
- backup: string,
15
- msg?: uvuAssert.Message,
16
- ) {
17
- if (bool) {
18
- return
19
- }
20
- const message = msg || backup
21
- if (message instanceof Error) {
22
- throw message
23
- }
24
- const details = (detailer && detailer(actual, expects)) || undefined
25
- throw new uvuAssert.Assertion({ actual, expects, operator, message, details, generated: !msg })
26
- }
27
-
28
- /*
29
- based on https://github.com/lukeed/uvu/blob/30c10e038e5b99c993f26b93bf411c966a9896eb/src/assert.js#L80
30
- with async function support
31
- */
32
- export async function throwsAsync(
33
- cb: Promise<any> | (() => Promise<any>),
34
- exp?: uvuAssert.Message | RegExp | Function,
35
- msg?: uvuAssert.Message,
36
- ) {
37
- if (!msg && typeof exp === 'string') {
38
- msg = exp
39
- exp = undefined
40
- }
41
-
42
- try {
43
- await (typeof cb === 'function' ? cb() : cb)
44
- assert(false, false, true, 'throws', false, 'Expected function to throw', msg)
45
- } catch (err) {
46
- if (err instanceof uvuAssert.Assertion) throw err
47
-
48
- if (typeof exp === 'function') {
49
- assert(exp(err), false, true, 'throws', false, 'Expected function to throw matching exception', msg)
50
- } else if (exp instanceof RegExp && err instanceof Error) {
51
- let tmp = '`' + String(exp) + '`'
52
- assert(
53
- exp.test(err.message),
54
- false,
55
- true,
56
- 'throws',
57
- false,
58
- `Expected function to throw exception matching ${tmp} pattern`,
59
- msg,
60
- )
61
- }
62
- }
63
- }
64
-
65
- export const contains = <T>(actual: T[] | Iterable<T>, expects: T, msg?: Message): void => {
66
- const actualArr = [...actual]
67
- assert(
68
- actualArr.includes(expects),
69
- actualArr,
70
- expects,
71
- 'contains',
72
- false,
73
- 'Expected value to include the element',
74
- msg,
75
- )
76
- }
77
- export const not = {
78
- ...uvuAssert.not,
79
- contains: <T>(actual: T[] | Iterable<T>, expects: T, msg?: Message): void => {
80
- const actualArr = [...actual]
81
- assert(
82
- !actualArr.includes(expects),
83
- actualArr,
84
- expects,
85
- 'not.contains',
86
- false,
87
- 'Expected value not to include the element',
88
- msg,
89
- )
90
- },
91
- }