@traqula/core 0.0.10 → 0.0.12

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.
@@ -0,0 +1,70 @@
1
+ import type { Node } from './nodeTypings';
2
+ type Safeness = 'safe' | 'unsafe';
3
+ type SafeWrap<Safe extends Safeness, obj extends object> = Safe extends 'safe' ? {
4
+ [key in keyof obj]: unknown;
5
+ } : obj;
6
+ export declare class TransformerType<Nodes extends Pick<Node, 'type'>> {
7
+ protected safeObjectVisit(value: unknown, mapper: (some: object) => any): unknown;
8
+ transformNode<Safe extends 'safe' | 'unsafe' = 'safe'>(curObject: object, nodeCallBacks: {
9
+ [T in Nodes['type']]?: {
10
+ transform?: (op: SafeWrap<Safe, Extract<Nodes, {
11
+ type: T;
12
+ }>>) => any;
13
+ continue?: (op: Extract<Nodes, {
14
+ type: T;
15
+ }>) => boolean;
16
+ };
17
+ }): any;
18
+ visitNode(curObject: object, nodeCallBacks: {
19
+ [T in Nodes['type']]?: (op: Extract<Nodes, {
20
+ type: T;
21
+ }>) => boolean;
22
+ }): void;
23
+ }
24
+ export declare class TransformerSubType<Nodes extends Pick<Node, 'type' | 'subType'>> extends TransformerType<Nodes> {
25
+ transformNodeSpecific<Safe extends 'safe' | 'unsafe' = 'safe'>(curObject: object, nodeCallBacks: {
26
+ [T in Nodes['type']]?: {
27
+ transform?: (op: SafeWrap<Safe, Extract<Nodes, {
28
+ type: T;
29
+ }>>) => any;
30
+ continue?: (op: Extract<Nodes, {
31
+ type: T;
32
+ }>) => boolean;
33
+ };
34
+ }, nodeSpecificCallBacks?: {
35
+ [Type in Nodes['type']]?: {
36
+ [SubType in Extract<Nodes, {
37
+ type: Type;
38
+ subType: string;
39
+ }>['subType']]?: {
40
+ transform?: (op: SafeWrap<Safe, Extract<Nodes, {
41
+ type: Type;
42
+ subType: SubType;
43
+ }>>) => any;
44
+ continue?: (op: Extract<Nodes, {
45
+ type: Type;
46
+ subType: SubType;
47
+ }>) => boolean;
48
+ };
49
+ };
50
+ }): any;
51
+ /**
52
+ * When both nodeCallBack and NodeSpecific callBack are matched, will only look at nodeSpecifCallback
53
+ */
54
+ visitNodeSpecific(curObject: object, nodeCallBacks: {
55
+ [T in Nodes['type']]?: (op: Extract<Nodes, {
56
+ type: T;
57
+ }>) => boolean | void;
58
+ }, nodeSpecificCallBacks?: {
59
+ [Type in Nodes['type']]?: {
60
+ [Subtype in Extract<Nodes, {
61
+ type: Type;
62
+ subType: string;
63
+ }>['subType']]?: (op: Extract<Nodes, {
64
+ type: Type;
65
+ subType: Subtype;
66
+ }>) => boolean | void;
67
+ };
68
+ }): void;
69
+ }
70
+ export {};
@@ -0,0 +1,114 @@
1
+ export class TransformerType {
2
+ safeObjectVisit(value, mapper) {
3
+ if (value && typeof value === 'object') {
4
+ // If you wonder why this is all so hard, this is the reason. We cannot lose the methods of our Array objects
5
+ if (Array.isArray(value)) {
6
+ return value.map(x => this.safeObjectVisit(x, mapper));
7
+ }
8
+ return mapper(value);
9
+ }
10
+ return value;
11
+ }
12
+ transformNode(curObject, nodeCallBacks) {
13
+ let continueCheck;
14
+ let transformation;
15
+ const casted = curObject;
16
+ if (casted.type) {
17
+ continueCheck = nodeCallBacks[casted.type]?.continue;
18
+ transformation = nodeCallBacks[casted.type]?.transform;
19
+ }
20
+ let shouldContinue = true;
21
+ if (continueCheck) {
22
+ shouldContinue = continueCheck(curObject);
23
+ }
24
+ if (!shouldContinue) {
25
+ return curObject;
26
+ }
27
+ const copy = { ...curObject };
28
+ for (const [key, value] of Object.entries(copy)) {
29
+ copy[key] =
30
+ this.safeObjectVisit(value, obj => this.transformNode(obj, nodeCallBacks));
31
+ }
32
+ if (transformation) {
33
+ return transformation(copy);
34
+ }
35
+ return copy;
36
+ }
37
+ visitNode(curObject, nodeCallBacks) {
38
+ let callback;
39
+ const casted = curObject;
40
+ if (casted.type) {
41
+ callback = nodeCallBacks[casted.type];
42
+ }
43
+ let shouldIterate = true;
44
+ if (callback) {
45
+ shouldIterate = callback(curObject);
46
+ }
47
+ if (shouldIterate) {
48
+ for (const value of Object.values(curObject)) {
49
+ this.safeObjectVisit(value, obj => this.visitNode(obj, nodeCallBacks));
50
+ }
51
+ }
52
+ }
53
+ }
54
+ export class TransformerSubType extends TransformerType {
55
+ // Public visitObjects(curObject: object, visitor: (current: object) => void): void {
56
+ // for (const value of Object.values(curObject)) {
57
+ // this.safeObjectVisit(value, obj => this.visitObjects(obj, visitor));
58
+ // }
59
+ // }
60
+ transformNodeSpecific(curObject, nodeCallBacks, nodeSpecificCallBacks = {}) {
61
+ let continueCheck;
62
+ let transformation;
63
+ const casted = curObject;
64
+ if (casted.type && casted.subType) {
65
+ const specific = nodeSpecificCallBacks[casted.type];
66
+ if (specific) {
67
+ continueCheck = specific[casted.subType]?.continue;
68
+ transformation = specific[casted.subType]?.transform;
69
+ }
70
+ }
71
+ let shouldContinue = true;
72
+ if (continueCheck) {
73
+ shouldContinue = continueCheck(curObject);
74
+ }
75
+ if (!shouldContinue) {
76
+ return curObject;
77
+ }
78
+ const copy = { ...curObject };
79
+ for (const [key, value] of Object.entries(copy)) {
80
+ copy[key] =
81
+ this.safeObjectVisit(value, obj => this.transformNodeSpecific(obj, nodeCallBacks, nodeSpecificCallBacks));
82
+ }
83
+ if (transformation) {
84
+ return transformation(copy);
85
+ }
86
+ return copy;
87
+ }
88
+ /**
89
+ * When both nodeCallBack and NodeSpecific callBack are matched, will only look at nodeSpecifCallback
90
+ */
91
+ visitNodeSpecific(curObject, nodeCallBacks, nodeSpecificCallBacks = {}) {
92
+ let callback;
93
+ const casted = curObject;
94
+ if (casted.type && casted.subType) {
95
+ const specific = nodeSpecificCallBacks[casted.type];
96
+ if (specific) {
97
+ callback = specific[casted.subType];
98
+ }
99
+ }
100
+ if (!callback && casted.type) {
101
+ callback = nodeCallBacks[curObject.type];
102
+ }
103
+ let shouldIterate = true;
104
+ if (callback) {
105
+ shouldIterate = callback(curObject) ?? true;
106
+ }
107
+ if (shouldIterate) {
108
+ for (const value of Object.values(curObject)) {
109
+ this.safeObjectVisit(value, obj => this.visitNodeSpecific(obj, nodeCallBacks, nodeSpecificCallBacks));
110
+ }
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=Transformers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transformers.js","sourceRoot":"","sources":["Transformers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Node } from './nodeTypings';\n\ntype Safeness = 'safe' | 'unsafe';\ntype SafeWrap<Safe extends Safeness, obj extends object> = Safe extends 'safe' ? {[key in keyof obj]: unknown } : obj;\n\nexport class TransformerType<Nodes extends Pick<Node, 'type'>> {\n protected safeObjectVisit(value: unknown, mapper: (some: object) => any): unknown {\n if (value && typeof value === 'object') {\n // If you wonder why this is all so hard, this is the reason. We cannot lose the methods of our Array objects\n if (Array.isArray(value)) {\n return value.map(x => this.safeObjectVisit(x, mapper));\n }\n return mapper(value);\n }\n return value;\n }\n\n public transformNode<Safe extends 'safe' | 'unsafe' = 'safe'>(\n curObject: object,\n nodeCallBacks: {[T in Nodes['type']]?: {\n transform?: (op: SafeWrap<Safe, Extract<Nodes, { type: T }>>) => any;\n continue?: (op: Extract<Nodes, { type: T }>) => boolean;\n }},\n ): any {\n let continueCheck: ((node: any) => boolean) | undefined;\n let transformation: ((node: any) => unknown) | undefined;\n const casted = <{ type?: Nodes['type'] }>curObject;\n if (casted.type) {\n continueCheck = nodeCallBacks[casted.type]?.continue;\n transformation = nodeCallBacks[casted.type]?.transform;\n }\n let shouldContinue = true;\n if (continueCheck) {\n shouldContinue = continueCheck(curObject);\n }\n if (!shouldContinue) {\n return curObject;\n }\n const copy: { type?: unknown } = { ...curObject };\n for (const [ key, value ] of Object.entries(copy)) {\n (<Record<string, unknown>> copy)[key] =\n this.safeObjectVisit(value, obj => this.transformNode(obj, nodeCallBacks));\n }\n if (transformation) {\n return transformation(copy);\n }\n return copy;\n }\n\n public visitNode(\n curObject: object,\n nodeCallBacks: {[T in Nodes['type']]?: (op: Extract<Nodes, { type: T }>) => boolean },\n ): void {\n let callback: ((node: any) => boolean) | undefined;\n const casted = <{ type?: Nodes['type'] }>curObject;\n if (casted.type) {\n callback = nodeCallBacks[casted.type];\n }\n let shouldIterate = true;\n if (callback) {\n shouldIterate = callback(curObject);\n }\n if (shouldIterate) {\n for (const value of Object.values(curObject)) {\n this.safeObjectVisit(value, obj => this.visitNode(obj, nodeCallBacks));\n }\n }\n }\n}\n\nexport class TransformerSubType<Nodes extends Pick<Node, 'type' | 'subType'>> extends TransformerType<Nodes> {\n // Public visitObjects(curObject: object, visitor: (current: object) => void): void {\n // for (const value of Object.values(curObject)) {\n // this.safeObjectVisit(value, obj => this.visitObjects(obj, visitor));\n // }\n // }\n\n public transformNodeSpecific<Safe extends 'safe' | 'unsafe' = 'safe'>(\n curObject: object,\n nodeCallBacks: {[T in Nodes['type']]?: {\n transform?: (op: SafeWrap<Safe, Extract<Nodes, { type: T }>>) => any;\n continue?: (op: Extract<Nodes, { type: T }>) => boolean;\n }},\n nodeSpecificCallBacks: {[Type in Nodes['type']]?: {\n [SubType in Extract<Nodes, { type: Type; subType: string }>['subType']]?: {\n transform?: (op: SafeWrap<Safe, Extract<Nodes, { type: Type; subType: SubType }>>) => any;\n continue?: (op: Extract<Nodes, { type: Type; subType: SubType }>) => boolean;\n }}} = {},\n ): any {\n let continueCheck: ((node: any) => boolean) | undefined;\n let transformation: ((node: any) => unknown) | undefined;\n const casted = <{ type?: Nodes['type']; subType?: string }>curObject;\n if (casted.type && casted.subType) {\n const specific = nodeSpecificCallBacks[casted.type];\n if (specific) {\n continueCheck = specific[<keyof typeof specific> casted.subType]?.continue;\n transformation = specific[<keyof typeof specific> casted.subType]?.transform;\n }\n }\n let shouldContinue = true;\n if (continueCheck) {\n shouldContinue = continueCheck(curObject);\n }\n if (!shouldContinue) {\n return curObject;\n }\n const copy: { type?: unknown } = { ...curObject };\n for (const [ key, value ] of Object.entries(copy)) {\n (<Record<string, unknown>> copy)[key] =\n this.safeObjectVisit(value, obj => this.transformNodeSpecific(obj, nodeCallBacks, nodeSpecificCallBacks));\n }\n if (transformation) {\n return transformation(copy);\n }\n return copy;\n }\n\n /**\n * When both nodeCallBack and NodeSpecific callBack are matched, will only look at nodeSpecifCallback\n */\n public visitNodeSpecific(\n curObject: object,\n nodeCallBacks: {[T in Nodes['type']]?: (op: Extract<Nodes, { type: T }>) => boolean | void },\n nodeSpecificCallBacks: {[Type in Nodes['type']]?:\n {[Subtype in Extract<Nodes, { type: Type; subType: string }>['subType']]?:\n (op: Extract<Nodes, { type: Type; subType: Subtype }>) => boolean | void }} = {},\n ): void {\n let callback: ((node: any) => boolean | void) | undefined;\n const casted = <{ type?: Nodes['type']; subType?: string }> curObject;\n if (casted.type && casted.subType) {\n const specific = nodeSpecificCallBacks[casted.type];\n if (specific) {\n callback = specific[<keyof typeof specific>casted.subType];\n }\n }\n if (!callback && casted.type) {\n callback = nodeCallBacks[(<{ type: Nodes['type'] }> curObject).type];\n }\n let shouldIterate = true;\n if (callback) {\n shouldIterate = callback(curObject) ?? true;\n }\n if (shouldIterate) {\n for (const value of Object.values(curObject)) {\n this.safeObjectVisit(value, obj => this.visitNodeSpecific(obj, nodeCallBacks, nodeSpecificCallBacks));\n }\n }\n }\n}\n"]}
package/lib/index.cjs CHANGED
@@ -25,7 +25,8 @@ __export(index_exports, {
25
25
  IndirBuilder: () => IndirBuilder,
26
26
  LexerBuilder: () => LexerBuilder,
27
27
  ParserBuilder: () => ParserBuilder,
28
- Transformer: () => Transformer,
28
+ TransformerSubType: () => TransformerSubType,
29
+ TransformerType: () => TransformerType,
29
30
  createToken: () => createToken2,
30
31
  listToIndirectionMap: () => listToIndirectionMap,
31
32
  unCapitalize: () => unCapitalize
@@ -10058,58 +10059,115 @@ function createToken2(config) {
10058
10059
  return createToken(config);
10059
10060
  }
10060
10061
 
10061
- // lib/Transformer.ts
10062
- var Transformer = class {
10063
- transformNode(curObject, searchType, patch) {
10064
- const copy = { ...curObject };
10065
- for (const [key, value] of Object.entries(copy)) {
10066
- copy[key] = this.safeObjectVisit(value, (obj) => this.transformNode(obj, searchType, patch));
10067
- }
10068
- if (copy.type === searchType) {
10069
- return patch(copy);
10062
+ // lib/Transformers.ts
10063
+ var TransformerType = class {
10064
+ safeObjectVisit(value, mapper) {
10065
+ if (value && typeof value === "object") {
10066
+ if (Array.isArray(value)) {
10067
+ return value.map((x) => this.safeObjectVisit(x, mapper));
10068
+ }
10069
+ return mapper(value);
10070
10070
  }
10071
- return copy;
10071
+ return value;
10072
10072
  }
10073
- transformNodeSpecific(curObject, searchType, searchSubType, patch) {
10073
+ transformNode(curObject, nodeCallBacks) {
10074
+ let continueCheck;
10075
+ let transformation;
10076
+ const casted = curObject;
10077
+ if (casted.type) {
10078
+ continueCheck = nodeCallBacks[casted.type]?.continue;
10079
+ transformation = nodeCallBacks[casted.type]?.transform;
10080
+ }
10081
+ let shouldContinue = true;
10082
+ if (continueCheck) {
10083
+ shouldContinue = continueCheck(curObject);
10084
+ }
10085
+ if (!shouldContinue) {
10086
+ return curObject;
10087
+ }
10074
10088
  const copy = { ...curObject };
10075
10089
  for (const [key, value] of Object.entries(copy)) {
10076
- copy[key] = this.safeObjectVisit(value, (obj) => this.transformNodeSpecific(obj, searchType, searchSubType, patch));
10090
+ copy[key] = this.safeObjectVisit(value, (obj) => this.transformNode(obj, nodeCallBacks));
10077
10091
  }
10078
- if (copy.type === searchType && copy.subType === searchSubType) {
10079
- return patch(copy);
10092
+ if (transformation) {
10093
+ return transformation(copy);
10080
10094
  }
10081
10095
  return copy;
10082
10096
  }
10083
- visitObjects(curObject, visitor) {
10084
- for (const value of Object.values(curObject)) {
10085
- this.safeObjectVisit(value, (obj) => this.visitObjects(obj, visitor));
10097
+ visitNode(curObject, nodeCallBacks) {
10098
+ let callback;
10099
+ const casted = curObject;
10100
+ if (casted.type) {
10101
+ callback = nodeCallBacks[casted.type];
10086
10102
  }
10087
- }
10088
- visitNode(curObject, searchType, visitor) {
10089
- for (const value of Object.values(curObject)) {
10090
- this.safeObjectVisit(value, (obj) => this.visitNode(obj, searchType, visitor));
10103
+ let shouldIterate = true;
10104
+ if (callback) {
10105
+ shouldIterate = callback(curObject);
10091
10106
  }
10092
- if (curObject.type === searchType) {
10093
- visitor(curObject);
10107
+ if (shouldIterate) {
10108
+ for (const value of Object.values(curObject)) {
10109
+ this.safeObjectVisit(value, (obj) => this.visitNode(obj, nodeCallBacks));
10110
+ }
10094
10111
  }
10095
10112
  }
10096
- visitNodeSpecific(curObject, searchType, searchSubType, visitor) {
10097
- for (const value of Object.values(curObject)) {
10098
- this.safeObjectVisit(value, (obj) => this.visitNodeSpecific(obj, searchType, searchSubType, visitor));
10113
+ };
10114
+ var TransformerSubType = class extends TransformerType {
10115
+ // Public visitObjects(curObject: object, visitor: (current: object) => void): void {
10116
+ // for (const value of Object.values(curObject)) {
10117
+ // this.safeObjectVisit(value, obj => this.visitObjects(obj, visitor));
10118
+ // }
10119
+ // }
10120
+ transformNodeSpecific(curObject, nodeCallBacks, nodeSpecificCallBacks = {}) {
10121
+ let continueCheck;
10122
+ let transformation;
10123
+ const casted = curObject;
10124
+ if (casted.type && casted.subType) {
10125
+ const specific = nodeSpecificCallBacks[casted.type];
10126
+ if (specific) {
10127
+ continueCheck = specific[casted.subType]?.continue;
10128
+ transformation = specific[casted.subType]?.transform;
10129
+ }
10099
10130
  }
10100
- const cast = curObject;
10101
- if (cast.type === searchType && cast.subType === searchSubType) {
10102
- visitor(curObject);
10131
+ let shouldContinue = true;
10132
+ if (continueCheck) {
10133
+ shouldContinue = continueCheck(curObject);
10103
10134
  }
10135
+ if (!shouldContinue) {
10136
+ return curObject;
10137
+ }
10138
+ const copy = { ...curObject };
10139
+ for (const [key, value] of Object.entries(copy)) {
10140
+ copy[key] = this.safeObjectVisit(value, (obj) => this.transformNodeSpecific(obj, nodeCallBacks, nodeSpecificCallBacks));
10141
+ }
10142
+ if (transformation) {
10143
+ return transformation(copy);
10144
+ }
10145
+ return copy;
10104
10146
  }
10105
- safeObjectVisit(value, mapper) {
10106
- if (value && typeof value === "object") {
10107
- if (Array.isArray(value)) {
10108
- return value.map((x) => this.safeObjectVisit(x, mapper));
10147
+ /**
10148
+ * When both nodeCallBack and NodeSpecific callBack are matched, will only look at nodeSpecifCallback
10149
+ */
10150
+ visitNodeSpecific(curObject, nodeCallBacks, nodeSpecificCallBacks = {}) {
10151
+ let callback;
10152
+ const casted = curObject;
10153
+ if (casted.type && casted.subType) {
10154
+ const specific = nodeSpecificCallBacks[casted.type];
10155
+ if (specific) {
10156
+ callback = specific[casted.subType];
10157
+ }
10158
+ }
10159
+ if (!callback && casted.type) {
10160
+ callback = nodeCallBacks[curObject.type];
10161
+ }
10162
+ let shouldIterate = true;
10163
+ if (callback) {
10164
+ shouldIterate = callback(curObject) ?? true;
10165
+ }
10166
+ if (shouldIterate) {
10167
+ for (const value of Object.values(curObject)) {
10168
+ this.safeObjectVisit(value, (obj) => this.visitNodeSpecific(obj, nodeCallBacks, nodeSpecificCallBacks));
10109
10169
  }
10110
- return mapper(value);
10111
10170
  }
10112
- return value;
10113
10171
  }
10114
10172
  };
10115
10173
  /*! Bundled license information:
package/lib/index.d.ts CHANGED
@@ -10,4 +10,4 @@ export * from './parser-builder/ruleDefTypes';
10
10
  export * from './utils';
11
11
  export * from './CoreFactory';
12
12
  export * from './nodeTypings';
13
- export * from './Transformer';
13
+ export * from './Transformers';
package/lib/index.js CHANGED
@@ -15,5 +15,5 @@ export * from './parser-builder/ruleDefTypes';
15
15
  export * from './utils';
16
16
  export * from './CoreFactory';
17
17
  export * from './nodeTypings';
18
- export * from './Transformer';
18
+ export * from './Transformers';
19
19
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,6BAA6B;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,uBAAuB;AACvB,cAAc,8BAA8B,CAAC;AAC7C,wBAAwB;AACxB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,uBAAuB;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC","sourcesContent":["// Export generator builder\nexport * from './generator-builder/builderTypes';\nexport * from './generator-builder/generatorBuilder';\nexport * from './generator-builder/generatorTypes';\n// Export Indirection Builder\nexport * from './indirection-builder/helpers';\nexport * from './indirection-builder/IndirBuilder';\n// Export lexer builder\nexport * from './lexer-builder/LexerBuilder';\n// Export parser builder\nexport * from './parser-builder/builderTypes';\nexport * from './parser-builder/parserBuilder';\nexport * from './parser-builder/ruleDefTypes';\n// Export general types\nexport * from './utils';\nexport * from './CoreFactory';\nexport * from './nodeTypings';\nexport * from './Transformer';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,6BAA6B;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,uBAAuB;AACvB,cAAc,8BAA8B,CAAC;AAC7C,wBAAwB;AACxB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,uBAAuB;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC","sourcesContent":["// Export generator builder\nexport * from './generator-builder/builderTypes';\nexport * from './generator-builder/generatorBuilder';\nexport * from './generator-builder/generatorTypes';\n// Export Indirection Builder\nexport * from './indirection-builder/helpers';\nexport * from './indirection-builder/IndirBuilder';\n// Export lexer builder\nexport * from './lexer-builder/LexerBuilder';\n// Export parser builder\nexport * from './parser-builder/builderTypes';\nexport * from './parser-builder/parserBuilder';\nexport * from './parser-builder/ruleDefTypes';\n// Export general types\nexport * from './utils';\nexport * from './CoreFactory';\nexport * from './nodeTypings';\nexport * from './Transformers';\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@traqula/core",
3
3
  "type": "module",
4
- "version": "0.0.10",
4
+ "version": "0.0.12",
5
5
  "description": "Core components of Traqula",
6
6
  "lsd:module": true,
7
7
  "license": "MIT",
@@ -46,5 +46,5 @@
46
46
  "devDependencies": {
47
47
  "@chevrotain/types": "^11.0.3"
48
48
  },
49
- "gitHead": "94b444f4b1a6904fa4e8979f023a119a48ee4a1d"
49
+ "gitHead": "3517d5a5223c64dc61184b5f603f6d98c12bd166"
50
50
  }
@@ -1,26 +0,0 @@
1
- import type { SubTyped } from './CoreFactory';
2
- import type { Node } from './nodeTypings';
3
- type MapNodeTypeToImpls<Nodes extends Node> = {
4
- [Node in Nodes as Node['type']]: Node;
5
- };
6
- type MapNodeSubTypeToImpls<Nodes extends Node & {
7
- subType: string;
8
- }> = {
9
- [Node in Nodes as Node['subType']]: Node;
10
- };
11
- export type AlterNodeOutput<RecursiveObject extends object, Input, Out> = {
12
- [Key in keyof RecursiveObject]: RecursiveObject[Key] extends object ? (AlterNodeOutput<RecursiveObject[Key], Input, Out> extends Input ? Out : AlterNodeOutput<RecursiveObject[Key], Input, Out>) : RecursiveObject[Key];
13
- };
14
- export declare class Transformer<Nodes extends Node, NodeMapping extends MapNodeTypeToImpls<Nodes> & Record<string, unknown> = MapNodeTypeToImpls<Nodes>> {
15
- transformNode<Input extends object, TypeFilter extends keyof NodeMapping, Out>(curObject: Input, searchType: TypeFilter, patch: (current: NodeMapping[TypeFilter]) => Out): AlterNodeOutput<Input, NodeMapping[TypeFilter], Out>;
16
- transformNodeSpecific<Input extends object, TypeFilter extends keyof NodeMapping, SpecificType extends keyof SpecificNodes, Out, SpecificNodes = NodeMapping[TypeFilter] extends Node & {
17
- subType: string;
18
- } ? MapNodeSubTypeToImpls<NodeMapping[TypeFilter]> : never>(curObject: Input, searchType: TypeFilter, searchSubType: SpecificType, patch: (current: SpecificNodes[SpecificType]) => Out): AlterNodeOutput<Input, SubTyped<TypeFilter, SpecificType>, Out>;
19
- visitObjects(curObject: object, visitor: (current: object) => void): void;
20
- visitNode<Input extends object, TypeFilter extends keyof NodeMapping>(curObject: Input, searchType: TypeFilter, visitor: (current: Readonly<NodeMapping[TypeFilter]>) => void): void;
21
- visitNodeSpecific<Input extends object, TypeFilter extends keyof NodeMapping, SpecificType extends keyof SpecificNodes, SpecificNodes = NodeMapping[TypeFilter] extends Node & {
22
- subType: string;
23
- } ? MapNodeSubTypeToImpls<NodeMapping[TypeFilter]> : never>(curObject: Input, searchType: TypeFilter, searchSubType: SpecificType, visitor: (current: Readonly<SpecificNodes[SpecificType]>) => void): void;
24
- private safeObjectVisit;
25
- }
26
- export {};
@@ -1,57 +0,0 @@
1
- export class Transformer {
2
- transformNode(curObject, searchType, patch) {
3
- const copy = { ...curObject };
4
- for (const [key, value] of Object.entries(copy)) {
5
- copy[key] =
6
- this.safeObjectVisit(value, obj => this.transformNode(obj, searchType, patch));
7
- }
8
- if (copy.type === searchType) {
9
- return patch(copy);
10
- }
11
- return copy;
12
- }
13
- transformNodeSpecific(curObject, searchType, searchSubType, patch) {
14
- const copy = { ...curObject };
15
- for (const [key, value] of Object.entries(copy)) {
16
- copy[key] =
17
- this.safeObjectVisit(value, obj => this.transformNodeSpecific(obj, searchType, searchSubType, patch));
18
- }
19
- if (copy.type === searchType && copy.subType === searchSubType) {
20
- return patch(copy);
21
- }
22
- return copy;
23
- }
24
- visitObjects(curObject, visitor) {
25
- for (const value of Object.values(curObject)) {
26
- this.safeObjectVisit(value, obj => this.visitObjects(obj, visitor));
27
- }
28
- }
29
- visitNode(curObject, searchType, visitor) {
30
- for (const value of Object.values(curObject)) {
31
- this.safeObjectVisit(value, obj => this.visitNode(obj, searchType, visitor));
32
- }
33
- if (curObject.type === searchType) {
34
- visitor(curObject);
35
- }
36
- }
37
- visitNodeSpecific(curObject, searchType, searchSubType, visitor) {
38
- for (const value of Object.values(curObject)) {
39
- this.safeObjectVisit(value, obj => this.visitNodeSpecific(obj, searchType, searchSubType, visitor));
40
- }
41
- const cast = curObject;
42
- if (cast.type === searchType && cast.subType === searchSubType) {
43
- visitor(curObject);
44
- }
45
- }
46
- safeObjectVisit(value, mapper) {
47
- if (value && typeof value === 'object') {
48
- // If you wonder why this is all so hard, this is the reason. We cannot lose the methods of our Array objects
49
- if (Array.isArray(value)) {
50
- return value.map(x => this.safeObjectVisit(x, mapper));
51
- }
52
- return mapper(value);
53
- }
54
- return value;
55
- }
56
- }
57
- //# sourceMappingURL=Transformer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Transformer.js","sourceRoot":"","sources":["Transformer.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,WAAW;IAIf,aAAa,CAClB,SAAgB,EAChB,UAAsB,EACtB,KAAgD;QAEhD,MAAM,IAAI,GAAuB,EAAE,GAAG,SAAS,EAAE,CAAC;QAClD,KAAK,MAAM,CAAE,GAAG,EAAE,KAAK,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAK,CAAC,GAAG,CAAC;gBACnC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAa,KAAK,CAA2B,IAAI,CAAC,CAAC;QACrD,CAAC;QACD,OAAa,IAAI,CAAC;IACpB,CAAC;IAEM,qBAAqB,CAQ1B,SAAgB,EAChB,UAAsB,EACtB,aAA2B,EAC3B,KAAoD;QAEpD,MAAM,IAAI,GAA0C,EAAE,GAAG,SAAS,EAAE,CAAC;QACrE,KAAK,MAAM,CAAE,GAAG,EAAE,KAAK,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAK,CAAC,GAAG,CAAC;gBACnC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1G,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YAC/D,OAAa,KAAK,CAA+B,IAAI,CAAC,CAAC;QACzD,CAAC;QACD,OAAa,IAAI,CAAC;IACpB,CAAC;IAEM,YAAY,CAAC,SAAiB,EAAE,OAAkC;QACvE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAEM,SAAS,CACd,SAAgB,EAChB,UAAsB,EACtB,OAA6D;QAE7D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,IAAyB,SAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxD,OAAO,CAA2B,SAAS,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEM,iBAAiB,CAOtB,SAAgB,EAChB,UAAsB,EACtB,aAA2B,EAC3B,OAAiE;QAEjE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,IAAI,GAA0C,SAAS,CAAC;QAC9D,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YAC/D,OAAO,CAA+B,SAAS,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAAc,EAAE,MAA6B;QACnE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,6GAA6G;YAC7G,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF","sourcesContent":["import type { SubTyped } from './CoreFactory';\nimport type { Node } from './nodeTypings';\n\ntype MapNodeTypeToImpls<Nodes extends Node> = {[Node in Nodes as Node['type']]: Node };\ntype MapNodeSubTypeToImpls<Nodes extends Node & { subType: string }> = {[Node in Nodes as Node['subType']]: Node };\n\nexport type AlterNodeOutput<RecursiveObject extends object, Input, Out>\n = {\n [Key in keyof RecursiveObject]: RecursiveObject[Key] extends object ?\n (AlterNodeOutput<RecursiveObject[Key], Input, Out> extends Input ?\n Out : AlterNodeOutput<RecursiveObject[Key], Input, Out>) :\n RecursiveObject[Key]\n };\n\nexport class Transformer<\n Nodes extends Node,\nNodeMapping extends MapNodeTypeToImpls<Nodes> & Record<string, unknown> = MapNodeTypeToImpls<Nodes>,\n> {\n public transformNode<Input extends object, TypeFilter extends keyof NodeMapping, Out>(\n curObject: Input,\n searchType: TypeFilter,\n patch: (current: NodeMapping[TypeFilter]) => Out,\n ): AlterNodeOutput<Input, NodeMapping[TypeFilter], Out> {\n const copy: { type?: unknown } = { ...curObject };\n for (const [ key, value ] of Object.entries(copy)) {\n (<Record<string, unknown>> copy)[key] =\n this.safeObjectVisit(value, obj => this.transformNode(obj, searchType, patch));\n }\n if (copy.type === searchType) {\n return <any> patch(<NodeMapping[TypeFilter]> copy);\n }\n return <any> copy;\n }\n\n public transformNodeSpecific<\n Input extends object,\nTypeFilter extends keyof NodeMapping,\nSpecificType extends keyof SpecificNodes,\nOut,\nSpecificNodes = NodeMapping[TypeFilter] extends Node & { subType: string } ?\n MapNodeSubTypeToImpls<NodeMapping[TypeFilter]> : never,\n>(\n curObject: Input,\n searchType: TypeFilter,\n searchSubType: SpecificType,\n patch: (current: SpecificNodes[SpecificType]) => Out,\n ): AlterNodeOutput<Input, SubTyped<TypeFilter, SpecificType>, Out> {\n const copy: { type?: unknown; subType?: unknown } = { ...curObject };\n for (const [ key, value ] of Object.entries(copy)) {\n (<Record<string, unknown>> copy)[key] =\n this.safeObjectVisit(value, obj => this.transformNodeSpecific(obj, searchType, searchSubType, patch));\n }\n if (copy.type === searchType && copy.subType === searchSubType) {\n return <any> patch(<SpecificNodes[SpecificType]> copy);\n }\n return <any> copy;\n }\n\n public visitObjects(curObject: object, visitor: (current: object) => void): void {\n for (const value of Object.values(curObject)) {\n this.safeObjectVisit(value, obj => this.visitObjects(obj, visitor));\n }\n }\n\n public visitNode<Input extends object, TypeFilter extends keyof NodeMapping>(\n curObject: Input,\n searchType: TypeFilter,\n visitor: (current: Readonly<NodeMapping[TypeFilter]>) => void,\n ): void {\n for (const value of Object.values(curObject)) {\n this.safeObjectVisit(value, obj => this.visitNode(obj, searchType, visitor));\n }\n if ((<{ type?: unknown }>curObject).type === searchType) {\n visitor(<NodeMapping[TypeFilter]> curObject);\n }\n }\n\n public visitNodeSpecific<\n Input extends object,\nTypeFilter extends keyof NodeMapping,\nSpecificType extends keyof SpecificNodes,\nSpecificNodes = NodeMapping[TypeFilter] extends Node & { subType: string } ?\n MapNodeSubTypeToImpls<NodeMapping[TypeFilter]> : never,\n >(\n curObject: Input,\n searchType: TypeFilter,\n searchSubType: SpecificType,\n visitor: (current: Readonly<SpecificNodes[SpecificType]>) => void,\n ): void {\n for (const value of Object.values(curObject)) {\n this.safeObjectVisit(value, obj => this.visitNodeSpecific(obj, searchType, searchSubType, visitor));\n }\n const cast = <{ type?: unknown; subType?: unknown }>curObject;\n if (cast.type === searchType && cast.subType === searchSubType) {\n visitor(<SpecificNodes[SpecificType]> curObject);\n }\n }\n\n private safeObjectVisit(value: unknown, mapper: (some: object) => any): any {\n if (value && typeof value === 'object') {\n // If you wonder why this is all so hard, this is the reason. We cannot lose the methods of our Array objects\n if (Array.isArray(value)) {\n return value.map(x => this.safeObjectVisit(x, mapper));\n }\n return mapper(value);\n }\n return value;\n }\n}\n"]}