@contember/binding-common 2.0.0-alpha.19 → 2.0.0-alpha.21
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/development/index.cjs +2 -0
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +2 -0
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/environment/Environment.cjs.map +1 -1
- package/dist/development/src/environment/Environment.js.map +1 -1
- package/dist/development/src/environment/TreeNodeEnvironmentFactory.cjs +3 -3
- package/dist/development/src/environment/TreeNodeEnvironmentFactory.cjs.map +1 -1
- package/dist/development/src/environment/TreeNodeEnvironmentFactory.js +2 -2
- package/dist/development/src/environment/TreeNodeEnvironmentFactory.js.map +1 -1
- package/dist/development/src/queryLanguage/MarkerFactory.cjs +1 -1
- package/dist/development/src/queryLanguage/MarkerFactory.cjs.map +1 -1
- package/dist/development/src/queryLanguage/MarkerFactory.js +1 -1
- package/dist/development/src/queryLanguage/MarkerFactory.js.map +1 -1
- package/dist/development/src/queryLanguage/Parser.cjs +4 -6
- package/dist/development/src/queryLanguage/Parser.cjs.map +1 -1
- package/dist/development/src/queryLanguage/Parser.js +4 -6
- package/dist/development/src/queryLanguage/Parser.js.map +1 -1
- package/dist/development/src/queryLanguage/QueryLanguage.cjs +1 -11
- package/dist/development/src/queryLanguage/QueryLanguage.cjs.map +1 -1
- package/dist/development/src/queryLanguage/QueryLanguage.js +1 -11
- package/dist/development/src/queryLanguage/QueryLanguage.js.map +1 -1
- package/dist/development/src/treeParameters/TreeParameterMerger.cjs +1 -15
- package/dist/development/src/treeParameters/TreeParameterMerger.cjs.map +1 -1
- package/dist/development/src/treeParameters/TreeParameterMerger.js +1 -15
- package/dist/development/src/treeParameters/TreeParameterMerger.js.map +1 -1
- package/dist/development/src/treeParameters/helpers/wrapFilterInHasOnes.cjs +2 -2
- package/dist/development/src/treeParameters/helpers/wrapFilterInHasOnes.cjs.map +1 -1
- package/dist/development/src/treeParameters/helpers/wrapFilterInHasOnes.js +1 -1
- package/dist/development/src/treeParameters/helpers/wrapFilterInHasOnes.js.map +1 -1
- package/dist/development/src/utils/whereToFilter.cjs +16 -0
- package/dist/development/src/utils/whereToFilter.cjs.map +1 -0
- package/dist/development/src/utils/whereToFilter.js +16 -0
- package/dist/development/src/utils/whereToFilter.js.map +1 -0
- package/dist/production/index.cjs +2 -0
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +2 -0
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/environment/Environment.cjs.map +1 -1
- package/dist/production/src/environment/Environment.js.map +1 -1
- package/dist/production/src/environment/TreeNodeEnvironmentFactory.cjs +3 -3
- package/dist/production/src/environment/TreeNodeEnvironmentFactory.cjs.map +1 -1
- package/dist/production/src/environment/TreeNodeEnvironmentFactory.js +2 -2
- package/dist/production/src/environment/TreeNodeEnvironmentFactory.js.map +1 -1
- package/dist/production/src/queryLanguage/MarkerFactory.cjs +1 -1
- package/dist/production/src/queryLanguage/MarkerFactory.cjs.map +1 -1
- package/dist/production/src/queryLanguage/MarkerFactory.js +1 -1
- package/dist/production/src/queryLanguage/MarkerFactory.js.map +1 -1
- package/dist/production/src/queryLanguage/Parser.cjs +4 -6
- package/dist/production/src/queryLanguage/Parser.cjs.map +1 -1
- package/dist/production/src/queryLanguage/Parser.js +4 -6
- package/dist/production/src/queryLanguage/Parser.js.map +1 -1
- package/dist/production/src/queryLanguage/QueryLanguage.cjs +1 -8
- package/dist/production/src/queryLanguage/QueryLanguage.cjs.map +1 -1
- package/dist/production/src/queryLanguage/QueryLanguage.js +1 -8
- package/dist/production/src/queryLanguage/QueryLanguage.js.map +1 -1
- package/dist/production/src/treeParameters/TreeParameterMerger.cjs +1 -15
- package/dist/production/src/treeParameters/TreeParameterMerger.cjs.map +1 -1
- package/dist/production/src/treeParameters/TreeParameterMerger.js +1 -15
- package/dist/production/src/treeParameters/TreeParameterMerger.js.map +1 -1
- package/dist/production/src/treeParameters/helpers/wrapFilterInHasOnes.cjs +2 -2
- package/dist/production/src/treeParameters/helpers/wrapFilterInHasOnes.cjs.map +1 -1
- package/dist/production/src/treeParameters/helpers/wrapFilterInHasOnes.js +1 -1
- package/dist/production/src/treeParameters/helpers/wrapFilterInHasOnes.js.map +1 -1
- package/dist/production/src/utils/whereToFilter.cjs +16 -0
- package/dist/production/src/utils/whereToFilter.cjs.map +1 -0
- package/dist/production/src/utils/whereToFilter.js +16 -0
- package/dist/production/src/utils/whereToFilter.js.map +1 -0
- package/dist/types/environment/Environment.d.ts +1 -2
- package/dist/types/environment/Environment.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/queryLanguage/Parser.d.ts +2 -2
- package/dist/types/queryLanguage/Parser.d.ts.map +1 -1
- package/dist/types/queryLanguage/QueryLanguage.d.ts +1 -3
- package/dist/types/queryLanguage/QueryLanguage.d.ts.map +1 -1
- package/dist/types/treeParameters/TreeParameterMerger.d.ts.map +1 -1
- package/dist/types/treeParameters/helpers/wrapFilterInHasOnes.d.ts.map +1 -1
- package/dist/types/treeParameters/primitives/Filter.d.ts +2 -2
- package/dist/types/treeParameters/primitives/Filter.d.ts.map +1 -1
- package/dist/types/treeParameters/primitives/OrderBy.d.ts +2 -2
- package/dist/types/treeParameters/primitives/OrderBy.d.ts.map +1 -1
- package/dist/types/treeParameters/primitives/UniqueWhere.d.ts +2 -2
- package/dist/types/treeParameters/primitives/UniqueWhere.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/types/BindingOperations.d.ts +0 -2
- package/dist/types/types/BindingOperations.d.ts.map +1 -1
- package/dist/types/utils/whereToFilter.d.ts +3 -0
- package/dist/types/utils/whereToFilter.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/environment/Environment.ts +1 -2
- package/src/environment/TreeNodeEnvironmentFactory.ts +2 -2
- package/src/index.ts +1 -0
- package/src/queryLanguage/MarkerFactory.ts +1 -1
- package/src/queryLanguage/Parser.ts +8 -10
- package/src/queryLanguage/QueryLanguage.ts +0 -12
- package/src/treeParameters/TreeParameterMerger.ts +2 -17
- package/src/treeParameters/helpers/wrapFilterInHasOnes.ts +1 -1
- package/src/treeParameters/primitives/Filter.ts +2 -2
- package/src/treeParameters/primitives/OrderBy.ts +2 -2
- package/src/treeParameters/primitives/UniqueWhere.ts +2 -2
- package/src/types/BindingOperations.ts +0 -3
- package/src/utils/whereToFilter.ts +18 -0
- package/tests/cases/unit/queryLanguage/general.spec.tsx +2 -3
- package/tests/cases/unit/queryLanguage/orderBy.spec.tsx +0 -1
- package/tests/cases/unit/queryLanguage/singleRelativeField.spec.tsx +0 -1
- package/tests/cases/unit/whereToFilter.ts +24 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Input, Writable } from '@contember/client'
|
|
2
2
|
import { EmbeddedActionsParser, Lexer } from 'chevrotain'
|
|
3
3
|
import { Environment } from '../environment'
|
|
4
4
|
import type { EntityName, FieldName, Filter, OrderBy, UniqueWhere } from '../treeParameters'
|
|
@@ -303,7 +303,7 @@ class Parser extends EmbeddedActionsParser {
|
|
|
303
303
|
ALT: () => {
|
|
304
304
|
const variable = this.SUBRULE(this.variable)
|
|
305
305
|
return this.ACTION(() => {
|
|
306
|
-
if (typeof variable !== 'object'
|
|
306
|
+
if (typeof variable !== 'object') {
|
|
307
307
|
throw new QueryLanguageError(`Invalid filter value '${JSON.stringify(variable)}'`)
|
|
308
308
|
}
|
|
309
309
|
return variable
|
|
@@ -479,7 +479,7 @@ class Parser extends EmbeddedActionsParser {
|
|
|
479
479
|
},
|
|
480
480
|
})
|
|
481
481
|
this.CONSUME(tokens.Equals)
|
|
482
|
-
const primaryValue = this.SUBRULE<Input.PrimaryValue
|
|
482
|
+
const primaryValue = this.SUBRULE<Input.PrimaryValue>(this.primaryValue)
|
|
483
483
|
|
|
484
484
|
this.ACTION(() => {
|
|
485
485
|
let nestedWhere = where
|
|
@@ -498,7 +498,7 @@ class Parser extends EmbeddedActionsParser {
|
|
|
498
498
|
if (nestedField in nestedWhere) {
|
|
499
499
|
const existingWhere = nestedWhere[nestedField]
|
|
500
500
|
|
|
501
|
-
if (typeof existingWhere === 'object'
|
|
501
|
+
if (typeof existingWhere === 'object') {
|
|
502
502
|
nestedWhere = existingWhere
|
|
503
503
|
} else {
|
|
504
504
|
throw new QueryLanguageError(
|
|
@@ -637,7 +637,7 @@ class Parser extends EmbeddedActionsParser {
|
|
|
637
637
|
])
|
|
638
638
|
})
|
|
639
639
|
|
|
640
|
-
private primaryValue = this.RULE<Input.PrimaryValue
|
|
640
|
+
private primaryValue = this.RULE<Input.PrimaryValue>('primaryValue', () => {
|
|
641
641
|
return this.OR([
|
|
642
642
|
{
|
|
643
643
|
ALT: () => this.SUBRULE(this.string),
|
|
@@ -654,8 +654,7 @@ class Parser extends EmbeddedActionsParser {
|
|
|
654
654
|
return this.ACTION(() => {
|
|
655
655
|
if (
|
|
656
656
|
typeof variableValue === 'string' ||
|
|
657
|
-
typeof variableValue === 'number'
|
|
658
|
-
variableValue instanceof GraphQlBuilder.GraphQlLiteral
|
|
657
|
+
typeof variableValue === 'number'
|
|
659
658
|
) {
|
|
660
659
|
return variableValue
|
|
661
660
|
}
|
|
@@ -772,8 +771,7 @@ class Parser extends EmbeddedActionsParser {
|
|
|
772
771
|
}
|
|
773
772
|
|
|
774
773
|
if (Parser.environment.hasVariable(variableName)) {
|
|
775
|
-
|
|
776
|
-
return value instanceof GraphQlBuilder.GraphQlLiteral ? value.value : value
|
|
774
|
+
return Parser.environment.getVariable(variableName)
|
|
777
775
|
}
|
|
778
776
|
if (Parser.environment.hasParameter(variableName)) {
|
|
779
777
|
return Parser.environment.getParameter(variableName)
|
|
@@ -882,7 +880,7 @@ namespace Parser {
|
|
|
882
880
|
export namespace AST {
|
|
883
881
|
export type FieldWhere = Input.FieldWhere<Condition>
|
|
884
882
|
|
|
885
|
-
export type ColumnValue = Input.ColumnValue
|
|
883
|
+
export type ColumnValue = Input.ColumnValue
|
|
886
884
|
|
|
887
885
|
export type Condition = Input.Condition<ColumnValue>
|
|
888
886
|
|
|
@@ -43,7 +43,6 @@ import {
|
|
|
43
43
|
UnsugarableSingleEntityEventListeners,
|
|
44
44
|
} from '../treeParameters'
|
|
45
45
|
import { Parser } from './Parser'
|
|
46
|
-
import { GraphQlLiteral } from '@contember/client'
|
|
47
46
|
import { ParsedHasManyRelation, ParsedHasOneRelation } from './ParserResults'
|
|
48
47
|
import { TokenRegExps } from './tokenList'
|
|
49
48
|
import { TreeParameterMerger } from '../treeParameters/TreeParameterMerger'
|
|
@@ -544,7 +543,6 @@ export class QueryLanguage {
|
|
|
544
543
|
public static desugarQualifiedSingleEntity(
|
|
545
544
|
{ entity, ...unsugarableSingleEntity }: SugaredQualifiedSingleEntity,
|
|
546
545
|
environment: Environment,
|
|
547
|
-
options: { missingSetOnCreate?: 'fill' | 'fillAndWarn' } = {},
|
|
548
546
|
): QualifiedSingleEntity {
|
|
549
547
|
let entityName: EntityName
|
|
550
548
|
let where: UniqueWhere
|
|
@@ -582,16 +580,6 @@ export class QueryLanguage {
|
|
|
582
580
|
? this.desugarSetOnCreate(unsugarableSingleEntity.setOnCreate, environment)
|
|
583
581
|
: undefined
|
|
584
582
|
|
|
585
|
-
// todo: remove deprecated code
|
|
586
|
-
if (!setOnCreate && options.missingSetOnCreate) {
|
|
587
|
-
const whereValues = Object.values(where)
|
|
588
|
-
if (whereValues.length === 1 && whereValues[0] instanceof GraphQlLiteral) {
|
|
589
|
-
setOnCreate = where
|
|
590
|
-
if (import.meta.env.DEV && options.missingSetOnCreate === 'fillAndWarn') {
|
|
591
|
-
console.warn('Automatic creation of singleton entities in EditPage is deprecated. Please use setOnCreate prop.')
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
583
|
|
|
596
584
|
const isNonbearing: boolean =
|
|
597
585
|
unsugarableSingleEntity.isNonbearing !== undefined
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Writable } from '@contember/client'
|
|
2
2
|
import type {
|
|
3
3
|
Alias,
|
|
4
4
|
EntityEventListenerStore,
|
|
@@ -197,23 +197,8 @@ export class TreeParameterMerger {
|
|
|
197
197
|
if (field in originalCopy) {
|
|
198
198
|
const fromOriginal = originalCopy[field]
|
|
199
199
|
const fromFresh = fresh[field]
|
|
200
|
-
|
|
201
|
-
if (fromOriginal instanceof GraphQlBuilder.GraphQlLiteral) {
|
|
202
|
-
if (fromFresh instanceof GraphQlBuilder.GraphQlLiteral) {
|
|
203
|
-
if (fromOriginal.value === fromFresh.value) {
|
|
204
|
-
// Good, do nothing.
|
|
205
|
-
continue
|
|
206
|
-
} else {
|
|
207
|
-
throw new BindingError() // TODO msg
|
|
208
|
-
}
|
|
209
|
-
} else {
|
|
210
|
-
throw new BindingError() // TODO msg
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
200
|
if (typeof fromOriginal === 'object') {
|
|
214
|
-
if (fromFresh
|
|
215
|
-
throw new BindingError() // TODO msg
|
|
216
|
-
} else if (typeof fromFresh === 'object') {
|
|
201
|
+
if (typeof fromFresh === 'object') {
|
|
217
202
|
const merged = this.mergeSetOnCreate(fromOriginal, fromFresh)
|
|
218
203
|
if (merged !== undefined) {
|
|
219
204
|
originalCopy[field] = merged
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { whereToFilter } from '@contember/client'
|
|
2
1
|
import type { Filter, HasOneRelation } from '../../treeParameters'
|
|
2
|
+
import { whereToFilter } from '../../utils/whereToFilter'
|
|
3
3
|
|
|
4
4
|
export const wrapFilterInHasOnes = (path: HasOneRelation[], filter: Filter): Filter => {
|
|
5
5
|
for (let i = path.length - 1; i >= 0; i--) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Input } from '@contember/client'
|
|
2
2
|
|
|
3
|
-
export type Filter<T =
|
|
3
|
+
export type Filter<T = never> = Input.Where<Input.Condition<Input.ColumnValue<T>>>
|
|
4
4
|
|
|
5
5
|
// E.g. [author.son.age < 123]
|
|
6
6
|
// It is *always* enclosed within square brackets.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Input } from '@contember/client'
|
|
2
2
|
|
|
3
|
-
export type OrderBy = Input.OrderBy
|
|
3
|
+
export type OrderBy = Input.OrderBy<`${Input.OrderDirection}`>[]
|
|
4
4
|
|
|
5
5
|
// E.g. items.order asc, items.content.name asc
|
|
6
6
|
export type SugaredOrderBy = OrderBy | string
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Input } from '@contember/client'
|
|
2
2
|
|
|
3
|
-
export type UniqueWhere<T =
|
|
3
|
+
export type UniqueWhere<T = never> = Input.UniqueWhere<T>
|
|
4
4
|
|
|
5
5
|
// E.g. (author.mother.id = 123)
|
|
6
6
|
// It is *always* enclosed within parentheses
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { TreeFilter } from '@contember/client'
|
|
2
1
|
import type { AsyncBatchUpdatesOptions } from './AsyncBatchUpdatesOptions'
|
|
3
2
|
import type { BatchUpdatesOptions } from './BatchUpdatesOptions'
|
|
4
3
|
import type { ExtendTree } from './ExtendTree'
|
|
@@ -16,8 +15,6 @@ export type BatchDeferredUpdates = (performUpdates: (bindingOperations: BatchUpd
|
|
|
16
15
|
|
|
17
16
|
export interface BindingOperations<Node> extends AsyncBatchUpdatesOptions {
|
|
18
17
|
// addEventListener: ...
|
|
19
|
-
getTreeFilters: () => TreeFilter[]
|
|
20
|
-
|
|
21
18
|
extendTree: ExtendTree<Node>
|
|
22
19
|
fetchData: FetchData<Node>
|
|
23
20
|
batchDeferredUpdates: BatchDeferredUpdates
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Input, Writable } from '@contember/client'
|
|
2
|
+
|
|
3
|
+
export const whereToFilter = (
|
|
4
|
+
by: Input.UniqueWhere,
|
|
5
|
+
): Input.Where<Input.Condition<Input.ColumnValue>> => {
|
|
6
|
+
const where: Writable<Input.Where<Input.Condition<Input.ColumnValue>>> = {}
|
|
7
|
+
for (const key in by) {
|
|
8
|
+
const value = by[key]
|
|
9
|
+
|
|
10
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
11
|
+
where[key] = { eq: value }
|
|
12
|
+
} else {
|
|
13
|
+
where[key] = whereToFilter(value)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return where
|
|
18
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { expect, it, describe } from 'vitest'
|
|
2
|
-
import { GraphQlBuilder } from '@contember/client'
|
|
3
2
|
import { Environment } from '../../../../src/environment'
|
|
4
3
|
import { Parser } from '../../../../src/queryLanguage'
|
|
5
4
|
|
|
@@ -26,8 +25,8 @@ describe('query language parser', () => {
|
|
|
26
25
|
ab: 456,
|
|
27
26
|
a: 123,
|
|
28
27
|
x: 'x',
|
|
29
|
-
lit:
|
|
30
|
-
literal:
|
|
28
|
+
lit: 'lit',
|
|
29
|
+
literal: 'literal',
|
|
31
30
|
})
|
|
32
31
|
expect(
|
|
33
32
|
Parser.parseQueryLanguageExpression(
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { expect, it, describe } from 'vitest'
|
|
2
|
+
import { whereToFilter } from '../../../src'
|
|
3
|
+
|
|
4
|
+
describe('whereToFilter', () => {
|
|
5
|
+
it('complex by', () => {
|
|
6
|
+
expect(
|
|
7
|
+
whereToFilter({
|
|
8
|
+
foo: {
|
|
9
|
+
bar: {
|
|
10
|
+
baz: '123',
|
|
11
|
+
xyz: 456,
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
}),
|
|
15
|
+
).toEqual({
|
|
16
|
+
foo: {
|
|
17
|
+
bar: {
|
|
18
|
+
baz: { eq: '123' },
|
|
19
|
+
xyz: { eq: 456 },
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
})
|