@contember/engine-content-api 2.2.0-alpha.3 → 2.2.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +6 -0
- package/dist/development/src/mapper/select/ConditionBuilder.cjs +8 -1
- package/dist/development/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/ConditionBuilder.js +8 -1
- package/dist/development/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.cjs +8 -1
- package/dist/production/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.js +8 -1
- package/dist/production/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/validation/utils.d.ts.map +1 -1
- package/dist/tests/cases/integration/graphQlSchema/model.d.ts +1 -1
- package/dist/tests/src/assert.d.ts.map +1 -1
- package/dist/tests/src/tags.d.ts.map +1 -1
- package/dist/tests/src/test.d.ts.map +1 -1
- package/dist/tests/src/testGraphql.d.ts.map +1 -1
- package/dist/tests/src/testUuid.d.ts.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ExecutionContainer.d.ts.map +1 -1
- package/dist/types/acl/Authorizator.d.ts.map +1 -1
- package/dist/types/acl/EvaluatedPredicateReplacer.d.ts.map +1 -1
- package/dist/types/acl/PermissionFactory.d.ts.map +1 -1
- package/dist/types/acl/PredicateFactory.d.ts.map +1 -1
- package/dist/types/acl/PredicatesInjector.d.ts.map +1 -1
- package/dist/types/acl/VariableInjector.d.ts.map +1 -1
- package/dist/types/acl/VariableUtils.d.ts.map +1 -1
- package/dist/types/exception.d.ts.map +1 -1
- package/dist/types/extensions/hasManyToHasOneReducer/HasManyToHasOneReducer.d.ts.map +1 -1
- package/dist/types/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
- package/dist/types/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
- package/dist/types/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
- package/dist/types/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
- package/dist/types/extensions/paginatedHasMany/PaginatedHasManyFieldProvider.d.ts.map +1 -1
- package/dist/types/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
- package/dist/types/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
- package/dist/types/input-validation/ColumnValueResolver.d.ts.map +1 -1
- package/dist/types/input-validation/EntityRulesResolver.d.ts.map +1 -1
- package/dist/types/input-validation/JsonSchemaValidator.d.ts.map +1 -1
- package/dist/types/input-validation/QueryAstFactory.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationContext.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationDataSelector.d.ts +1 -1
- package/dist/types/input-validation/ValidationDataSelector.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationEvaluation.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationPath.d.ts.map +1 -1
- package/dist/types/input-validation/dependencies/DependencyCollector.d.ts.map +1 -1
- package/dist/types/input-validation/dependencies/DependencyMerger.d.ts.map +1 -1
- package/dist/types/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/types/input-validation/preValidation/InputPreValidator.d.ts.map +1 -1
- package/dist/types/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/types/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
- package/dist/types/inputProcessing/FieldNode.d.ts.map +1 -1
- package/dist/types/inputProcessing/ObjectNode.d.ts.map +1 -1
- package/dist/types/inputProcessing/UniqueWhereExpander.d.ts.map +1 -1
- package/dist/types/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
- package/dist/types/introspection/IntrospectionSchemaDefinitionFactory.d.ts.map +1 -1
- package/dist/types/introspection/IntrospectionSchemaFactory.d.ts.map +1 -1
- package/dist/types/introspection/introspection.schema.d.ts.map +1 -1
- package/dist/types/mapper/CheckedPrimary.d.ts.map +1 -1
- package/dist/types/mapper/ColumnValue.d.ts.map +1 -1
- package/dist/types/mapper/Constraints.d.ts.map +1 -1
- package/dist/types/mapper/ErrorUtils.d.ts.map +1 -1
- package/dist/types/mapper/EventManager.d.ts +9 -9
- package/dist/types/mapper/EventManager.d.ts.map +1 -1
- package/dist/types/mapper/JunctionTableManager.d.ts.map +1 -1
- package/dist/types/mapper/Mapper.d.ts.map +1 -1
- package/dist/types/mapper/MapperFactory.d.ts.map +1 -1
- package/dist/types/mapper/MutationProcessorHelper.d.ts.map +1 -1
- package/dist/types/mapper/Result.d.ts.map +1 -1
- package/dist/types/mapper/delete/DeleteExecutor.d.ts.map +1 -1
- package/dist/types/mapper/delete/DeleteState.d.ts.map +1 -1
- package/dist/types/mapper/delete/DeletedEntitiesStorage.d.ts.map +1 -1
- package/dist/types/mapper/delete/helpers.d.ts +1 -1
- package/dist/types/mapper/delete/helpers.d.ts.map +1 -1
- package/dist/types/mapper/insert/InsertBuilder.d.ts.map +1 -1
- package/dist/types/mapper/insert/InsertBuilderFactory.d.ts.map +1 -1
- package/dist/types/mapper/insert/Inserter.d.ts.map +1 -1
- package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/insert/relations/ManyHasManyCreateInputProcessor.d.ts +1 -1
- package/dist/types/mapper/insert/relations/ManyHasManyCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/insert/relations/ManyHasOneCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/insert/relations/OneHasManyCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.d.ts +1 -1
- package/dist/types/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/select/ConditionBuilder.d.ts.map +1 -1
- package/dist/types/mapper/select/JoinBuilder.d.ts.map +1 -1
- package/dist/types/mapper/select/JoinVisitor.d.ts.map +1 -1
- package/dist/types/mapper/select/OrderByBuilder.d.ts.map +1 -1
- package/dist/types/mapper/select/OrderByHelper.d.ts.map +1 -1
- package/dist/types/mapper/select/Path.d.ts.map +1 -1
- package/dist/types/mapper/select/RelationFetcher.d.ts.map +1 -1
- package/dist/types/mapper/select/SelectBuilder.d.ts.map +1 -1
- package/dist/types/mapper/select/SelectHydrator.d.ts.map +1 -1
- package/dist/types/mapper/select/WhereBuilder.d.ts.map +1 -1
- package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
- package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
- package/dist/types/mapper/select/handlers/MetaHandler.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/helpers.d.ts +1 -1
- package/dist/types/mapper/select/optimizer/helpers.d.ts.map +1 -1
- package/dist/types/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/update/UpdateBuilder.d.ts.map +1 -1
- package/dist/types/mapper/update/UpdateBuilderFactory.d.ts.map +1 -1
- package/dist/types/mapper/update/Updater.d.ts.map +1 -1
- package/dist/types/mapper/update/relations/ManyHasManyUpdateInputProcessor.d.ts +2 -2
- package/dist/types/mapper/update/relations/ManyHasManyUpdateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/update/relations/ManyHasOneUpdateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/update/relations/OneHasManyUpdateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.d.ts.map +1 -1
- package/dist/types/resolvers/GraphQlQueryAstFactory.d.ts.map +1 -1
- package/dist/types/resolvers/MutationResolver.d.ts.map +1 -1
- package/dist/types/resolvers/ReadHelpers.d.ts.map +1 -1
- package/dist/types/resolvers/ReadResolver.d.ts.map +1 -1
- package/dist/types/resolvers/RefreshViewResolver.d.ts.map +1 -1
- package/dist/types/resolvers/ValidationResolver.d.ts.map +1 -1
- package/dist/types/schema/ColumnTypeResolver.d.ts.map +1 -1
- package/dist/types/schema/ConditionTypeProvider.d.ts.map +1 -1
- package/dist/types/schema/EntityTypeProvider.d.ts.map +1 -1
- package/dist/types/schema/EnumsProvider.d.ts.map +1 -1
- package/dist/types/schema/FieldAccessVisitor.d.ts.map +1 -1
- package/dist/types/schema/GraphQlSchemaBuilder.d.ts.map +1 -1
- package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
- package/dist/types/schema/MutationProvider.d.ts.map +1 -1
- package/dist/types/schema/OperationExtension.d.ts.map +1 -1
- package/dist/types/schema/OrderByTypeProvider.d.ts.map +1 -1
- package/dist/types/schema/PaginatedFieldConfigFactory.d.ts.map +1 -1
- package/dist/types/schema/QueryProvider.d.ts.map +1 -1
- package/dist/types/schema/RefreshViewMutationProvider.d.ts.map +1 -1
- package/dist/types/schema/ValidationQueriesProvider.d.ts.map +1 -1
- package/dist/types/schema/WhereTypeProvider.d.ts.map +1 -1
- package/dist/types/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
- package/dist/types/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
- package/dist/types/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts.map +1 -1
- package/dist/types/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/types/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/types/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/types/schema/mutations/CreateEntityRelationInputProvider.d.ts.map +1 -1
- package/dist/types/schema/mutations/EntityInputProvider.d.ts.map +1 -1
- package/dist/types/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/types/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/types/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/types/schema/mutations/UpdateEntityRelationInputProvider.d.ts.map +1 -1
- package/dist/types/schema/utils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/utils/Mutex.d.ts.map +1 -1
- package/dist/types/utils/ResolveInfoUtils.d.ts.map +1 -1
- package/dist/types/utils/accessor.d.ts.map +1 -1
- package/dist/types/utils/isIt.d.ts.map +1 -1
- package/dist/types/utils/paginationUtils.d.ts.map +1 -1
- package/dist/types/utils/promises.d.ts.map +1 -1
- package/dist/types/utils/singletonFactory.d.ts.map +1 -1
- package/dist/types/utils/strings.d.ts.map +1 -1
- package/dist/types/utils/tuple.d.ts.map +1 -1
- package/dist/types/utils/uniqueWhereFields.d.ts.map +1 -1
- package/dist/types/utils/viewComputedId.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/mapper/select/ConditionBuilder.ts +12 -1
package/CLAUDE.md
CHANGED
|
@@ -36,6 +36,12 @@ Row-level and field-level security via predicate injection into every SQL operat
|
|
|
36
36
|
- `PredicatesInjector` — ANDs user predicates with ACL predicates on every query
|
|
37
37
|
- `VariableInjector` — replaces variable references with identity-specific values
|
|
38
38
|
|
|
39
|
+
### Read-path guarding
|
|
40
|
+
|
|
41
|
+
- `PredicateFactory.getFieldPredicate(...)` resolves a field's ACL predicate; `getPermissionsForContext(isRoot)` picks the permission set — root-only unless the caller passes `isRoot === false` (nested/relation context), which adds `through: true` permissions (`allPermissions`). An unknown context falls back to the narrower root set, so the two sets can **over-restrict, never leak**.
|
|
42
|
+
- Projection cell-masking happens during JS hydration (`SelectBuilder` maps `row => predicateGetter(row) ? row[alias] : null`), not in SQL. The predicate boolean column is also consumed by relation fetching (`getColumnValues`) and by the hydrator, so moving the mask into the SQL expression is not a local change.
|
|
43
|
+
- **`WhereOptimizer`'s `isLast` handling is deliberately conservative.** The obvious one-line "fix" (`Number(i) === relationPath.length` → `- 1`) drops the has-many `EXISTS` requirement, collapsing `{ articles: { author: { id: { isNull: false } } } }` to `{ id: { always: true } }` — an over-match. Verified empirically; it needs a real optimizer change, not a tweak.
|
|
44
|
+
|
|
39
45
|
## GraphQL Schema Building
|
|
40
46
|
|
|
41
47
|
`GraphQlSchemaBuilderFactory` → `GraphQlSchemaBuilder`:
|
|
@@ -54,7 +54,14 @@ class ConditionBuilder {
|
|
|
54
54
|
// deprecated
|
|
55
55
|
null: (builder2, value) => value ? builder2.isNull(columnIdentifier) : builder2.not((clause) => clause.isNull(columnIdentifier))
|
|
56
56
|
};
|
|
57
|
-
|
|
57
|
+
const apply = (key) => {
|
|
58
|
+
const value = condition[key];
|
|
59
|
+
if (value === void 0) {
|
|
60
|
+
return builder;
|
|
61
|
+
}
|
|
62
|
+
return handler[key](builder, value);
|
|
63
|
+
};
|
|
64
|
+
return apply(entries[0][0]);
|
|
58
65
|
}
|
|
59
66
|
}
|
|
60
67
|
exports.ConditionBuilder = ConditionBuilder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Compiler, ConditionBuilder as SqlConditionBuilder, formatColumnIdentifier, Literal, Operator, QueryBuilder } from '@contember/database'\nimport { UserError } from '../../exception.js'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] => it[1] !== null)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: '\n\t\t\t\t\t+ JSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) =>\n\t\t\t\tbuilder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) =>\n\t\t\t\tbuilder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\t\t\tsimilar: (builder, value) => builder.compare(columnIdentifier, Operator.similar, value),\n\t\t\twordSimilar: (builder, value) => builder.compare(columnIdentifier, Operator.wordSimilar, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Compiler, ConditionBuilder as SqlConditionBuilder, formatColumnIdentifier, Literal, Operator, QueryBuilder } from '@contember/database'\nimport { UserError } from '../../exception.js'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] => it[1] !== null)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: '\n\t\t\t\t\t+ JSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) =>\n\t\t\t\tbuilder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) =>\n\t\t\t\tbuilder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\t\t\tsimilar: (builder, value) => builder.compare(columnIdentifier, Operator.similar, value),\n\t\t\twordSimilar: (builder, value) => builder.compare(columnIdentifier, Operator.wordSimilar, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\t// Dispatch through a generic helper so the key and the value stay correlated through a single\n\t\t// type parameter K. Indexing `handler` with a union key would otherwise collapse the parameter\n\t\t// type to `never`.\n\t\tconst apply = <K extends keyof Input.Condition<any>>(key: K): SqlConditionBuilder => {\n\t\t\tconst value = condition[key]\n\t\t\tif (value === undefined) {\n\t\t\t\treturn builder\n\t\t\t}\n\t\t\treturn handler[key](builder, value)\n\t\t}\n\n\t\treturn apply(entries[0][0])\n\t}\n}\n"],"names":["UserError","builder","builder2","Operator","Model","formatColumnIdentifier","Compiler"],"mappings":"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"}
|
|
@@ -52,7 +52,14 @@ class ConditionBuilder {
|
|
|
52
52
|
// deprecated
|
|
53
53
|
null: (builder2, value) => value ? builder2.isNull(columnIdentifier) : builder2.not((clause) => clause.isNull(columnIdentifier))
|
|
54
54
|
};
|
|
55
|
-
|
|
55
|
+
const apply = (key) => {
|
|
56
|
+
const value = condition[key];
|
|
57
|
+
if (value === void 0) {
|
|
58
|
+
return builder;
|
|
59
|
+
}
|
|
60
|
+
return handler[key](builder, value);
|
|
61
|
+
};
|
|
62
|
+
return apply(entries[0][0]);
|
|
56
63
|
}
|
|
57
64
|
}
|
|
58
65
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Compiler, ConditionBuilder as SqlConditionBuilder, formatColumnIdentifier, Literal, Operator, QueryBuilder } from '@contember/database'\nimport { UserError } from '../../exception.js'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] => it[1] !== null)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: '\n\t\t\t\t\t+ JSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) =>\n\t\t\t\tbuilder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) =>\n\t\t\t\tbuilder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\t\t\tsimilar: (builder, value) => builder.compare(columnIdentifier, Operator.similar, value),\n\t\t\twordSimilar: (builder, value) => builder.compare(columnIdentifier, Operator.wordSimilar, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Compiler, ConditionBuilder as SqlConditionBuilder, formatColumnIdentifier, Literal, Operator, QueryBuilder } from '@contember/database'\nimport { UserError } from '../../exception.js'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] => it[1] !== null)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: '\n\t\t\t\t\t+ JSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) =>\n\t\t\t\tbuilder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) =>\n\t\t\t\tbuilder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\t\t\tsimilar: (builder, value) => builder.compare(columnIdentifier, Operator.similar, value),\n\t\t\twordSimilar: (builder, value) => builder.compare(columnIdentifier, Operator.wordSimilar, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\t// Dispatch through a generic helper so the key and the value stay correlated through a single\n\t\t// type parameter K. Indexing `handler` with a union key would otherwise collapse the parameter\n\t\t// type to `never`.\n\t\tconst apply = <K extends keyof Input.Condition<any>>(key: K): SqlConditionBuilder => {\n\t\t\tconst value = condition[key]\n\t\t\tif (value === undefined) {\n\t\t\t\treturn builder\n\t\t\t}\n\t\t\treturn handler[key](builder, value)\n\t\t}\n\n\t\treturn apply(entries[0][0])\n\t}\n}\n"],"names":["builder","builder2"],"mappings":"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"}
|
|
@@ -54,7 +54,14 @@ class ConditionBuilder {
|
|
|
54
54
|
// deprecated
|
|
55
55
|
null: (builder2, value) => value ? builder2.isNull(columnIdentifier) : builder2.not((clause) => clause.isNull(columnIdentifier))
|
|
56
56
|
};
|
|
57
|
-
|
|
57
|
+
const apply = (key) => {
|
|
58
|
+
const value = condition[key];
|
|
59
|
+
if (value === void 0) {
|
|
60
|
+
return builder;
|
|
61
|
+
}
|
|
62
|
+
return handler[key](builder, value);
|
|
63
|
+
};
|
|
64
|
+
return apply(entries[0][0]);
|
|
58
65
|
}
|
|
59
66
|
}
|
|
60
67
|
exports.ConditionBuilder = ConditionBuilder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Compiler, ConditionBuilder as SqlConditionBuilder, formatColumnIdentifier, Literal, Operator, QueryBuilder } from '@contember/database'\nimport { UserError } from '../../exception.js'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] => it[1] !== null)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: '\n\t\t\t\t\t+ JSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) =>\n\t\t\t\tbuilder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) =>\n\t\t\t\tbuilder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\t\t\tsimilar: (builder, value) => builder.compare(columnIdentifier, Operator.similar, value),\n\t\t\twordSimilar: (builder, value) => builder.compare(columnIdentifier, Operator.wordSimilar, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Compiler, ConditionBuilder as SqlConditionBuilder, formatColumnIdentifier, Literal, Operator, QueryBuilder } from '@contember/database'\nimport { UserError } from '../../exception.js'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] => it[1] !== null)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: '\n\t\t\t\t\t+ JSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) =>\n\t\t\t\tbuilder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) =>\n\t\t\t\tbuilder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\t\t\tsimilar: (builder, value) => builder.compare(columnIdentifier, Operator.similar, value),\n\t\t\twordSimilar: (builder, value) => builder.compare(columnIdentifier, Operator.wordSimilar, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\t// Dispatch through a generic helper so the key and the value stay correlated through a single\n\t\t// type parameter K. Indexing `handler` with a union key would otherwise collapse the parameter\n\t\t// type to `never`.\n\t\tconst apply = <K extends keyof Input.Condition<any>>(key: K): SqlConditionBuilder => {\n\t\t\tconst value = condition[key]\n\t\t\tif (value === undefined) {\n\t\t\t\treturn builder\n\t\t\t}\n\t\t\treturn handler[key](builder, value)\n\t\t}\n\n\t\treturn apply(entries[0][0])\n\t}\n}\n"],"names":["UserError","builder","builder2","Operator","Model","formatColumnIdentifier","Compiler"],"mappings":"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"}
|
|
@@ -52,7 +52,14 @@ class ConditionBuilder {
|
|
|
52
52
|
// deprecated
|
|
53
53
|
null: (builder2, value) => value ? builder2.isNull(columnIdentifier) : builder2.not((clause) => clause.isNull(columnIdentifier))
|
|
54
54
|
};
|
|
55
|
-
|
|
55
|
+
const apply = (key) => {
|
|
56
|
+
const value = condition[key];
|
|
57
|
+
if (value === void 0) {
|
|
58
|
+
return builder;
|
|
59
|
+
}
|
|
60
|
+
return handler[key](builder, value);
|
|
61
|
+
};
|
|
62
|
+
return apply(entries[0][0]);
|
|
56
63
|
}
|
|
57
64
|
}
|
|
58
65
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Compiler, ConditionBuilder as SqlConditionBuilder, formatColumnIdentifier, Literal, Operator, QueryBuilder } from '@contember/database'\nimport { UserError } from '../../exception.js'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] => it[1] !== null)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: '\n\t\t\t\t\t+ JSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) =>\n\t\t\t\tbuilder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) =>\n\t\t\t\tbuilder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\t\t\tsimilar: (builder, value) => builder.compare(columnIdentifier, Operator.similar, value),\n\t\t\twordSimilar: (builder, value) => builder.compare(columnIdentifier, Operator.wordSimilar, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Compiler, ConditionBuilder as SqlConditionBuilder, formatColumnIdentifier, Literal, Operator, QueryBuilder } from '@contember/database'\nimport { UserError } from '../../exception.js'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] => it[1] !== null)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: '\n\t\t\t\t\t+ JSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) =>\n\t\t\t\tbuilder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) =>\n\t\t\t\tbuilder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\t\t\tsimilar: (builder, value) => builder.compare(columnIdentifier, Operator.similar, value),\n\t\t\twordSimilar: (builder, value) => builder.compare(columnIdentifier, Operator.wordSimilar, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\t// Dispatch through a generic helper so the key and the value stay correlated through a single\n\t\t// type parameter K. Indexing `handler` with a union key would otherwise collapse the parameter\n\t\t// type to `never`.\n\t\tconst apply = <K extends keyof Input.Condition<any>>(key: K): SqlConditionBuilder => {\n\t\t\tconst value = condition[key]\n\t\t\tif (value === undefined) {\n\t\t\t\treturn builder\n\t\t\t}\n\t\t\treturn handler[key](builder, value)\n\t\t}\n\n\t\treturn apply(entries[0][0])\n\t}\n}\n"],"names":["builder","builder2"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../tests/cases/integration/graphQlRequests/validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAmB,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAGhF,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;IACrB,EAAE,EAAE,KAAK,CAAC,WAAW,CAAA;IACrB,IAAI,EAAE,KAAK,CAAC,eAAe,CAAA;IAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,EAAE,CAAA;CAC3C;AA0BD,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../tests/cases/integration/graphQlRequests/validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAmB,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAGhF,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;IACrB,EAAE,EAAE,KAAK,CAAC,WAAW,CAAA;IACrB,IAAI,EAAE,KAAK,CAAC,eAAe,CAAA;IAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,EAAE,CAAA;CAC3C;AA0BD,eAAO,MAAM,UAAU,SAAgB,UAAU,kBAsBhD,CAAA;AAED,UAAU,UAAU;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;IACrB,IAAI,EAAE,KAAK,CAAC,eAAe,CAAA;IAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,EAAE,CAAA;CAC3C;AAED,eAAO,MAAM,UAAU,SAAgB,UAAU,kBAsBhD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,KAAG,MAQ5F,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SchemaDefinition as d } from '@contember/schema-definition';
|
|
2
|
-
export declare const Locale: d.EnumDefinition<"
|
|
2
|
+
export declare const Locale: d.EnumDefinition<"cs" | "en">;
|
|
3
3
|
export declare class Author {
|
|
4
4
|
name: d.ColumnDefinition;
|
|
5
5
|
posts: d.OneHasManyDefinition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../../tests/src/assert.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;
|
|
1
|
+
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../../tests/src/assert.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;IAClB,eAAe,MAAM,GAAG,KAAK,GAAG;IAGhC,KAAK,MAAM,GAAG,KAAK,GAAG;CAGtB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../tests/src/tags.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../tests/src/tags.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,GAAG,YAAa,oBAAoB,aAAa,MAAM,EAAE,WAG7D,CAAA;AACT,eAAO,MAAM,GAAG,YAVsB,oBAAoB,aAAa,MAAM,EAAE,WAUzC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../tests/src/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAU,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAQ5E,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;IAClB,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CACrB;AAED,MAAM,WAAW,IAAI;IACpB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,CAAA;IAC9B,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,CAAA;IAC7B,SAAS,CAAC,EAAE,GAAG,CAAC,YAAY,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,QAAQ,EAAE,QAAQ,EAAE,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;CACd;AAaD,eAAO,MAAM,qBAAqB,EAAE,QAAQ,EAW3C,CAAA;AAED,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../tests/src/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAU,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAQ5E,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;IAClB,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CACrB;AAED,MAAM,WAAW,IAAI;IACpB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,CAAA;IAC9B,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,CAAA;IAC7B,SAAS,CAAC,EAAE,GAAG,CAAC,YAAY,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,QAAQ,EAAE,QAAQ,EAAE,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;CACd;AAaD,eAAO,MAAM,qBAAqB,EAAE,QAAQ,EAW3C,CAAA;AAED,eAAO,MAAM,cAAc,aAAc,QAAQ,EAAE,KAAG,QAAQ,EAW7D,CAAA;AAED,eAAO,MAAM,iBAAiB,aAAc,QAAQ,EAAE,KAAG,QAAQ,EAWhE,CAAA;AAED,eAAO,MAAM,OAAO,SAAgB,IAAI,kBAiDvC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testGraphql.d.ts","sourceRoot":"","sources":["../../../tests/src/testGraphql.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,aAAa,EAAE,MAAM,SAAS,CAAA;AAGhD,MAAM,WAAW,IAAI;IACpB,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,GAAG,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"testGraphql.d.ts","sourceRoot":"","sources":["../../../tests/src/testGraphql.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,aAAa,EAAE,MAAM,SAAS,CAAA;AAGhD,MAAM,WAAW,IAAI;IACpB,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,GAAG,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,kBAAkB,SAAgB,IAAI,kBAkBlD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUuid.d.ts","sourceRoot":"","sources":["../../../tests/src/testUuid.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,yCAAyC,CAAA;AACzE,eAAO,MAAM,cAAc,wBAAwB,CAAA;AACnD,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"testUuid.d.ts","sourceRoot":"","sources":["../../../tests/src/testUuid.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,yCAAyC,CAAA;AACzE,eAAO,MAAM,cAAc,wBAAwB,CAAA;AACnD,eAAO,MAAM,QAAQ,WAAY,MAAM,4BAEtC,CAAA;AAED,eAAO,MAAM,mBAAmB,mDAG/B,CAAA"}
|