@contember/engine-system-api 1.1.0-alpha.3 → 1.1.0-alpha.6
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/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrations/index.js +5 -1
- package/dist/src/migrations/index.js.map +1 -1
- package/dist/src/model/ProjectTruncateExecutor.d.ts.map +1 -1
- package/dist/src/model/ProjectTruncateExecutor.js +6 -3
- package/dist/src/model/ProjectTruncateExecutor.js.map +1 -1
- package/dist/src/model/authorization/index.js +5 -1
- package/dist/src/model/authorization/index.js.map +1 -1
- package/dist/src/model/commands/events/index.js +5 -1
- package/dist/src/model/commands/events/index.js.map +1 -1
- package/dist/src/model/commands/index.js +5 -1
- package/dist/src/model/commands/index.js.map +1 -1
- package/dist/src/model/commands/migrations/index.js +5 -1
- package/dist/src/model/commands/migrations/index.js.map +1 -1
- package/dist/src/model/commands/stages/index.js +5 -1
- package/dist/src/model/commands/stages/index.js.map +1 -1
- package/dist/src/model/database/index.js +5 -1
- package/dist/src/model/database/index.js.map +1 -1
- package/dist/src/model/dependencies/index.js +5 -1
- package/dist/src/model/dependencies/index.js.map +1 -1
- package/dist/src/model/dependencies/tenant/index.js +5 -1
- package/dist/src/model/dependencies/tenant/index.js.map +1 -1
- package/dist/src/model/dtos/index.js +5 -1
- package/dist/src/model/dtos/index.js.map +1 -1
- package/dist/src/model/events/index.js +5 -1
- package/dist/src/model/events/index.js.map +1 -1
- package/dist/src/model/helpers/index.js +5 -1
- package/dist/src/model/helpers/index.js.map +1 -1
- package/dist/src/model/index.js +5 -1
- package/dist/src/model/index.js.map +1 -1
- package/dist/src/model/migrations/index.js +5 -1
- package/dist/src/model/migrations/index.js.map +1 -1
- package/dist/src/model/queries/events/index.js +5 -1
- package/dist/src/model/queries/events/index.js.map +1 -1
- package/dist/src/model/queries/index.js +5 -1
- package/dist/src/model/queries/index.js.map +1 -1
- package/dist/src/model/queries/migrations/index.js +5 -1
- package/dist/src/model/queries/migrations/index.js.map +1 -1
- package/dist/src/model/queries/stages/index.js +5 -1
- package/dist/src/model/queries/stages/index.js.map +1 -1
- package/dist/src/model/stages/index.js +5 -1
- package/dist/src/model/stages/index.js.map +1 -1
- package/dist/src/resolvers/ResolverFactory.d.ts +2 -0
- package/dist/src/resolvers/ResolverFactory.d.ts.map +1 -1
- package/dist/src/resolvers/ResolverFactory.js +24 -1
- package/dist/src/resolvers/ResolverFactory.js.map +1 -1
- package/dist/src/resolvers/SystemResolverContext.js +2 -2
- package/dist/src/resolvers/SystemResolverContext.js.map +1 -1
- package/dist/src/resolvers/index.js +5 -1
- package/dist/src/resolvers/index.js.map +1 -1
- package/dist/src/resolvers/mutation/index.js +5 -1
- package/dist/src/resolvers/mutation/index.js.map +1 -1
- package/dist/src/resolvers/query/EventsQueryResolver.js +2 -2
- package/dist/src/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/src/resolvers/query/index.js +5 -1
- package/dist/src/resolvers/query/index.js.map +1 -1
- package/dist/src/resolvers/types/index.js +5 -1
- package/dist/src/resolvers/types/index.js.map +1 -1
- package/dist/src/schema/index.js +5 -1
- package/dist/src/schema/index.js.map +1 -1
- package/dist/src/schema/system.graphql.d.ts.map +1 -1
- package/dist/src/schema/system.graphql.js +6 -5
- package/dist/src/schema/system.graphql.js.map +1 -1
- package/dist/src/schema/types.d.ts +20 -10
- package/dist/src/schema/types.d.ts.map +1 -1
- package/dist/src/schema/types.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/utils/index.js +5 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/tests/cases/integration/systemApi/projectInitializer.test.js +3 -25
- package/dist/tests/cases/integration/systemApi/projectInitializer.test.js.map +1 -1
- package/dist/tests/cases/migrations/2020-05-06-150000-composed-primary.test.js +3 -24
- package/dist/tests/cases/migrations/2020-05-06-150000-composed-primary.test.js.map +1 -1
- package/dist/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.js +3 -24
- package/dist/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -17
- package/src/model/ProjectTruncateExecutor.ts +6 -3
- package/src/resolvers/ResolverFactory.ts +24 -0
- package/src/resolvers/SystemResolverContext.ts +1 -1
- package/src/resolvers/query/EventsQueryResolver.ts +1 -1
- package/src/schema/system.graphql.ts +6 -5
- package/src/schema/types.ts +23 -9
- package/tests/cases/integration/systemApi/projectInitializer.test.ts +4 -6
- package/tests/cases/migrations/2020-05-06-150000-composed-primary.test.ts +1 -4
- package/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.ts +2 -3
- package/vite.config.js +3 -0
- package/dist/tests/src/asserts.d.ts +0 -17
- package/dist/tests/src/asserts.d.ts.map +0 -1
- package/dist/tests/src/asserts.js +0 -81
- package/dist/tests/src/asserts.js.map +0 -1
- 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.
|
|
3
|
+
"version": "1.1.0-alpha.6",
|
|
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": "
|
|
9
|
+
"test": "vitest"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@contember/authorization": "^1.1.0-alpha.
|
|
13
|
-
"@contember/database": "^1.1.0-alpha.
|
|
14
|
-
"@contember/database-migrations": "^1.1.0-alpha.
|
|
15
|
-
"@contember/dic": "^1.1.0-alpha.
|
|
16
|
-
"@contember/engine-common": "^1.1.0-alpha.
|
|
17
|
-
"@contember/graphql-utils": "^1.1.0-alpha.
|
|
18
|
-
"@contember/queryable": "^1.1.0-alpha.
|
|
19
|
-
"@contember/schema": "^1.1.0-alpha.
|
|
20
|
-
"@contember/schema-migrations": "^1.1.0-alpha.
|
|
21
|
-
"@contember/schema-utils": "^1.1.0-alpha.
|
|
12
|
+
"@contember/authorization": "^1.1.0-alpha.6",
|
|
13
|
+
"@contember/database": "^1.1.0-alpha.6",
|
|
14
|
+
"@contember/database-migrations": "^1.1.0-alpha.6",
|
|
15
|
+
"@contember/dic": "^1.1.0-alpha.6",
|
|
16
|
+
"@contember/engine-common": "^1.1.0-alpha.6",
|
|
17
|
+
"@contember/graphql-utils": "^1.1.0-alpha.6",
|
|
18
|
+
"@contember/queryable": "^1.1.0-alpha.6",
|
|
19
|
+
"@contember/schema": "^1.1.0-alpha.6",
|
|
20
|
+
"@contember/schema-migrations": "^1.1.0-alpha.6",
|
|
21
|
+
"@contember/schema-utils": "^1.1.0-alpha.6",
|
|
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.
|
|
28
|
-
"@contember/schema-definition": "^1.1.0-alpha.
|
|
26
|
+
"@contember/engine-api-tester": "^1.1.0-alpha.6",
|
|
27
|
+
"@contember/schema-definition": "^1.1.0-alpha.6",
|
|
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 '
|
|
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 '
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
120
|
+
primaryKey: [PrimaryKey!]!
|
|
120
121
|
newValues: Json!
|
|
121
122
|
}
|
|
122
123
|
|
package/src/schema/types.ts
CHANGED
|
@@ -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['
|
|
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['
|
|
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['
|
|
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['
|
|
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['
|
|
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['
|
|
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['
|
|
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['
|
|
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['
|
|
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 {
|
|
4
|
-
|
|
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
|
-
|
|
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.
|
|
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 '
|
|
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 '
|
|
5
|
-
|
|
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
|
@@ -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"}
|
package/tests/src/asserts.ts
DELETED
|
@@ -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
|
-
}
|