mad-data-parser 0.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 (58) hide show
  1. package/.env.example +0 -0
  2. package/.swcrc +27 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/parser/parseJsonPaths.d.ts +4 -0
  8. package/dist/parser/parseJsonPaths.d.ts.map +1 -0
  9. package/dist/parser/parseJsonPaths.js +116 -0
  10. package/dist/parser/parseJsonPaths.js.map +1 -0
  11. package/dist/utils/graphql/index.d.ts +7 -0
  12. package/dist/utils/graphql/index.d.ts.map +1 -0
  13. package/dist/utils/graphql/index.js +40 -0
  14. package/dist/utils/graphql/index.js.map +1 -0
  15. package/dist/utils/jsonPath/guards.d.ts +13 -0
  16. package/dist/utils/jsonPath/guards.d.ts.map +1 -0
  17. package/dist/utils/jsonPath/guards.js +34 -0
  18. package/dist/utils/jsonPath/guards.js.map +1 -0
  19. package/dist/utils/jsonPath/index.d.ts +4 -0
  20. package/dist/utils/jsonPath/index.d.ts.map +1 -0
  21. package/dist/utils/jsonPath/index.js +4 -0
  22. package/dist/utils/jsonPath/index.js.map +1 -0
  23. package/dist/utils/jsonPath/types.d.ts +50 -0
  24. package/dist/utils/jsonPath/types.d.ts.map +1 -0
  25. package/dist/utils/jsonPath/types.js +2 -0
  26. package/dist/utils/jsonPath/types.js.map +1 -0
  27. package/dist/utils/jsonPath/visitor.d.ts +26 -0
  28. package/dist/utils/jsonPath/visitor.d.ts.map +1 -0
  29. package/dist/utils/jsonPath/visitor.js +80 -0
  30. package/dist/utils/jsonPath/visitor.js.map +1 -0
  31. package/dist/utils/ts/helpers.d.ts +5 -0
  32. package/dist/utils/ts/helpers.d.ts.map +1 -0
  33. package/dist/utils/ts/helpers.js +7 -0
  34. package/dist/utils/ts/helpers.js.map +1 -0
  35. package/example/data/__tests__/output.ts +57 -0
  36. package/example/data/data.ts +226 -0
  37. package/example/data/output.ts +74 -0
  38. package/example/data/types.ts +92 -0
  39. package/example/example.ts +26 -0
  40. package/example/jsonPaths.data.ts +13 -0
  41. package/example/loadSchema.ts +32 -0
  42. package/jest.config.d.ts +6 -0
  43. package/jest.config.ts +241 -0
  44. package/nodemon.json +27 -0
  45. package/package.json +52 -0
  46. package/register.setup.jest.d.ts +2 -0
  47. package/register.setup.jest.ts +19 -0
  48. package/src/index.ts +2 -0
  49. package/src/parser/parseJsonPaths.ts +136 -0
  50. package/src/utils/graphql/index.ts +51 -0
  51. package/src/utils/jsonPath/guards.ts +37 -0
  52. package/src/utils/jsonPath/index.ts +3 -0
  53. package/src/utils/jsonPath/types.ts +56 -0
  54. package/src/utils/jsonPath/visitor.ts +108 -0
  55. package/src/utils/ts/helpers.ts +13 -0
  56. package/tsconfig.build.json +19 -0
  57. package/tsconfig.jest.json +18 -0
  58. package/tsconfig.json +36 -0
package/.env.example ADDED
File without changes
package/.swcrc ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/swcrc",
3
+ "jsc": {
4
+ "parser": {
5
+ "syntax": "typescript",
6
+ "tsx": false,
7
+ "decorators": false
8
+ },
9
+ "transform": {
10
+ "hidden": {
11
+ "jest": true
12
+ }
13
+ },
14
+ "target": "es2022",
15
+ "keepClassNames": true,
16
+ "baseUrl": "./",
17
+ "paths": {
18
+ "~/*": [
19
+ "src/*"
20
+ ]
21
+ }
22
+ },
23
+ "module": {
24
+ "type": "es6",
25
+ "noInterop": false
26
+ }
27
+ }
@@ -0,0 +1,2 @@
1
+ export * from './parser/parseJsonPaths';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './parser/parseJsonPaths';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { DocumentNode, GraphQLObjectType } from "graphql";
2
+ import * as JSONPath from '../utils/jsonPath';
3
+ export declare function parseJsonPaths(jsonPaths: Array<JSONPath.ASTNode[]>, rootType: GraphQLObjectType, fragmentName?: string): DocumentNode;
4
+ //# sourceMappingURL=parseJsonPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseJsonPaths.d.ts","sourceRoot":"","sources":["../../src/parser/parseJsonPaths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAA8F,MAAM,SAAS,CAAA;AAI1J,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAA;AAM5C,wBAAgB,cAAc,CAAC,SAAS,EAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,CAgDpI"}
@@ -0,0 +1,116 @@
1
+ import { getNamedType, GraphQLSchema, isObjectType, isUnionType } from "graphql";
2
+ import { createFieldNode, createInlineFragment, findFieldNode, isPrimitiveType } from "../utils/graphql";
3
+ import { Kind } from "graphql";
4
+ import * as JSONPath from '../utils/jsonPath';
5
+ const typeNameFieldNode = createFieldNode('__typename');
6
+ export function parseJsonPaths(jsonPaths, rootType, fragmentName) {
7
+ fragmentName = fragmentName ?? `autoGen${rootType.name}`;
8
+ const rootFragment = {
9
+ kind: Kind.FRAGMENT_DEFINITION,
10
+ typeCondition: { kind: Kind.NAMED_TYPE, name: { kind: Kind.NAME, value: rootType.name } },
11
+ name: { kind: Kind.NAME, value: fragmentName },
12
+ selectionSet: {
13
+ kind: Kind.SELECTION_SET,
14
+ selections: [typeNameFieldNode],
15
+ },
16
+ };
17
+ const doc = {
18
+ kind: Kind.DOCUMENT,
19
+ definitions: [rootFragment],
20
+ };
21
+ const stack = [];
22
+ const visitor = {
23
+ Root() {
24
+ stack.push([{ type: rootType, selectionSet: rootFragment.selectionSet, parent: null }]);
25
+ return;
26
+ },
27
+ Identifier(node) {
28
+ const stackItems = stack[stack.length - 1];
29
+ const passStackItems = processStackItems(stackItems, { fieldName: node.expression.value, value: undefined, condition: undefined });
30
+ stack.push(passStackItems);
31
+ return;
32
+ },
33
+ FilterExpression(node) {
34
+ const stackItems = stack[stack.length - 1];
35
+ const regex = /\?\(@\.(?<field>\w+)(\s*(?<condition>(?:==|!=)=?)\s*(?<quote>'|")(?<value>.*?)(\4))?/;
36
+ const matches = node.expression.value.match(regex);
37
+ const fieldName = matches?.groups?.field ?? '__typename';
38
+ const condition = matches?.groups?.condition;
39
+ const value = matches?.groups?.value;
40
+ const passStackItems = processStackItems(stackItems, { fieldName, value, condition });
41
+ stack.push(passStackItems);
42
+ return;
43
+ },
44
+ leave(node, parent, path, ancestors) {
45
+ if (needProcess(node)) {
46
+ stack.pop();
47
+ }
48
+ }
49
+ };
50
+ JSONPath.visit(jsonPaths, visitor);
51
+ return doc;
52
+ }
53
+ function needProcess(node) {
54
+ return JSONPath.isRootNode(node) || JSONPath.isIdentifierNode(node) || JSONPath.isFilterExpressionNode(node);
55
+ }
56
+ function processStackItems(stackItems, { fieldName, value, condition }) {
57
+ const passStackItems = [];
58
+ stackItems.forEach(stackItem => {
59
+ const parentType = stackItem.type;
60
+ if (isPrimitiveType(parentType)) {
61
+ return;
62
+ }
63
+ const selSet = stackItem.selectionSet;
64
+ if (isUnionType(parentType)) {
65
+ const filterField = (type) => fieldName === '__typename' ? type.name === value : Boolean(type.getFields()[fieldName]);
66
+ const filter = condition && !condition.includes('!')
67
+ ? (type) => filterField(type)
68
+ : (type) => !filterField(type);
69
+ const possibleTypes = parentType.getTypes().filter(filter);
70
+ possibleTypes.forEach(type => {
71
+ let inlineFragment = selSet.selections.find(selection => selection.kind === Kind.INLINE_FRAGMENT
72
+ && (selection.typeCondition?.name.value === type.name));
73
+ if (!inlineFragment) {
74
+ inlineFragment = createInlineFragment(type, '__typename');
75
+ selSet.selections.push(inlineFragment);
76
+ }
77
+ const fragmentStackItem = { type: type, selectionSet: inlineFragment.selectionSet, parent: stackItem };
78
+ const appendFieldType = type.getFields()[fieldName]?.type;
79
+ if (!appendFieldType) {
80
+ if (fieldName === '__typename') {
81
+ passStackItems.push(fragmentStackItem);
82
+ }
83
+ return;
84
+ }
85
+ const newStackItem = processGraphqlObjectType(fragmentStackItem, appendFieldType, fieldName);
86
+ passStackItems.push(newStackItem);
87
+ });
88
+ return;
89
+ }
90
+ const parentObjectType = isObjectType(parentType) ? parentType : stackItem.parent?.type;
91
+ if (!parentObjectType)
92
+ return;
93
+ const field = parentObjectType.getFields()[fieldName];
94
+ if (!field) {
95
+ return;
96
+ }
97
+ const newStackItem = processGraphqlObjectType(stackItem, field.type, fieldName);
98
+ passStackItems.push(newStackItem);
99
+ });
100
+ return passStackItems;
101
+ }
102
+ function processGraphqlObjectType(stackItem, fieldType, fieldName) {
103
+ const selSet = stackItem.selectionSet;
104
+ if (!selSet) {
105
+ throw new Error('Selection set not found');
106
+ }
107
+ const realFieldType = getNamedType(fieldType);
108
+ const subFieldsSelections = [isPrimitiveType(realFieldType) ? undefined : typeNameFieldNode].filter(Boolean);
109
+ let fieldNode = findFieldNode(selSet, fieldName);
110
+ if (!fieldNode) {
111
+ fieldNode = createFieldNode(fieldName, subFieldsSelections.map(selection => selection.name.value));
112
+ selSet.selections.push(fieldNode);
113
+ }
114
+ return { type: realFieldType, selectionSet: fieldNode.selectionSet, parent: stackItem };
115
+ }
116
+ //# sourceMappingURL=parseJsonPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseJsonPaths.js","sourceRoot":"","sources":["../../src/parser/parseJsonPaths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { GraphQLOutputType, SelectionSetNode, FieldNode, InlineFragmentNode, GraphQLNamedOutputType } from "graphql";
2
+ export declare function isPrimitiveType(type: GraphQLOutputType): boolean;
3
+ export declare function findFieldNode(selectionSet: SelectionSetNode, fieldName: string): FieldNode | undefined;
4
+ export declare function createFieldNode(fieldName: string, children?: string[]): FieldNode;
5
+ export declare function createFieldSelectionSet(outputType: GraphQLNamedOutputType, fieldName?: string): SelectionSetNode;
6
+ export declare function createInlineFragment(outputType: GraphQLNamedOutputType, fieldName: string): InlineFragmentNode;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/graphql/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,kBAAkB,EAAE,sBAAsB,EAAiB,MAAM,SAAS,CAAA;AAGxI,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAGhE;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAE,SAAS,GAAC,SAAS,CAEnG;AAGD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAE,SAAS,CAahF;AAID,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,sBAAsB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAE,gBAAgB,CAU/G;AAGD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,GAAE,kBAAkB,CAM7G"}
@@ -0,0 +1,40 @@
1
+ import { getNamedType, isScalarType, isEnumType, Kind } from "graphql";
2
+ export function isPrimitiveType(type) {
3
+ const namedType = getNamedType(type);
4
+ return isScalarType(namedType) || isEnumType(namedType);
5
+ }
6
+ export function findFieldNode(selectionSet, fieldName) {
7
+ return selectionSet?.selections.find(selection => selection.kind === Kind.FIELD && selection.name.value === fieldName);
8
+ }
9
+ export function createFieldNode(fieldName, children) {
10
+ let selectionSet = undefined;
11
+ if (children?.length) {
12
+ selectionSet = {
13
+ kind: Kind.SELECTION_SET,
14
+ selections: children.map(child => createFieldNode(child)),
15
+ };
16
+ }
17
+ return {
18
+ kind: Kind.FIELD,
19
+ name: { kind: Kind.NAME, value: fieldName },
20
+ selectionSet
21
+ };
22
+ }
23
+ export function createFieldSelectionSet(outputType, fieldName) {
24
+ const ret = {
25
+ kind: Kind.SELECTION_SET,
26
+ selections: [fieldName ? createFieldNode(fieldName) : undefined].filter(Boolean),
27
+ };
28
+ if (!isPrimitiveType(outputType) && !ret.selections.find(selection => selection.kind === Kind.FIELD && selection.name.value === '__typename')) {
29
+ ret.selections.unshift(createFieldNode('__typename'));
30
+ }
31
+ return ret;
32
+ }
33
+ export function createInlineFragment(outputType, fieldName) {
34
+ return {
35
+ kind: Kind.INLINE_FRAGMENT,
36
+ typeCondition: { kind: Kind.NAMED_TYPE, name: { kind: Kind.NAME, value: outputType.name } },
37
+ selectionSet: createFieldSelectionSet(outputType, fieldName),
38
+ };
39
+ }
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/graphql/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAItE,MAAM,UAAU,eAAe,CAAC,IAAuB;IACrD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACpC,OAAO,YAAY,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,YAA8B,EAAE,SAAiB;IAC7E,OAAO,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAwB,CAAA;AAC/I,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,QAAmB;IACpE,IAAI,YAAY,GAA+B,SAAS,CAAA;IACxD,IAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;QACpB,YAAY,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,aAAa;YACxB,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC/B,CAAA;IAC9B,CAAC;IACD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,KAAK;QAChB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;QAC3C,YAAY;KACb,CAAA;AACH,CAAC;AAID,MAAM,UAAU,uBAAuB,CAAC,UAAkC,EAAE,SAAkB;IAC5F,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,IAAI,CAAC,aAAa;QACxB,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAoB;KACxE,CAAA;IAE5B,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,EAAE,CAAC;QAC9I,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAGD,MAAM,UAAU,oBAAoB,CAAC,UAAkC,EAAE,SAAiB;IACxF,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,eAAe;QAC1B,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE;QAC3F,YAAY,EAAE,uBAAuB,CAAC,UAAU,EAAE,SAAS,CAAC;KAChC,CAAA;AAChC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { BaseNode, IdentifierNode, ASTNode, NumericLiteralNode, FilterExpressionNode, ScriptExpressionNode, StringLiteralNode, WildcardNode, SliceNode, RootNode } from "./types";
2
+ export declare function isAstNode(node: unknown): node is ASTNode;
3
+ export declare function isBaseNode(node: ASTNode): node is BaseNode;
4
+ export declare function isIdentifierNode(node: ASTNode): node is IdentifierNode;
5
+ export declare function isNumericLiteralNode(node: ASTNode): node is NumericLiteralNode;
6
+ export declare function isFilterExpressionNode(node: ASTNode): node is FilterExpressionNode;
7
+ export declare function isScriptExpressionNode(node: ASTNode): node is ScriptExpressionNode;
8
+ export declare function isStringLiteralNode(node: ASTNode): node is StringLiteralNode;
9
+ export declare function isWildcardNode(node: ASTNode): node is WildcardNode;
10
+ export declare function isSliceNode(node: ASTNode): node is SliceNode;
11
+ export declare function isRootNode(node: ASTNode): node is RootNode;
12
+ export declare function isJSONPath(nodes: unknown): nodes is ASTNode[];
13
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../src/utils/jsonPath/guards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEtL,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,OAAO,CAExD;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,QAAQ,CAE1D;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,cAAc,CAEtE;AACD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAE9E;AACD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,oBAAoB,CAElF;AACD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,oBAAoB,CAElF;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,iBAAiB,CAE5E;AACD,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,YAAY,CAElE;AACD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,SAAS,CAE5D;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,QAAQ,CAE1D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAE7D"}
@@ -0,0 +1,34 @@
1
+ export function isAstNode(node) {
2
+ return typeof node === 'object' && node !== null && 'expression' in node && typeof node.expression === 'object' && node.expression !== null && 'type' in node.expression && typeof node.expression.type === 'string';
3
+ }
4
+ export function isBaseNode(node) {
5
+ return isAstNode(node) && 'operation' in node && typeof node.operation === 'string' && 'scope' in node && typeof node.scope === 'string';
6
+ }
7
+ export function isIdentifierNode(node) {
8
+ return isBaseNode(node) && node.operation === 'member' && node.expression.type === 'identifier';
9
+ }
10
+ export function isNumericLiteralNode(node) {
11
+ return isBaseNode(node) && node.operation === 'subscript' && node.expression.type === 'numeric_literal';
12
+ }
13
+ export function isFilterExpressionNode(node) {
14
+ return isBaseNode(node) && node.operation === 'subscript' && node.expression.type === 'filter_expression';
15
+ }
16
+ export function isScriptExpressionNode(node) {
17
+ return isBaseNode(node) && node.operation === 'subscript' && node.expression.type === 'script_expression';
18
+ }
19
+ export function isStringLiteralNode(node) {
20
+ return isBaseNode(node) && node.operation === 'subscript' && node.expression.type === 'string_literal';
21
+ }
22
+ export function isWildcardNode(node) {
23
+ return isBaseNode(node) && node.operation === 'subscript' && node.expression.type === 'wildcard';
24
+ }
25
+ export function isSliceNode(node) {
26
+ return isBaseNode(node) && node.operation === 'subscript' && node.expression.type === 'slice';
27
+ }
28
+ export function isRootNode(node) {
29
+ return isAstNode(node) && node.expression.type === 'root' && node.expression.value === '$';
30
+ }
31
+ export function isJSONPath(nodes) {
32
+ return Array.isArray(nodes) && nodes.every(node => isAstNode(node));
33
+ }
34
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../../src/utils/jsonPath/guards.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAA;AACtN,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAA;AAC1I,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,YAAY,CAAA;AACjG,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,iBAAiB,CAAA;AACzG,CAAC;AACD,MAAM,UAAU,sBAAsB,CAAC,IAAa;IAClD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,mBAAmB,CAAA;AAC3G,CAAC;AACD,MAAM,UAAU,sBAAsB,CAAC,IAAa;IAClD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,mBAAmB,CAAA;AAC3G,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,gBAAgB,CAAA;AACxG,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,UAAU,CAAA;AAClG,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,CAAA;AAC/F,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,GAAG,CAAA;AAC5F,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AACrE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export * from './guards';
3
+ export * from './visitor';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/jsonPath/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export * from './guards';
3
+ export * from './visitor';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/jsonPath/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,50 @@
1
+ export interface ASTNode {
2
+ expression: Expression;
3
+ }
4
+ export type ExpressionType = 'root' | 'identifier' | 'numeric_literal' | 'filter_expression' | 'script_expression' | 'string_literal' | 'wildcard' | 'slice';
5
+ export type ExpressionValue = string | number | undefined;
6
+ interface BuildExpression<T extends ExpressionType = ExpressionType, V extends ExpressionValue = ExpressionValue> {
7
+ type: T;
8
+ value: V;
9
+ }
10
+ /** expression types */
11
+ export type Expression = BuildExpression<ExpressionType, ExpressionValue>;
12
+ export type RootExpression = BuildExpression<'root', '$'>;
13
+ export type IdentifierExpression = BuildExpression<'identifier', string>;
14
+ export type NumericLiteralExpression = BuildExpression<'numeric_literal', number>;
15
+ export type FilterExpressionExpression = BuildExpression<'filter_expression', `?(${string})`>;
16
+ export type ScriptExpressionExpression = BuildExpression<'script_expression', string>;
17
+ export type StringLiteralExpression = BuildExpression<'string_literal', string>;
18
+ export type WildcardExpression = BuildExpression<'wildcard', '*'>;
19
+ export type SliceExpression = BuildExpression<'slice', `${number | ''}:${number | ''}`>;
20
+ /** node types */
21
+ export interface RootNode extends ASTNode {
22
+ expression: RootExpression;
23
+ }
24
+ export interface BaseNode<T extends 'member' | 'subscript' = 'member' | 'subscript'> extends ASTNode {
25
+ operation: T;
26
+ scope: 'child' | 'descendant' | 'parent';
27
+ }
28
+ export interface IdentifierNode extends BaseNode<'member'> {
29
+ expression: IdentifierExpression;
30
+ }
31
+ export interface NumericLiteralNode extends BaseNode<'subscript'> {
32
+ expression: NumericLiteralExpression;
33
+ }
34
+ export interface FilterExpressionNode extends BaseNode<'subscript'> {
35
+ expression: FilterExpressionExpression;
36
+ }
37
+ export interface ScriptExpressionNode extends BaseNode<'subscript'> {
38
+ expression: ScriptExpressionExpression;
39
+ }
40
+ export interface StringLiteralNode extends BaseNode<'subscript'> {
41
+ expression: StringLiteralExpression;
42
+ }
43
+ export interface WildcardNode extends BaseNode<'subscript'> {
44
+ expression: WildcardExpression;
45
+ }
46
+ export interface SliceNode extends BaseNode<'subscript'> {
47
+ expression: SliceExpression;
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/jsonPath/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACpB,UAAU,EAAE,UAAU,CAAA;CACzB;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,YAAY,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,UAAU,GAAG,OAAO,CAAA;AAC5J,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;AAEzD,UAAU,eAAe,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,CAAC,SAAS,eAAe,GAAG,eAAe;IAC9G,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,CAAC,CAAA;CACT;AACD,uBAAuB;AACvB,MAAM,MAAM,UAAU,GAAG,eAAe,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;AACzE,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACzD,MAAM,MAAM,oBAAoB,GAAG,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;AACxE,MAAM,MAAM,wBAAwB,GAAG,eAAe,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;AACjF,MAAM,MAAM,0BAA0B,GAAG,eAAe,CAAC,mBAAmB,EAAE,KAAK,MAAM,GAAG,CAAC,CAAA;AAC7F,MAAM,MAAM,0BAA0B,GAAG,eAAe,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;AACrF,MAAM,MAAM,uBAAuB,GAAG,eAAe,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;AAC/E,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;AACjE,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,MAAM,GAAC,EAAE,IAAI,MAAM,GAAC,EAAE,EAAE,CAAC,CAAA;AAEnF,iBAAiB;AACjB,MAAM,WAAW,QAAS,SAAQ,OAAO;IACvC,UAAU,EAAE,cAAc,CAAA;CAC3B;AACD,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAC,WAAW,CAAE,SAAQ,OAAO;IAChG,SAAS,EAAE,CAAC,CAAA;IACZ,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAA;CACzC;AACD,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAAC,QAAQ,CAAC;IACxD,UAAU,EAAE,oBAAoB,CAAA;CACjC;AACD,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,CAAC,WAAW,CAAC;IAC/D,UAAU,EAAE,wBAAwB,CAAA;CACrC;AACD,MAAM,WAAW,oBAAqB,SAAQ,QAAQ,CAAC,WAAW,CAAC;IACjE,UAAU,EAAE,0BAA0B,CAAA;CACvC;AACD,MAAM,WAAW,oBAAqB,SAAQ,QAAQ,CAAC,WAAW,CAAC;IACjE,UAAU,EAAE,0BAA0B,CAAA;CACvC;AACD,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,CAAC,WAAW,CAAC;IAC9D,UAAU,EAAE,uBAAuB,CAAA;CACpC;AACD,MAAM,WAAW,YAAa,SAAQ,QAAQ,CAAC,WAAW,CAAC;IACzD,UAAU,EAAE,kBAAkB,CAAA;CAC/B;AACD,MAAM,WAAW,SAAU,SAAQ,QAAQ,CAAC,WAAW,CAAC;IACtD,UAAU,EAAE,eAAe,CAAA;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/jsonPath/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { ASTNode, ExpressionType, RootNode, IdentifierNode, NumericLiteralNode, FilterExpressionNode, ScriptExpressionNode, StringLiteralNode, WildcardNode, SliceNode } from "./types";
2
+ import { type SnakeToPascalCase } from "../../utils/ts/helpers";
3
+ export declare const BREAK: unique symbol;
4
+ type Kind = {
5
+ root: RootNode;
6
+ identifier: IdentifierNode;
7
+ numeric_literal: NumericLiteralNode;
8
+ filter_expression: FilterExpressionNode;
9
+ script_expression: ScriptExpressionNode;
10
+ string_literal: StringLiteralNode;
11
+ wildcard: WildcardNode;
12
+ slice: SliceNode;
13
+ };
14
+ /** visitor types */
15
+ export type VisitorFn = (node: ASTNode, parent: ASTNode | null, index: Array<number>, ancestors: ASTNode[]) => ASTNode | typeof BREAK | undefined | null | void;
16
+ export type TypedVisitorFn<T extends ExpressionType = ExpressionType> = (node: Kind[T], parent: ASTNode | null, index: Array<number>, ancestors: ASTNode[]) => ASTNode | typeof BREAK | undefined | null | void;
17
+ export interface IVisitor {
18
+ enter?: VisitorFn;
19
+ leave?: VisitorFn;
20
+ }
21
+ export type NodeVisitor = {
22
+ [T in ExpressionType as `${'leave' | ''}${SnakeToPascalCase<T>}`]?: TypedVisitorFn<T>;
23
+ } & IVisitor;
24
+ export declare function visit(nodes: ASTNode[] | Array<ASTNode[]>, visitor: NodeVisitor): void;
25
+ export {};
26
+ //# sourceMappingURL=visitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.d.ts","sourceRoot":"","sources":["../../../src/utils/jsonPath/visitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAG5L,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE9E,eAAO,MAAM,KAAK,eAAkB,CAAA;AAEpC,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,EAAE,cAAc,CAAA;IAC1B,eAAe,EAAE,kBAAkB,CAAA;IACnC,iBAAiB,EAAE,oBAAoB,CAAA;IACvC,iBAAiB,EAAE,oBAAoB,CAAA;IACvC,cAAc,EAAE,iBAAiB,CAAA;IACjC,QAAQ,EAAE,YAAY,CAAA;IACtB,KAAK,EAAE,SAAS,CAAA;CACjB,CAAA;AAGD,oBAAoB;AACpB,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,OAAO,GAAC,OAAO,KAAK,GAAC,SAAS,GAAC,IAAI,GAAC,IAAI,CAAA;AACrJ,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,GAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,OAAO,GAAC,OAAO,KAAK,GAAC,SAAS,GAAC,IAAI,GAAC,IAAI,CAAA;AACrM,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAC,SAAS,CAAC;IACjB,KAAK,CAAC,EAAC,SAAS,CAAC;CAClB;AACD,MAAM,MAAM,WAAW,GAAG;KACvB,CAAC,IAAI,cAAc,IAAI,GAAG,OAAO,GAAG,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;CACtF,GAAG,QAAQ,CAAA;AA6EZ,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,GAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,GAAE,IAAI,CAElF"}
@@ -0,0 +1,80 @@
1
+ import { isJSONPath } from "./guards";
2
+ import { isAstNode } from "./guards";
3
+ import { snakeToPascalCase } from "../../utils/ts/helpers";
4
+ export const BREAK = Symbol('BREAK');
5
+ function doVisit(nodes, visitor) {
6
+ if (isJSONPath(nodes)) {
7
+ nodes = [nodes];
8
+ }
9
+ for (const jsonPath of nodes) {
10
+ let parent = null;
11
+ let ancestors = [];
12
+ let path = [];
13
+ for (let i = 0; i < jsonPath.length; i++) {
14
+ const _node = jsonPath[i];
15
+ let node = _node;
16
+ path.push(i);
17
+ const enterResult = visitor.enter?.(node, parent, path, ancestors);
18
+ if (enterResult === BREAK) {
19
+ break;
20
+ }
21
+ if (isAstNode(enterResult)) {
22
+ node = enterResult;
23
+ }
24
+ parent = node;
25
+ ancestors.push(node);
26
+ jsonPath[i] = node;
27
+ }
28
+ parent = ancestors.pop() ?? null;
29
+ path.pop();
30
+ for (let i = jsonPath.length - 1; i >= 0; i--) {
31
+ const _node = jsonPath[i];
32
+ let node = _node;
33
+ parent = ancestors.pop() ?? null;
34
+ path.pop();
35
+ const leaveResult = visitor.leave?.(node, parent, path, ancestors);
36
+ if (leaveResult === BREAK) {
37
+ break;
38
+ }
39
+ if (isAstNode(leaveResult)) {
40
+ node = leaveResult;
41
+ }
42
+ jsonPath[i] = node;
43
+ }
44
+ }
45
+ }
46
+ function makeVisitor(visitor) {
47
+ const visitorCall = function (type, ...[node, ...rest]) {
48
+ let result;
49
+ //call leave node method
50
+ if (type === 'leave') {
51
+ const methodName = `${type}${snakeToPascalCase(node.expression.type)}`;
52
+ result = visitor[methodName]?.(node, ...rest);
53
+ if (result === BREAK) {
54
+ return result;
55
+ }
56
+ }
57
+ //call original visitor
58
+ if (type in visitor) {
59
+ result = visitor[type]?.(node, ...rest);
60
+ if (result === BREAK) {
61
+ return result;
62
+ }
63
+ }
64
+ //call enter enter node method
65
+ if (type === 'enter') {
66
+ const methodName = `${snakeToPascalCase(node.expression.type)}`;
67
+ result = visitor[methodName]?.(node, ...rest);
68
+ }
69
+ return result;
70
+ };
71
+ const result = {
72
+ enter: visitorCall.bind(null, 'enter'),
73
+ leave: visitorCall.bind(null, 'leave'),
74
+ };
75
+ return result;
76
+ }
77
+ export function visit(nodes, visitor) {
78
+ doVisit(nodes, makeVisitor(visitor));
79
+ }
80
+ //# sourceMappingURL=visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../../../src/utils/jsonPath/visitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}` ? `${T}${Capitalize<SnakeToCamelCase<U>>}` : S;
2
+ export type SnakeToPascalCase<S extends string> = Capitalize<SnakeToCamelCase<S>>;
3
+ export declare function snakeToCamelCase(str: string): SnakeToCamelCase<string>;
4
+ export declare function snakeToPascalCase(str: string): SnakeToPascalCase<string>;
5
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/ts/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,GAClF,GAAG,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,GAAI,CAAC,CAAA;AAC7C,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;AAGjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAGtE;AACD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAGxE"}
@@ -0,0 +1,7 @@
1
+ export function snakeToCamelCase(str) {
2
+ return str.split('_').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('');
3
+ }
4
+ export function snakeToPascalCase(str) {
5
+ return snakeToCamelCase(str).charAt(0).toUpperCase() + snakeToCamelCase(str).slice(1);
6
+ }
7
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/utils/ts/helpers.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAE1C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAA6B,CAAA;AAC7G,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAE3C,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAA8B,CAAA;AACpH,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { afterAll, beforeAll, describe, expect, it, test, xit } from '@jest/globals'
2
+ import { createFormatter, type DataOutput } from '../output'
3
+
4
+ describe('Data: Output', () => {
5
+ describe('Format Currency', () => {
6
+ const baseDataOutput:DataOutput = {
7
+ __typename: 'DataOutput',
8
+ type: 'currency',
9
+ currencyFormat: '$ #.###,00 USD',
10
+ }
11
+ const inputData = [1,2,3,4,5]
12
+ it('should format currency array with index and indexMax', () => {
13
+ const formatFn = createFormatter({
14
+ ...baseDataOutput,
15
+ array: true,
16
+ index: 1,
17
+ indexMax: 3,
18
+ lineBreak: true,
19
+ spaces: true,
20
+ separator: '|',
21
+ })
22
+ const result = [
23
+ '$ 1,00 USD',
24
+ '$ 2,00 USD',
25
+ '$ 3,00 USD',
26
+ ].join("| \n");
27
+ const formated = formatFn(inputData)
28
+ expect(formated).toBe(result)
29
+ })
30
+ it('should format currency single data with index and lineBreak', () => {
31
+ const formatFn = createFormatter({
32
+ ...baseDataOutput,
33
+ array: false,
34
+ index: 2
35
+ })
36
+ const formated = formatFn(inputData)
37
+ expect(formated).toBe('$ 2,00 USD')
38
+ })
39
+ })
40
+ describe('Format Unit', () => {
41
+ const baseDataOutput:DataOutput = {
42
+ __typename: 'DataOutput',
43
+ type: 'unit',
44
+ unitSuffix: 'm³',
45
+ }
46
+ const inputData = 2
47
+ it('should format unit single data with index and lineBreak', () => {
48
+ const formatFn = createFormatter({
49
+ ...baseDataOutput,
50
+ array: false,
51
+ index: 2
52
+ })
53
+ const formated = formatFn(2)
54
+ expect(formated).toBe('2.00 m³')
55
+ })
56
+ })
57
+ })