@smartive/graphql-magic 1.0.1
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/.eslintrc +21 -0
- package/.github/workflows/release.yml +24 -0
- package/.github/workflows/testing.yml +37 -0
- package/.nvmrc +1 -0
- package/.prettierignore +34 -0
- package/.prettierrc.json +1 -0
- package/.releaserc +27 -0
- package/CHANGELOG.md +6 -0
- package/README.md +15 -0
- package/dist/cjs/index.cjs +2646 -0
- package/dist/esm/client/gql.d.ts +1 -0
- package/dist/esm/client/gql.js +5 -0
- package/dist/esm/client/gql.js.map +1 -0
- package/dist/esm/client/index.d.ts +2 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/queries.d.ts +24 -0
- package/dist/esm/client/queries.js +152 -0
- package/dist/esm/client/queries.js.map +1 -0
- package/dist/esm/context.d.ts +30 -0
- package/dist/esm/context.js +2 -0
- package/dist/esm/context.js.map +1 -0
- package/dist/esm/errors.d.ts +17 -0
- package/dist/esm/errors.js +27 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/generate/generate.d.ts +7 -0
- package/dist/esm/generate/generate.js +211 -0
- package/dist/esm/generate/generate.js.map +1 -0
- package/dist/esm/generate/index.d.ts +3 -0
- package/dist/esm/generate/index.js +5 -0
- package/dist/esm/generate/index.js.map +1 -0
- package/dist/esm/generate/mutations.d.ts +2 -0
- package/dist/esm/generate/mutations.js +18 -0
- package/dist/esm/generate/mutations.js.map +1 -0
- package/dist/esm/generate/utils.d.ts +22 -0
- package/dist/esm/generate/utils.js +150 -0
- package/dist/esm/generate/utils.js.map +1 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/migrations/generate.d.ts +28 -0
- package/dist/esm/migrations/generate.js +516 -0
- package/dist/esm/migrations/generate.js.map +1 -0
- package/dist/esm/migrations/index.d.ts +1 -0
- package/dist/esm/migrations/index.js +3 -0
- package/dist/esm/migrations/index.js.map +1 -0
- package/dist/esm/models.d.ts +170 -0
- package/dist/esm/models.js +27 -0
- package/dist/esm/models.js.map +1 -0
- package/dist/esm/permissions/check.d.ts +15 -0
- package/dist/esm/permissions/check.js +162 -0
- package/dist/esm/permissions/check.js.map +1 -0
- package/dist/esm/permissions/generate.d.ts +45 -0
- package/dist/esm/permissions/generate.js +77 -0
- package/dist/esm/permissions/generate.js.map +1 -0
- package/dist/esm/permissions/index.d.ts +2 -0
- package/dist/esm/permissions/index.js +4 -0
- package/dist/esm/permissions/index.js.map +1 -0
- package/dist/esm/resolvers/arguments.d.ts +26 -0
- package/dist/esm/resolvers/arguments.js +88 -0
- package/dist/esm/resolvers/arguments.js.map +1 -0
- package/dist/esm/resolvers/filters.d.ts +5 -0
- package/dist/esm/resolvers/filters.js +126 -0
- package/dist/esm/resolvers/filters.js.map +1 -0
- package/dist/esm/resolvers/index.d.ts +7 -0
- package/dist/esm/resolvers/index.js +9 -0
- package/dist/esm/resolvers/index.js.map +1 -0
- package/dist/esm/resolvers/mutations.d.ts +3 -0
- package/dist/esm/resolvers/mutations.js +255 -0
- package/dist/esm/resolvers/mutations.js.map +1 -0
- package/dist/esm/resolvers/node.d.ts +44 -0
- package/dist/esm/resolvers/node.js +102 -0
- package/dist/esm/resolvers/node.js.map +1 -0
- package/dist/esm/resolvers/resolver.d.ts +5 -0
- package/dist/esm/resolvers/resolver.js +143 -0
- package/dist/esm/resolvers/resolver.js.map +1 -0
- package/dist/esm/resolvers/resolvers.d.ts +9 -0
- package/dist/esm/resolvers/resolvers.js +39 -0
- package/dist/esm/resolvers/resolvers.js.map +1 -0
- package/dist/esm/resolvers/utils.d.ts +43 -0
- package/dist/esm/resolvers/utils.js +125 -0
- package/dist/esm/resolvers/utils.js.map +1 -0
- package/dist/esm/utils.d.ts +25 -0
- package/dist/esm/utils.js +159 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/esm/values.d.ts +15 -0
- package/dist/esm/values.js +7 -0
- package/dist/esm/values.js.map +1 -0
- package/jest.config.ts +12 -0
- package/package.json +66 -0
- package/renovate.json +32 -0
- package/src/client/gql.ts +7 -0
- package/src/client/index.ts +4 -0
- package/src/client/queries.ts +251 -0
- package/src/context.ts +27 -0
- package/src/errors.ts +32 -0
- package/src/generate/generate.ts +273 -0
- package/src/generate/index.ts +5 -0
- package/src/generate/mutations.ts +35 -0
- package/src/generate/utils.ts +223 -0
- package/src/index.ts +12 -0
- package/src/migrations/generate.ts +633 -0
- package/src/migrations/index.ts +3 -0
- package/src/models.ts +228 -0
- package/src/permissions/check.ts +239 -0
- package/src/permissions/generate.ts +143 -0
- package/src/permissions/index.ts +4 -0
- package/src/resolvers/arguments.ts +129 -0
- package/src/resolvers/filters.ts +163 -0
- package/src/resolvers/index.ts +9 -0
- package/src/resolvers/mutations.ts +313 -0
- package/src/resolvers/node.ts +193 -0
- package/src/resolvers/resolver.ts +223 -0
- package/src/resolvers/resolvers.ts +40 -0
- package/src/resolvers/utils.ts +188 -0
- package/src/utils.ts +186 -0
- package/src/values.ts +19 -0
- package/tests/unit/__snapshots__/generate.spec.ts.snap +105 -0
- package/tests/unit/__snapshots__/resolve.spec.ts.snap +60 -0
- package/tests/unit/generate.spec.ts +8 -0
- package/tests/unit/resolve.spec.ts +128 -0
- package/tests/unit/utils.ts +82 -0
- package/tsconfig.jest.json +13 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import cloneDeep from 'lodash/cloneDeep';
|
|
2
|
+
import flatMap from 'lodash/flatMap';
|
|
3
|
+
import { NotFoundError, PermissionError } from '../errors';
|
|
4
|
+
import { applyPermissions } from '../permissions/check';
|
|
5
|
+
import { get, summonByKey } from '../utils';
|
|
6
|
+
import { applyFilters } from './filters';
|
|
7
|
+
import { getFragmentSpreads, getInlineFragments, getJoins, getRootFieldNode, getSimpleFields, } from './node';
|
|
8
|
+
import { AliasGenerator, ID_ALIAS, addJoin, applyJoins, getNameOrAlias, hydrate, isListType } from './utils';
|
|
9
|
+
export const queryResolver = (_parent, _args, ctx, info) => resolve({ ...ctx, info, aliases: new AliasGenerator() });
|
|
10
|
+
export const resolve = async (ctx, id) => {
|
|
11
|
+
const fieldNode = summonByKey(ctx.info.fieldNodes, 'name.value', ctx.info.fieldName);
|
|
12
|
+
const baseTypeDefinition = get(ctx.info.operation.operation === 'query' ? ctx.info.schema.getQueryType() : ctx.info.schema.getMutationType(), 'astNode');
|
|
13
|
+
const node = getRootFieldNode({
|
|
14
|
+
ctx,
|
|
15
|
+
node: fieldNode,
|
|
16
|
+
baseTypeDefinition,
|
|
17
|
+
});
|
|
18
|
+
const { query, verifiedPermissionStacks } = await buildQuery(node);
|
|
19
|
+
if (ctx.info.fieldName === 'me') {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
21
|
+
query.where({ [`${node.shortTableAlias}.id`]: node.ctx.user.id });
|
|
22
|
+
}
|
|
23
|
+
if (!node.isList) {
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
25
|
+
query.limit(1);
|
|
26
|
+
}
|
|
27
|
+
if (id) {
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
29
|
+
query.where({ id });
|
|
30
|
+
}
|
|
31
|
+
const raw = await query;
|
|
32
|
+
const res = hydrate(node, raw);
|
|
33
|
+
await applySubQueries(node, res, verifiedPermissionStacks);
|
|
34
|
+
if (node.isList) {
|
|
35
|
+
return res;
|
|
36
|
+
}
|
|
37
|
+
if (!res[0]) {
|
|
38
|
+
throw new NotFoundError('Entity not found');
|
|
39
|
+
}
|
|
40
|
+
return res[0];
|
|
41
|
+
};
|
|
42
|
+
const buildQuery = async (node, parentVerifiedPermissionStacks) => {
|
|
43
|
+
const { tableAlias, shortTableAlias, tableName, model, ctx } = node;
|
|
44
|
+
const query = ctx.knex.fromRaw(`"${tableName}" as "${shortTableAlias}"`);
|
|
45
|
+
const joins = {};
|
|
46
|
+
applyFilters(node, query, joins);
|
|
47
|
+
applySelects(node, query, joins);
|
|
48
|
+
applyJoins(node.ctx.aliases, query, joins);
|
|
49
|
+
const tables = [
|
|
50
|
+
[model.name, tableAlias],
|
|
51
|
+
...Object.keys(joins).map((tableName) => tableName.split(':')),
|
|
52
|
+
];
|
|
53
|
+
const verifiedPermissionStacks = {};
|
|
54
|
+
for (const [table, alias] of tables) {
|
|
55
|
+
const verifiedPermissionStack = applyPermissions(ctx, table, node.ctx.aliases.getShort(alias), query, 'READ', parentVerifiedPermissionStacks?.[alias.split('__').slice(0, -1).join('__')]);
|
|
56
|
+
if (typeof verifiedPermissionStack !== 'boolean') {
|
|
57
|
+
verifiedPermissionStacks[alias] = verifiedPermissionStack;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { query, verifiedPermissionStacks };
|
|
61
|
+
};
|
|
62
|
+
const applySelects = (node, query, joins) => {
|
|
63
|
+
// Simple field selects
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
65
|
+
query.select(...[
|
|
66
|
+
{ field: 'id', alias: ID_ALIAS },
|
|
67
|
+
...getSimpleFields(node)
|
|
68
|
+
.filter((n) => {
|
|
69
|
+
const field = node.model.fields.find(({ name }) => name === n.name.value);
|
|
70
|
+
if (!field || field.relation || field.raw) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
if (field.queriableBy && !field.queriableBy.includes(node.ctx.user.role)) {
|
|
74
|
+
throw new PermissionError('READ', `${node.model.name}'s field "${field.name}"`);
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
})
|
|
78
|
+
.map((n) => ({ field: n.name.value, alias: getNameOrAlias(n) })),
|
|
79
|
+
].map(({ field, alias }) => `${node.shortTableAlias}.${field} as ${node.shortTableAlias}__${alias}`));
|
|
80
|
+
for (const subNode of getInlineFragments(node)) {
|
|
81
|
+
applySelects(subNode, query, joins);
|
|
82
|
+
}
|
|
83
|
+
for (const subNode of getFragmentSpreads(node)) {
|
|
84
|
+
applySelects(subNode, query, joins);
|
|
85
|
+
}
|
|
86
|
+
for (const subNode of getJoins(node, false)) {
|
|
87
|
+
addJoin(joins, node.tableAlias, subNode.tableName, subNode.tableAlias, get(subNode, 'foreignKey'), 'id');
|
|
88
|
+
applySelects(subNode, query, joins);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const applySubQueries = async (node, entries, parentVerifiedPermissionStacks) => {
|
|
92
|
+
if (!entries.length) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const entriesById = {};
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
if (!entriesById[entry[ID_ALIAS]]) {
|
|
98
|
+
entriesById[entry[ID_ALIAS]] = [];
|
|
99
|
+
}
|
|
100
|
+
entriesById[entry[ID_ALIAS]].push(entry);
|
|
101
|
+
}
|
|
102
|
+
const ids = Object.keys(entriesById);
|
|
103
|
+
// One to many
|
|
104
|
+
for (const subNode of getJoins(node, true)) {
|
|
105
|
+
const fieldName = getNameOrAlias(subNode.field);
|
|
106
|
+
const isList = isListType(subNode.fieldDefinition.type);
|
|
107
|
+
entries.forEach((entry) => (entry[fieldName] = isList ? [] : null));
|
|
108
|
+
const foreignKey = get(subNode, 'foreignKey');
|
|
109
|
+
const { query, verifiedPermissionStacks } = await buildQuery(subNode, parentVerifiedPermissionStacks);
|
|
110
|
+
const queries = ids.map((id) => query
|
|
111
|
+
.clone()
|
|
112
|
+
.select(`${subNode.shortTableAlias}.${foreignKey} as ${subNode.shortTableAlias}__${foreignKey}`)
|
|
113
|
+
.where({ [`${subNode.shortTableAlias}.${foreignKey}`]: id }));
|
|
114
|
+
// TODO: make unionAll faster then promise.all...
|
|
115
|
+
// const rawChildren = await node.ctx.knex.queryBuilder().unionAll(queries, true);
|
|
116
|
+
const rawChildren = (await Promise.all(queries)).flat();
|
|
117
|
+
const children = hydrate(subNode, rawChildren);
|
|
118
|
+
for (const child of children) {
|
|
119
|
+
for (const entry of entriesById[child[foreignKey]]) {
|
|
120
|
+
if (isList) {
|
|
121
|
+
entry[fieldName].push(cloneDeep(child));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
entry[fieldName] = cloneDeep(child);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
await applySubQueries(subNode, flatMap(entries.map((entry) => {
|
|
129
|
+
const children = entry[fieldName];
|
|
130
|
+
return (isList ? children : children ? [children] : []);
|
|
131
|
+
})), verifiedPermissionStacks);
|
|
132
|
+
}
|
|
133
|
+
for (const subNode of getInlineFragments(node)) {
|
|
134
|
+
await applySubQueries(subNode, entries, parentVerifiedPermissionStacks);
|
|
135
|
+
}
|
|
136
|
+
for (const subNode of getFragmentSpreads(node)) {
|
|
137
|
+
await applySubQueries(subNode, entries, parentVerifiedPermissionStacks);
|
|
138
|
+
}
|
|
139
|
+
for (const subNode of getJoins(node, false)) {
|
|
140
|
+
await applySubQueries(subNode, entries.map((item) => item[getNameOrAlias(subNode.field)]).filter(Boolean), parentVerifiedPermissionStacks);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/resolvers/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Models } from '../models';
|
|
2
|
+
export declare const getResolvers: (models: Models) => {
|
|
3
|
+
Query: {
|
|
4
|
+
[name: string]: (_parent: any, _args: any, ctx: import("..").Context, info: import("graphql").GraphQLResolveInfo) => Promise<import("./utils").Entry | import("./utils").Entry[]>;
|
|
5
|
+
};
|
|
6
|
+
Mutation: {
|
|
7
|
+
[name: string]: unknown;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { getModelPluralField, merge, typeToField } from '../utils';
|
|
2
|
+
import { mutationResolver } from './mutations';
|
|
3
|
+
import { queryResolver } from './resolver';
|
|
4
|
+
export const getResolvers = (models) => ({
|
|
5
|
+
Query: merge([
|
|
6
|
+
{
|
|
7
|
+
me: queryResolver,
|
|
8
|
+
},
|
|
9
|
+
...models
|
|
10
|
+
.filter(({ queriable }) => queriable)
|
|
11
|
+
.map((model) => ({
|
|
12
|
+
[typeToField(model.name)]: queryResolver,
|
|
13
|
+
})),
|
|
14
|
+
...models
|
|
15
|
+
.filter(({ listQueriable }) => listQueriable)
|
|
16
|
+
.map((model) => ({
|
|
17
|
+
[getModelPluralField(model)]: queryResolver,
|
|
18
|
+
})),
|
|
19
|
+
]),
|
|
20
|
+
Mutation: merge([
|
|
21
|
+
...models
|
|
22
|
+
.filter(({ creatable }) => creatable)
|
|
23
|
+
.map((model) => ({
|
|
24
|
+
[`create${model.name}`]: mutationResolver,
|
|
25
|
+
})),
|
|
26
|
+
...models
|
|
27
|
+
.filter(({ updatable }) => updatable)
|
|
28
|
+
.map((model) => ({
|
|
29
|
+
[`update${model.name}`]: mutationResolver,
|
|
30
|
+
})),
|
|
31
|
+
...models
|
|
32
|
+
.filter(({ deletable }) => deletable)
|
|
33
|
+
.map((model) => ({
|
|
34
|
+
[`delete${model.name}`]: mutationResolver,
|
|
35
|
+
[`restore${model.name}`]: mutationResolver,
|
|
36
|
+
})),
|
|
37
|
+
]),
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=resolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../../../src/resolvers/resolvers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IAC/C,KAAK,EAAE,KAAK,CAAC;QACX;YACE,EAAE,EAAE,aAAa;SAClB;QACD,GAAG,MAAM;aACN,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC;aACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa;SACzC,CAAC,CAAC;QACL,GAAG,MAAM;aACN,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC;aAC5C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa;SAC5C,CAAC,CAAC;KACN,CAAC;IACF,QAAQ,EAAE,KAAK,CAAU;QACvB,GAAG,MAAM;aACN,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC;aACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB;SAC1C,CAAC,CAAC;QACL,GAAG,MAAM;aACN,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC;aACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB;SAC1C,CAAC,CAAC;QACL,GAAG,MAAM;aACN,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC;aACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB;YACzC,CAAC,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB;SAC3C,CAAC,CAAC;KACN,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ASTNode, FieldNode, FragmentDefinitionNode, FragmentSpreadNode, GraphQLSchema, InlineFragmentNode, TypeNode } from 'graphql';
|
|
2
|
+
import { Knex } from 'knex';
|
|
3
|
+
import { Value } from '../values';
|
|
4
|
+
import { FieldResolverNode } from './node';
|
|
5
|
+
export declare const ID_ALIAS = "ID";
|
|
6
|
+
export type VariableValues = {
|
|
7
|
+
[variableName: string]: Value;
|
|
8
|
+
};
|
|
9
|
+
export declare const getTypeName: (t: TypeNode) => string;
|
|
10
|
+
export declare const isListType: (type: TypeNode) => boolean;
|
|
11
|
+
export declare const isFieldNode: (n: ASTNode) => n is FieldNode;
|
|
12
|
+
export declare const isInlineFragmentNode: (n: ASTNode) => n is InlineFragmentNode;
|
|
13
|
+
export declare const isFragmentSpreadNode: (n: ASTNode) => n is FragmentSpreadNode;
|
|
14
|
+
export type Maybe<T> = null | undefined | T;
|
|
15
|
+
export declare const getType: (schema: GraphQLSchema, name: string) => import("graphql").ObjectTypeDefinitionNode;
|
|
16
|
+
export declare const getFragmentTypeName: (node: InlineFragmentNode | FragmentDefinitionNode) => string;
|
|
17
|
+
export type Entry = {
|
|
18
|
+
[ID_ALIAS]: string;
|
|
19
|
+
[field: string]: null | string | number | Entry | Entry[];
|
|
20
|
+
};
|
|
21
|
+
export declare function hydrate<T extends Entry>(node: FieldResolverNode, raw: {
|
|
22
|
+
[key: string]: undefined | null | string | Date | number;
|
|
23
|
+
}[]): T[];
|
|
24
|
+
export declare const ors: (query: Knex.QueryBuilder, [first, ...rest]: ((query: Knex.QueryBuilder) => Knex.QueryBuilder)[]) => Knex.QueryBuilder<any, any>;
|
|
25
|
+
export declare const getNameOrAlias: (node: FieldNode) => string;
|
|
26
|
+
export type Ops<T> = ((target: T) => T)[];
|
|
27
|
+
export declare const apply: <T>(target: T, ops: ((target: T) => T)[]) => T;
|
|
28
|
+
export type Joins = Record<`${string}:${string}`, {
|
|
29
|
+
table1Alias: string;
|
|
30
|
+
column1: string;
|
|
31
|
+
column2: string;
|
|
32
|
+
}>;
|
|
33
|
+
export declare const applyJoins: (aliases: AliasGenerator, query: Knex.QueryBuilder, joins: Joins) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Note: modifies the join parameter.
|
|
36
|
+
*/
|
|
37
|
+
export declare const addJoin: (joins: Joins, table1Alias: string, table2: string, alias2: string, column1: string, column2: string) => void;
|
|
38
|
+
export declare class AliasGenerator {
|
|
39
|
+
private reverse;
|
|
40
|
+
getShort(long?: string): string;
|
|
41
|
+
getLong(short: string): string;
|
|
42
|
+
}
|
|
43
|
+
export declare const hash: (s: any) => string;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { Kind } from 'graphql';
|
|
3
|
+
import { UserInputError } from '../errors';
|
|
4
|
+
import { get, it } from '../utils';
|
|
5
|
+
export const ID_ALIAS = 'ID';
|
|
6
|
+
export const getTypeName = (t) => {
|
|
7
|
+
switch (t.kind) {
|
|
8
|
+
case 'ListType':
|
|
9
|
+
case 'NonNullType':
|
|
10
|
+
return getTypeName(t.type);
|
|
11
|
+
default:
|
|
12
|
+
return t.name.value;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export const isListType = (type) => {
|
|
16
|
+
switch (type.kind) {
|
|
17
|
+
case 'ListType':
|
|
18
|
+
return true;
|
|
19
|
+
case 'NonNullType':
|
|
20
|
+
return isListType(type.type);
|
|
21
|
+
default:
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
export const isFieldNode = (n) => n.kind === Kind.FIELD;
|
|
26
|
+
export const isInlineFragmentNode = (n) => n.kind === Kind.INLINE_FRAGMENT;
|
|
27
|
+
export const isFragmentSpreadNode = (n) => n.kind === Kind.FRAGMENT_SPREAD;
|
|
28
|
+
export const getType = (schema, name) => get(schema.getType(name), 'astNode');
|
|
29
|
+
export const getFragmentTypeName = (node) => get(get(node.typeCondition, 'name'), 'value');
|
|
30
|
+
export function hydrate(node, raw) {
|
|
31
|
+
const tableAlias = node.tableAlias;
|
|
32
|
+
const res = raw.map((entry) => {
|
|
33
|
+
const res = {};
|
|
34
|
+
outer: for (const [column, value] of Object.entries(entry)) {
|
|
35
|
+
let current = res;
|
|
36
|
+
const shortParts = column.split('__');
|
|
37
|
+
const fieldName = shortParts.pop();
|
|
38
|
+
const columnWithoutField = shortParts.join('__');
|
|
39
|
+
const longColumn = node.ctx.aliases.getLong(columnWithoutField);
|
|
40
|
+
const longColumnWithoutRoot = longColumn.replace(new RegExp(`^${tableAlias}(__)?`), '');
|
|
41
|
+
const allParts = [tableAlias, ...(longColumnWithoutRoot ? longColumnWithoutRoot.split('__') : []), fieldName];
|
|
42
|
+
for (let i = 0; i < allParts.length - 1; i++) {
|
|
43
|
+
const part = allParts[i];
|
|
44
|
+
if (!current[part]) {
|
|
45
|
+
const idField = [node.ctx.aliases.getShort(allParts.slice(0, i + 1).join('__')), ID_ALIAS].join('__');
|
|
46
|
+
if (!entry[idField]) {
|
|
47
|
+
continue outer;
|
|
48
|
+
}
|
|
49
|
+
current[part] = {};
|
|
50
|
+
}
|
|
51
|
+
current = current[part];
|
|
52
|
+
}
|
|
53
|
+
current[it(fieldName)] = value;
|
|
54
|
+
}
|
|
55
|
+
return res[tableAlias];
|
|
56
|
+
});
|
|
57
|
+
return res;
|
|
58
|
+
}
|
|
59
|
+
export const ors = (query, [first, ...rest]) => {
|
|
60
|
+
if (!first) {
|
|
61
|
+
return query;
|
|
62
|
+
}
|
|
63
|
+
return query.where((subQuery) => {
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
65
|
+
subQuery.where((subSubQuery) => {
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
67
|
+
first(subSubQuery);
|
|
68
|
+
});
|
|
69
|
+
for (const cb of rest) {
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
71
|
+
subQuery.orWhere((subSubQuery) => {
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
73
|
+
cb(subSubQuery);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
export const getNameOrAlias = (node) => {
|
|
79
|
+
const name = node.alias ? node.alias.value : node.name.value;
|
|
80
|
+
if ([ID_ALIAS].indexOf(name) >= 0) {
|
|
81
|
+
throw new UserInputError(`"${name}" can not be used as alias since it's a reserved word`);
|
|
82
|
+
}
|
|
83
|
+
return name;
|
|
84
|
+
};
|
|
85
|
+
export const apply = (target, ops) => ops.reduce((target, op) => op(target), target);
|
|
86
|
+
export const applyJoins = (aliases, query, joins) => {
|
|
87
|
+
for (const [tableName, { table1Alias, column1, column2 }] of Object.entries(joins)) {
|
|
88
|
+
const [table, alias] = tableName.split(':');
|
|
89
|
+
const table1ShortAlias = aliases.getShort(table1Alias);
|
|
90
|
+
const table2ShortAlias = aliases.getShort(alias);
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
|
|
92
|
+
query.leftJoin(`${table} as ${table2ShortAlias}`, `${table1ShortAlias}.${column1}`, `${table2ShortAlias}.${column2}`);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Note: modifies the join parameter.
|
|
97
|
+
*/
|
|
98
|
+
export const addJoin = (joins, table1Alias, table2, alias2, column1, column2) => {
|
|
99
|
+
joins[`${table2}:${alias2}`] ||= { table1Alias, column1, column2 };
|
|
100
|
+
};
|
|
101
|
+
export class AliasGenerator {
|
|
102
|
+
reverse = {};
|
|
103
|
+
getShort(long) {
|
|
104
|
+
if (!long) {
|
|
105
|
+
const short = `a${Object.keys(this.reverse).length}`;
|
|
106
|
+
return (this.reverse[short] = short);
|
|
107
|
+
}
|
|
108
|
+
const shortPrefix = long
|
|
109
|
+
.split('__')
|
|
110
|
+
.map((part) => part[0] + part.slice(1).replaceAll(/[a-z]+/g, ''))
|
|
111
|
+
.join('__');
|
|
112
|
+
let postfix = 0;
|
|
113
|
+
let short = shortPrefix + (postfix || '');
|
|
114
|
+
while (short in this.reverse && this.reverse[short] !== long) {
|
|
115
|
+
short = shortPrefix + ++postfix;
|
|
116
|
+
}
|
|
117
|
+
this.reverse[short] = long;
|
|
118
|
+
return short;
|
|
119
|
+
}
|
|
120
|
+
getLong(short) {
|
|
121
|
+
return get(this.reverse, short);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export const hash = (s) => createHash('md5').update(JSON.stringify(s)).digest('hex');
|
|
125
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/resolvers/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Model, Models, ObjectModel, RawModels } from './models';
|
|
2
|
+
export declare const merge: <T>(objects: (false | {
|
|
3
|
+
[name: string]: T;
|
|
4
|
+
})[]) => {
|
|
5
|
+
[name: string]: T;
|
|
6
|
+
};
|
|
7
|
+
export declare const typeToField: (type: string) => string;
|
|
8
|
+
export declare const getModelPlural: (model: ObjectModel | Model) => string;
|
|
9
|
+
export declare const getModelPluralField: (model: Model) => string;
|
|
10
|
+
export declare const getModelSlug: (model: Model) => string;
|
|
11
|
+
export declare const getModelLabelPlural: (model: Model) => string;
|
|
12
|
+
export declare const getModelLabel: (model: Model) => string;
|
|
13
|
+
export declare const getLabel: (s: string) => string;
|
|
14
|
+
export declare const getModels: (rawModels: RawModels) => Models;
|
|
15
|
+
export declare const summonByName: <T extends {
|
|
16
|
+
name: string;
|
|
17
|
+
}>(array: T[], value: string) => T;
|
|
18
|
+
export declare const summonByKey: <T>(array: readonly T[], key: string, value: unknown) => T;
|
|
19
|
+
export declare const summon: <T>(array: readonly T[], cb: any, errorMessage?: string) => T;
|
|
20
|
+
type ForSure<T> = T extends undefined | null ? never : T;
|
|
21
|
+
export declare const it: <T>(object: T) => ForSure<T>;
|
|
22
|
+
export declare const get: <T, U extends keyof ForSure<T>>(object: T, key: U) => ForSure<ForSure<T>[U]>;
|
|
23
|
+
export declare const getString: (v: unknown) => string;
|
|
24
|
+
export declare const retry: <T>(cb: () => Promise<T>, condition: (e: any) => boolean) => Promise<T>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { pluralize } from 'inflection';
|
|
3
|
+
import camelCase from 'lodash/camelCase';
|
|
4
|
+
import lodashGet from 'lodash/get';
|
|
5
|
+
import kebabCase from 'lodash/kebabCase';
|
|
6
|
+
import startCase from 'lodash/startCase';
|
|
7
|
+
import { isObjectModel } from './models';
|
|
8
|
+
const isNotFalsy = (v) => typeof v !== 'undefined' && v !== null && v !== false;
|
|
9
|
+
export const merge = (objects) => (objects || []).filter(isNotFalsy).reduce((i, acc) => ({ ...acc, ...i }), {});
|
|
10
|
+
// Target -> target
|
|
11
|
+
export const typeToField = (type) => type.substr(0, 1).toLowerCase() + type.substr(1);
|
|
12
|
+
export const getModelPlural = (model) => model.plural || pluralize(model.name);
|
|
13
|
+
export const getModelPluralField = (model) => typeToField(getModelPlural(model));
|
|
14
|
+
export const getModelSlug = (model) => kebabCase(getModelPlural(model));
|
|
15
|
+
export const getModelLabelPlural = (model) => getLabel(getModelPlural(model));
|
|
16
|
+
export const getModelLabel = (model) => getLabel(model.name);
|
|
17
|
+
export const getLabel = (s) => startCase(camelCase(s));
|
|
18
|
+
export const getModels = (rawModels) => {
|
|
19
|
+
const models = rawModels.filter(isObjectModel).map((model) => {
|
|
20
|
+
const objectModel = {
|
|
21
|
+
...model,
|
|
22
|
+
fieldsByName: {},
|
|
23
|
+
relations: [],
|
|
24
|
+
relationsByName: {},
|
|
25
|
+
reverseRelations: [],
|
|
26
|
+
reverseRelationsByName: {},
|
|
27
|
+
fields: [
|
|
28
|
+
{ name: 'id', type: 'ID', nonNull: true, unique: true, primary: true, generated: true },
|
|
29
|
+
...model.fields,
|
|
30
|
+
...(model.creatable
|
|
31
|
+
? [
|
|
32
|
+
{ name: 'createdAt', type: 'DateTime', nonNull: !model.nonStrict, orderable: true, generated: true },
|
|
33
|
+
{
|
|
34
|
+
name: 'createdBy',
|
|
35
|
+
type: 'User',
|
|
36
|
+
relation: true,
|
|
37
|
+
nonNull: !model.nonStrict,
|
|
38
|
+
reverse: `created${getModelPlural(model)}`,
|
|
39
|
+
generated: true,
|
|
40
|
+
},
|
|
41
|
+
]
|
|
42
|
+
: []),
|
|
43
|
+
...(model.updatable
|
|
44
|
+
? [
|
|
45
|
+
{ name: 'updatedAt', type: 'DateTime', nonNull: !model.nonStrict, orderable: true, generated: true },
|
|
46
|
+
{
|
|
47
|
+
name: 'updatedBy',
|
|
48
|
+
type: 'User',
|
|
49
|
+
relation: true,
|
|
50
|
+
nonNull: !model.nonStrict,
|
|
51
|
+
reverse: `updated${getModelPlural(model)}`,
|
|
52
|
+
generated: true,
|
|
53
|
+
},
|
|
54
|
+
]
|
|
55
|
+
: []),
|
|
56
|
+
...(model.deletable
|
|
57
|
+
? [
|
|
58
|
+
{
|
|
59
|
+
name: 'deleted',
|
|
60
|
+
type: 'Boolean',
|
|
61
|
+
nonNull: true,
|
|
62
|
+
default: false,
|
|
63
|
+
filterable: true,
|
|
64
|
+
defaultFilter: false,
|
|
65
|
+
generated: true,
|
|
66
|
+
},
|
|
67
|
+
{ name: 'deletedAt', type: 'DateTime', orderable: true, generated: true },
|
|
68
|
+
{
|
|
69
|
+
name: 'deletedBy',
|
|
70
|
+
type: 'User',
|
|
71
|
+
relation: true,
|
|
72
|
+
reverse: `deleted${getModelPlural(model)}`,
|
|
73
|
+
generated: true,
|
|
74
|
+
},
|
|
75
|
+
]
|
|
76
|
+
: []),
|
|
77
|
+
].map(({ foreignKey, ...field }) => ({
|
|
78
|
+
...field,
|
|
79
|
+
...(field.relation && {
|
|
80
|
+
foreignKey: foreignKey || `${field.name}Id`,
|
|
81
|
+
}),
|
|
82
|
+
})),
|
|
83
|
+
};
|
|
84
|
+
for (const field of objectModel.fields) {
|
|
85
|
+
objectModel.fieldsByName[field.name] = field;
|
|
86
|
+
}
|
|
87
|
+
return objectModel;
|
|
88
|
+
});
|
|
89
|
+
for (const model of models) {
|
|
90
|
+
for (const field of model.fields.filter(({ relation }) => relation)) {
|
|
91
|
+
const fieldModel = summonByName(models, field.type);
|
|
92
|
+
const reverseRelation = {
|
|
93
|
+
name: field.reverse || (field.toOne ? typeToField(model.name) : getModelPluralField(model)),
|
|
94
|
+
foreignKey: get(field, 'foreignKey'),
|
|
95
|
+
type: model.name,
|
|
96
|
+
toOne: !!field.toOne,
|
|
97
|
+
fieldModel,
|
|
98
|
+
field,
|
|
99
|
+
model,
|
|
100
|
+
};
|
|
101
|
+
const relation = {
|
|
102
|
+
field,
|
|
103
|
+
model: fieldModel,
|
|
104
|
+
reverseRelation,
|
|
105
|
+
};
|
|
106
|
+
model.relations.push(relation);
|
|
107
|
+
model.relationsByName[relation.field.name] = relation;
|
|
108
|
+
fieldModel.reverseRelations.push(reverseRelation);
|
|
109
|
+
fieldModel.reverseRelationsByName[reverseRelation.name] = reverseRelation;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return models;
|
|
113
|
+
};
|
|
114
|
+
export const summonByName = (array, value) => summonByKey(array, 'name', value);
|
|
115
|
+
export const summonByKey = (array, key, value) => summon(array, (element) => lodashGet(element, key) === value, `No element found with ${key} ${value}`);
|
|
116
|
+
export const summon = (array, cb, errorMessage) => {
|
|
117
|
+
if (array === undefined) {
|
|
118
|
+
throw new Error('Base array is not defined.');
|
|
119
|
+
}
|
|
120
|
+
const result = array.find(cb);
|
|
121
|
+
if (result === undefined) {
|
|
122
|
+
console.trace();
|
|
123
|
+
throw new Error(errorMessage || 'Element not found.');
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
};
|
|
127
|
+
export const it = (object) => {
|
|
128
|
+
if (object === undefined || object === null) {
|
|
129
|
+
console.trace();
|
|
130
|
+
throw new Error('Base object is not defined.');
|
|
131
|
+
}
|
|
132
|
+
return object;
|
|
133
|
+
};
|
|
134
|
+
export const get = (object, key) => {
|
|
135
|
+
const value = it(object)[key];
|
|
136
|
+
if (value === undefined || value === null) {
|
|
137
|
+
console.trace();
|
|
138
|
+
throw new Error(`Object doesn't have ${String(key)}`);
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
};
|
|
142
|
+
export const getString = (v) => {
|
|
143
|
+
assert(typeof v === 'string');
|
|
144
|
+
return v;
|
|
145
|
+
};
|
|
146
|
+
export const retry = async (cb, condition) => {
|
|
147
|
+
try {
|
|
148
|
+
return await cb();
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
if (condition(e)) {
|
|
152
|
+
return await cb();
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
throw e;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAoE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE3G,MAAM,UAAU,GAAG,CAAI,CAA+B,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;AAEzH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAI,OAAkE,EAAyB,EAAE,CACpH,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAEhF,mBAAmB;AACnB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAE9F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAA0B,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAEpG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAAU,EAAE;IACxD,MAAM,MAAM,GAAW,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnE,MAAM,WAAW,GAAU;YACzB,GAAG,KAAK;YACR,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE,EAAE;YACb,eAAe,EAAE,EAAE;YACnB,gBAAgB,EAAE,EAAE;YACpB,sBAAsB,EAAE,EAAE;YAC1B,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;gBACvF,GAAG,KAAK,CAAC,MAAM;gBACf,GAAG,CAAC,KAAK,CAAC,SAAS;oBACjB,CAAC,CAAC;wBACE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;wBACpG;4BACE,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,MAAM;4BACZ,QAAQ,EAAE,IAAI;4BACd,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS;4BACzB,OAAO,EAAE,UAAU,cAAc,CAAC,KAAK,CAAC,EAAE;4BAC1C,SAAS,EAAE,IAAI;yBAChB;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,KAAK,CAAC,SAAS;oBACjB,CAAC,CAAC;wBACE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;wBACpG;4BACE,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,MAAM;4BACZ,QAAQ,EAAE,IAAI;4BACd,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS;4BACzB,OAAO,EAAE,UAAU,cAAc,CAAC,KAAK,CAAC,EAAE;4BAC1C,SAAS,EAAE,IAAI;yBAChB;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,KAAK,CAAC,SAAS;oBACjB,CAAC,CAAC;wBACE;4BACE,IAAI,EAAE,SAAS;4BACf,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,IAAI;4BACb,OAAO,EAAE,KAAK;4BACd,UAAU,EAAE,IAAI;4BAChB,aAAa,EAAE,KAAK;4BACpB,SAAS,EAAE,IAAI;yBAChB;wBACD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;wBACzE;4BACE,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,MAAM;4BACZ,QAAQ,EAAE,IAAI;4BACd,OAAO,EAAE,UAAU,cAAc,CAAC,KAAK,CAAC,EAAE;4BAC1C,SAAS,EAAE,IAAI;yBAChB;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnC,GAAG,KAAK;gBACR,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI;oBACpB,UAAU,EAAE,UAAU,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI;iBAC5C,CAAC;aACH,CAAC,CAAC;SACJ,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE;YACtC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;SAC9C;QAED,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE;YACnE,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpD,MAAM,eAAe,GAAoB;gBACvC,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAC3F,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;gBACpB,UAAU;gBACV,KAAK;gBACL,KAAK;aACN,CAAC;YAEF,MAAM,QAAQ,GAAa;gBACzB,KAAK;gBACL,KAAK,EAAE,UAAU;gBACjB,eAAe;aAChB,CAAC;YACF,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YAEtD,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAElD,UAAU,CAAC,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;SAC3E;KACF;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAA6B,KAAU,EAAE,KAAa,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEzH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,KAA+B,EAAE,GAAW,EAAE,KAAc,EAAE,EAAE,CAC7F,MAAM,CAAC,KAAK,EAAE,CAAC,OAAU,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,KAAK,EAAE,yBAAyB,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AAE5G,MAAM,CAAC,MAAM,MAAM,GAAG,CAAI,KAA+B,EAAE,EAA8B,EAAE,YAAqB,EAAE,EAAE;IAClH,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;KAC/C;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,oBAAoB,CAAC,CAAC;KACvD;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,EAAE,GAAG,CAAI,MAA4B,EAAc,EAAE;IAChE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE;QAC3C,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;KAChD;IAED,OAAO,MAAoB,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,CAAgC,MAA4B,EAAE,GAAM,EAA0B,EAAE;IACjH,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;QACzC,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KACvD;IACD,OAAO,KAA+B,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,EAAE;IACtC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EAAK,EAAoB,EAAE,SAA8B,EAAE,EAAE;IACrF,IAAI;QACF,OAAO,MAAM,EAAE,EAAE,CAAC;KACnB;IAAC,OAAO,CAAC,EAAE;QACV,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE;YAChB,OAAO,MAAM,EAAE,EAAE,CAAC;SACnB;aAAM;YACL,MAAM,CAAC,CAAC;SACT;KACF;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
export declare class Enum {
|
|
3
|
+
value: string;
|
|
4
|
+
constructor(value: string);
|
|
5
|
+
}
|
|
6
|
+
export type BasicValue = undefined | null | boolean | string | number | DateTime;
|
|
7
|
+
export type Value = any;
|
|
8
|
+
export type Values = {
|
|
9
|
+
name: string;
|
|
10
|
+
values: Value;
|
|
11
|
+
}[];
|
|
12
|
+
export type Directive = {
|
|
13
|
+
name: string;
|
|
14
|
+
values?: Values | undefined;
|
|
15
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/values.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,IAAI;IACI;IAAnB,YAAmB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;CACrC"}
|
package/jest.config.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Config } from 'jest';
|
|
2
|
+
|
|
3
|
+
const config: Config = {
|
|
4
|
+
preset: 'ts-jest',
|
|
5
|
+
testEnvironment: 'node',
|
|
6
|
+
testTimeout: 45_000,
|
|
7
|
+
transform: {
|
|
8
|
+
'^.+\\.tsx?$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.jest.json' }],
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default config;
|