@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.
Files changed (124) hide show
  1. package/.eslintrc +21 -0
  2. package/.github/workflows/release.yml +24 -0
  3. package/.github/workflows/testing.yml +37 -0
  4. package/.nvmrc +1 -0
  5. package/.prettierignore +34 -0
  6. package/.prettierrc.json +1 -0
  7. package/.releaserc +27 -0
  8. package/CHANGELOG.md +6 -0
  9. package/README.md +15 -0
  10. package/dist/cjs/index.cjs +2646 -0
  11. package/dist/esm/client/gql.d.ts +1 -0
  12. package/dist/esm/client/gql.js +5 -0
  13. package/dist/esm/client/gql.js.map +1 -0
  14. package/dist/esm/client/index.d.ts +2 -0
  15. package/dist/esm/client/index.js +4 -0
  16. package/dist/esm/client/index.js.map +1 -0
  17. package/dist/esm/client/queries.d.ts +24 -0
  18. package/dist/esm/client/queries.js +152 -0
  19. package/dist/esm/client/queries.js.map +1 -0
  20. package/dist/esm/context.d.ts +30 -0
  21. package/dist/esm/context.js +2 -0
  22. package/dist/esm/context.js.map +1 -0
  23. package/dist/esm/errors.d.ts +17 -0
  24. package/dist/esm/errors.js +27 -0
  25. package/dist/esm/errors.js.map +1 -0
  26. package/dist/esm/generate/generate.d.ts +7 -0
  27. package/dist/esm/generate/generate.js +211 -0
  28. package/dist/esm/generate/generate.js.map +1 -0
  29. package/dist/esm/generate/index.d.ts +3 -0
  30. package/dist/esm/generate/index.js +5 -0
  31. package/dist/esm/generate/index.js.map +1 -0
  32. package/dist/esm/generate/mutations.d.ts +2 -0
  33. package/dist/esm/generate/mutations.js +18 -0
  34. package/dist/esm/generate/mutations.js.map +1 -0
  35. package/dist/esm/generate/utils.d.ts +22 -0
  36. package/dist/esm/generate/utils.js +150 -0
  37. package/dist/esm/generate/utils.js.map +1 -0
  38. package/dist/esm/index.d.ts +10 -0
  39. package/dist/esm/index.js +12 -0
  40. package/dist/esm/index.js.map +1 -0
  41. package/dist/esm/migrations/generate.d.ts +28 -0
  42. package/dist/esm/migrations/generate.js +516 -0
  43. package/dist/esm/migrations/generate.js.map +1 -0
  44. package/dist/esm/migrations/index.d.ts +1 -0
  45. package/dist/esm/migrations/index.js +3 -0
  46. package/dist/esm/migrations/index.js.map +1 -0
  47. package/dist/esm/models.d.ts +170 -0
  48. package/dist/esm/models.js +27 -0
  49. package/dist/esm/models.js.map +1 -0
  50. package/dist/esm/permissions/check.d.ts +15 -0
  51. package/dist/esm/permissions/check.js +162 -0
  52. package/dist/esm/permissions/check.js.map +1 -0
  53. package/dist/esm/permissions/generate.d.ts +45 -0
  54. package/dist/esm/permissions/generate.js +77 -0
  55. package/dist/esm/permissions/generate.js.map +1 -0
  56. package/dist/esm/permissions/index.d.ts +2 -0
  57. package/dist/esm/permissions/index.js +4 -0
  58. package/dist/esm/permissions/index.js.map +1 -0
  59. package/dist/esm/resolvers/arguments.d.ts +26 -0
  60. package/dist/esm/resolvers/arguments.js +88 -0
  61. package/dist/esm/resolvers/arguments.js.map +1 -0
  62. package/dist/esm/resolvers/filters.d.ts +5 -0
  63. package/dist/esm/resolvers/filters.js +126 -0
  64. package/dist/esm/resolvers/filters.js.map +1 -0
  65. package/dist/esm/resolvers/index.d.ts +7 -0
  66. package/dist/esm/resolvers/index.js +9 -0
  67. package/dist/esm/resolvers/index.js.map +1 -0
  68. package/dist/esm/resolvers/mutations.d.ts +3 -0
  69. package/dist/esm/resolvers/mutations.js +255 -0
  70. package/dist/esm/resolvers/mutations.js.map +1 -0
  71. package/dist/esm/resolvers/node.d.ts +44 -0
  72. package/dist/esm/resolvers/node.js +102 -0
  73. package/dist/esm/resolvers/node.js.map +1 -0
  74. package/dist/esm/resolvers/resolver.d.ts +5 -0
  75. package/dist/esm/resolvers/resolver.js +143 -0
  76. package/dist/esm/resolvers/resolver.js.map +1 -0
  77. package/dist/esm/resolvers/resolvers.d.ts +9 -0
  78. package/dist/esm/resolvers/resolvers.js +39 -0
  79. package/dist/esm/resolvers/resolvers.js.map +1 -0
  80. package/dist/esm/resolvers/utils.d.ts +43 -0
  81. package/dist/esm/resolvers/utils.js +125 -0
  82. package/dist/esm/resolvers/utils.js.map +1 -0
  83. package/dist/esm/utils.d.ts +25 -0
  84. package/dist/esm/utils.js +159 -0
  85. package/dist/esm/utils.js.map +1 -0
  86. package/dist/esm/values.d.ts +15 -0
  87. package/dist/esm/values.js +7 -0
  88. package/dist/esm/values.js.map +1 -0
  89. package/jest.config.ts +12 -0
  90. package/package.json +66 -0
  91. package/renovate.json +32 -0
  92. package/src/client/gql.ts +7 -0
  93. package/src/client/index.ts +4 -0
  94. package/src/client/queries.ts +251 -0
  95. package/src/context.ts +27 -0
  96. package/src/errors.ts +32 -0
  97. package/src/generate/generate.ts +273 -0
  98. package/src/generate/index.ts +5 -0
  99. package/src/generate/mutations.ts +35 -0
  100. package/src/generate/utils.ts +223 -0
  101. package/src/index.ts +12 -0
  102. package/src/migrations/generate.ts +633 -0
  103. package/src/migrations/index.ts +3 -0
  104. package/src/models.ts +228 -0
  105. package/src/permissions/check.ts +239 -0
  106. package/src/permissions/generate.ts +143 -0
  107. package/src/permissions/index.ts +4 -0
  108. package/src/resolvers/arguments.ts +129 -0
  109. package/src/resolvers/filters.ts +163 -0
  110. package/src/resolvers/index.ts +9 -0
  111. package/src/resolvers/mutations.ts +313 -0
  112. package/src/resolvers/node.ts +193 -0
  113. package/src/resolvers/resolver.ts +223 -0
  114. package/src/resolvers/resolvers.ts +40 -0
  115. package/src/resolvers/utils.ts +188 -0
  116. package/src/utils.ts +186 -0
  117. package/src/values.ts +19 -0
  118. package/tests/unit/__snapshots__/generate.spec.ts.snap +105 -0
  119. package/tests/unit/__snapshots__/resolve.spec.ts.snap +60 -0
  120. package/tests/unit/generate.spec.ts +8 -0
  121. package/tests/unit/resolve.spec.ts +128 -0
  122. package/tests/unit/utils.ts +82 -0
  123. package/tsconfig.jest.json +13 -0
  124. 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,7 @@
1
+ export class Enum {
2
+ value;
3
+ constructor(value) {
4
+ this.value = value;
5
+ }
6
+ }
7
+ //# sourceMappingURL=values.js.map
@@ -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;