jtlt 0.2.0 → 0.4.0

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 (70) hide show
  1. package/CHANGES.md +27 -0
  2. package/README.md +61 -164
  3. package/demo/calltemplate-params-demo.js +138 -0
  4. package/demo/codemirror.esm.js +28242 -0
  5. package/demo/codemirror.js +94 -0
  6. package/demo/index.css +7 -0
  7. package/demo/index.html +28 -0
  8. package/demo/index.js +210 -0
  9. package/demo/vendor/jamilih/dist/jml.mjs +2341 -0
  10. package/demo/vendor/jhtml/src/SAJJ/SAJJ.ObjectArrayDelegator.js +356 -0
  11. package/demo/vendor/jhtml/src/SAJJ/SAJJ.Stringifier.js +186 -0
  12. package/demo/vendor/jhtml/src/SAJJ/SAJJ.js +746 -0
  13. package/demo/vendor/jhtml/src/SAJJ/testing/SAJJ.html +33 -0
  14. package/demo/vendor/jhtml/src/SAJJ/testing/SAJJ.testing.js +25 -0
  15. package/demo/vendor/jhtml/src/jhtml-browser.js +5 -0
  16. package/demo/vendor/jhtml/src/jhtml-node.cts +3 -0
  17. package/demo/vendor/jhtml/src/jhtml-node.js +8 -0
  18. package/demo/vendor/jhtml/src/jhtml-node.mts +1 -0
  19. package/demo/vendor/jhtml/src/jhtml.cts +3 -0
  20. package/demo/vendor/jhtml/src/jhtml.js +602 -0
  21. package/demo/vendor/jhtml/src/jhtml.mts +1 -0
  22. package/demo/vendor/jsonpath-plus/dist/index-browser-esm.js +2158 -0
  23. package/demo/vendor/simple-get-json/dist/index-es.js +151 -0
  24. package/demo/xpath2-placeholder.js +1 -0
  25. package/dist/AbstractJoiningTransformer.d.ts +83 -9
  26. package/dist/AbstractJoiningTransformer.d.ts.map +1 -1
  27. package/dist/DOMJoiningTransformer.d.ts +85 -25
  28. package/dist/DOMJoiningTransformer.d.ts.map +1 -1
  29. package/dist/JSONJoiningTransformer.d.ts +159 -51
  30. package/dist/JSONJoiningTransformer.d.ts.map +1 -1
  31. package/dist/JSONPathTransformer.d.ts +37 -38
  32. package/dist/JSONPathTransformer.d.ts.map +1 -1
  33. package/dist/JSONPathTransformerContext.d.ts +334 -124
  34. package/dist/JSONPathTransformerContext.d.ts.map +1 -1
  35. package/dist/StringJoiningTransformer.d.ts +132 -41
  36. package/dist/StringJoiningTransformer.d.ts.map +1 -1
  37. package/dist/XPathTransformer.d.ts +35 -20
  38. package/dist/XPathTransformer.d.ts.map +1 -1
  39. package/dist/XPathTransformerContext.d.ts +281 -105
  40. package/dist/XPathTransformerContext.d.ts.map +1 -1
  41. package/dist/index-browser.d.ts +4 -0
  42. package/dist/index-browser.d.ts.map +1 -0
  43. package/dist/index-node.d.ts +4 -0
  44. package/dist/index-node.d.ts.map +1 -0
  45. package/dist/index.d.ts +330 -57
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/types.d.ts +204 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/docs/API.expanded.md +172 -5
  50. package/docs/API.md +92 -2
  51. package/docs/TO-DO.md +168 -0
  52. package/docs/calltemplate-params.md +251 -0
  53. package/eslint.config.js +11 -5
  54. package/package.json +35 -9
  55. package/pnpm-workspace.yaml +1 -0
  56. package/rollup.config.js +13 -0
  57. package/src/AbstractJoiningTransformer.js +54 -15
  58. package/src/DOMJoiningTransformer.js +275 -28
  59. package/src/JSONJoiningTransformer.js +351 -70
  60. package/src/JSONPathTransformer.js +48 -30
  61. package/src/JSONPathTransformerContext.js +729 -107
  62. package/src/StringJoiningTransformer.js +311 -57
  63. package/src/XPathTransformer.js +27 -12
  64. package/src/XPathTransformerContext.js +928 -99
  65. package/src/index-browser.js +5 -0
  66. package/src/index-node.js +7 -0
  67. package/src/index.js +502 -98
  68. package/tsconfig.json +5 -2
  69. package/typings/xpath2-js.d.ts +40 -1
  70. package/src/types/xpath2-js.d.ts +0 -2
@@ -0,0 +1,356 @@
1
+ import SAJJ from './SAJJ.js';
2
+
3
+ /* eslint-disable jsdoc/reject-any-type -- Arbitrary */
4
+ /**
5
+ * @typedef {any} AnyDelegated
6
+ */
7
+ /* eslint-enable jsdoc/reject-any-type -- Arbitrary */
8
+
9
+ /**
10
+ * @abstract
11
+ * @class
12
+ * @todo Might add an add() method which defines how to combine result values
13
+ * (so as to allow for other means besides string concatenation)
14
+ */
15
+ class ObjectArrayDelegator extends SAJJ {
16
+ /* eslint-disable jsdoc/require-returns-check -- Abstract */
17
+ /**
18
+ * @returns {AnyDelegated}
19
+ */
20
+ objectKeyValueJoinerHandler () {
21
+ throw new Error('Abstract');
22
+ }
23
+ /**
24
+ * @param {object} value
25
+ * @param {object|undefined} parentObject
26
+ * @param {string|undefined} parentKey
27
+ * @param {boolean|undefined} parentObjectArrayBool
28
+ * @returns {AnyDelegated}
29
+ */
30
+ beginObjectHandler (
31
+ // eslint-disable-next-line no-unused-vars -- Not used here
32
+ value, parentObject, parentKey, parentObjectArrayBool
33
+ ) {
34
+ throw new Error('Abstract');
35
+ }
36
+ /**
37
+ * @param {object} value
38
+ * @param {object|undefined} parentObject
39
+ * @param {string|undefined} parentKey
40
+ * @param {boolean|undefined} parentObjectArrayBool
41
+ * @returns {AnyDelegated}
42
+ */
43
+ endObjectHandler (
44
+ // eslint-disable-next-line no-unused-vars -- Not used here
45
+ value, parentObject, parentKey, parentObjectArrayBool
46
+ ) {
47
+ throw new Error('Abstract');
48
+ }
49
+
50
+ /**
51
+ * @param {AnyDelegated[]} value
52
+ * @param {object|undefined} parentObject
53
+ * @param {string|undefined} parentKey
54
+ * @param {boolean|undefined} parentObjectArrayBool
55
+ * @param {number} arrLength
56
+ * @returns {AnyDelegated}
57
+ */
58
+ beginArrayHandler (
59
+ // eslint-disable-next-line no-unused-vars -- Not used here
60
+ value, parentObject, parentKey, parentObjectArrayBool, arrLength
61
+ ) {
62
+ throw new Error('Abstract');
63
+ }
64
+
65
+ /**
66
+ * @param {AnyDelegated[]} value
67
+ * @param {object|undefined} parentObject
68
+ * @param {string|undefined} parentKey
69
+ * @param {boolean|undefined} parentObjectArrayBool
70
+ * @param {number} arrLength
71
+ * @returns {AnyDelegated}
72
+ */
73
+ endArrayHandler (
74
+ // eslint-disable-next-line no-unused-vars -- Not used here
75
+ value, parentObject, parentKey, parentObjectArrayBool, arrLength
76
+ ) {
77
+ throw new Error('Abstract');
78
+ }
79
+ /* eslint-enable jsdoc/require-returns-check -- Abstract */
80
+
81
+ // It is probably not necessary to override the defaults for the following
82
+ // two methods and perhaps not any of the others either
83
+ /**
84
+ * @param {AnyDelegated} value
85
+ * @param {object|undefined} parentObject
86
+ * @param {string|undefined} parentKey
87
+ * @param {boolean|undefined} parentObjectArrayBool
88
+ * @returns {string}
89
+ */
90
+ objectHandler (value, parentObject, parentKey, parentObjectArrayBool) {
91
+ const ret = this.beginObjectHandler(
92
+ value, parentObject, parentKey, parentObjectArrayBool
93
+ ),
94
+ keyVals = [];
95
+ if (this.iterateObjects) {
96
+ let i = 0;
97
+ if (this.iterateObjectPrototype) {
98
+ // eslint-disable-next-line @stylistic/max-len -- Long
99
+ // eslint-disable-next-line guard-for-in -- Deliberately iterating prototype
100
+ for (const key in value) {
101
+ this.currentKey = key;
102
+ this.currentObject = value[key];
103
+ keyVals.push(
104
+ this.keyValueHandler(
105
+ value[key], key, value, parentKey, parentObjectArrayBool, false, i
106
+ )
107
+ );
108
+ i++;
109
+ }
110
+ } else {
111
+ for (const key in value) {
112
+ if (Object.hasOwn(value, key)) {
113
+ this.currentKey = key;
114
+ this.currentObject = value[key];
115
+ keyVals.push(
116
+ this.keyValueHandler(
117
+ value[key], key, value, parentKey,
118
+ parentObjectArrayBool, false, i
119
+ )
120
+ );
121
+ i++;
122
+ }
123
+ }
124
+ }
125
+ }
126
+ return ret + keyVals.join(
127
+ this.objectKeyValueJoinerHandler()
128
+ ) + this.endObjectHandler(
129
+ value, parentObject, parentKey, parentObjectArrayBool
130
+ );
131
+ }
132
+
133
+ /**
134
+ * @param {AnyDelegated[]} value
135
+ * @param {object|undefined} parentObject
136
+ * @param {string|undefined} parentKey
137
+ * @param {boolean|undefined} parentObjectArrayBool
138
+ * @returns {string}
139
+ */
140
+ arrayHandler (value, parentObject, parentKey, parentObjectArrayBool) {
141
+ const arrLength = value.length,
142
+ ret = this.beginArrayHandler(
143
+ value, parentObject, parentKey, parentObjectArrayBool, arrLength
144
+ ),
145
+ keyVals = [];
146
+
147
+ if (this.iterateArrays) {
148
+ if (this.iterateArrayPrototype) {
149
+ // eslint-disable-next-line @stylistic/max-len -- Long
150
+ // eslint-disable-next-line guard-for-in -- Deliberately iterating prototype
151
+ for (const key in value) {
152
+ this.currentKey = key;
153
+ this.currentObject = value[key];
154
+ // Ambiguous about whether array value is being iterated or
155
+ // array object value
156
+ keyVals.push(
157
+ this.keyValueHandler(
158
+ value[key], key, value, parentKey, parentObjectArrayBool, true
159
+ )
160
+ );
161
+ }
162
+ } else {
163
+ const arrl = value.length;
164
+ for (let key = 0; key < arrl; key++) {
165
+ this.currentKey = key;
166
+ this.currentObject = value[key];
167
+ keyVals.push(
168
+ this.keyValueHandler(
169
+ value[key], key, value, parentKey, parentObjectArrayBool, true
170
+ )
171
+ );
172
+ }
173
+ }
174
+ }
175
+ return ret + keyVals.join(
176
+ this.arrayKeyValueJoinerHandler()
177
+ ) + this.endArrayHandler(
178
+ value, parentObject, parentKey, parentObjectArrayBool, arrLength
179
+ );
180
+ }
181
+
182
+ /**
183
+ * Can override to avoid delegating to separate array/object handlers; see
184
+ * `isArrayType` notes for a means to treat `objectHandler`/`arrayHandler`
185
+ * as the same; overridden optionally in constructor by
186
+ * `keyValueDistinguishedHandler`.
187
+ * @param {object} value
188
+ * @param {string|number} key
189
+ * @param {object|undefined} parentObject
190
+ * @param {string|undefined} parentKey
191
+ * @param {boolean|undefined} parentObjectArrayBool
192
+ * @param {boolean} arrayBool
193
+ * @param {number} [iterCt]
194
+ * @returns {string}
195
+ */
196
+ keyValueHandler (
197
+ value, key, parentObject, parentKey,
198
+ parentObjectArrayBool, arrayBool, iterCt
199
+ ) {
200
+ const objectRet = this.keyHandler(
201
+ key, parentObject, parentKey, parentObjectArrayBool, arrayBool, iterCt
202
+ );
203
+ if (arrayBool) {
204
+ return this.arrayKeyValueHandler(
205
+ value, key, parentObject, parentKey, parentObjectArrayBool
206
+ );
207
+ }
208
+ return objectRet + this.objectKeyValueHandler(
209
+ value, key, parentObject, parentKey, parentObjectArrayBool, iterCt
210
+ );
211
+ }
212
+
213
+ /**
214
+ * @param {AnyDelegated} value
215
+ * @param {string|number} key
216
+ * @param {object|undefined} parentObject
217
+ * @param {string|undefined} parentKey
218
+ * @param {boolean|undefined} parentObjectArrayBool
219
+ * @returns {AnyDelegated}
220
+ */
221
+ arrayKeyValueHandler (
222
+ value, key, parentObject, parentKey, parentObjectArrayBool
223
+ ) {
224
+ return this.delegateHandlersByType(
225
+ value, parentObject, parentKey, parentObjectArrayBool
226
+ );
227
+ }
228
+
229
+ /**
230
+ * @param {AnyDelegated} value
231
+ * @param {string|number} key
232
+ * @param {object|undefined} parentObject
233
+ * @param {string|undefined} parentKey
234
+ * @param {boolean|undefined} parentObjectArrayBool
235
+ * @param {number} [iterCt]
236
+ * @returns {AnyDelegated}
237
+ */
238
+ objectKeyValueHandler (
239
+ value, key, parentObject, parentKey, parentObjectArrayBool,
240
+ // eslint-disable-next-line no-unused-vars -- Signature
241
+ iterCt
242
+ ) {
243
+ return this.delegateHandlersByType(
244
+ value, parentObject, parentKey, parentObjectArrayBool
245
+ );
246
+ }
247
+
248
+ // OPTIONAL DISTINGUISHING OF KEY AND VALUE HANDLERS
249
+
250
+ /**
251
+ * Constructor may use this to override `keyValueHandler`.
252
+ * @param {AnyDelegated} value
253
+ * @param {string} key
254
+ * @param {object|undefined} parentObject
255
+ * @param {string|undefined} parentKey
256
+ * @param {boolean|undefined} parentObjectArrayBool
257
+ * @param {boolean} arrayBool
258
+ * @param {number} iterCt
259
+ * @returns {string}
260
+ */
261
+ keyValueDistinguishedHandler (
262
+ value, key, parentObject, parentKey,
263
+ parentObjectArrayBool, arrayBool, iterCt
264
+ ) {
265
+ const ret = this.keyHandler(
266
+ key, parentObject, parentKey, parentObjectArrayBool, arrayBool, iterCt
267
+ );
268
+ return ret + this.valueHandler(
269
+ value, key, parentObject, parentKey,
270
+ parentObjectArrayBool, arrayBool, iterCt
271
+ );
272
+ }
273
+
274
+ /**
275
+ * @param {string|number} key
276
+ * @param {object|undefined} parentObject
277
+ * @param {string|undefined} parentKey
278
+ * @param {boolean|undefined} parentObjectArrayBool
279
+ * @param {boolean} arrayBool
280
+ * @param {number} [iterCt]
281
+ * @returns {AnyDelegated}
282
+ */
283
+ keyHandler (
284
+ key, parentObject, parentKey, parentObjectArrayBool, arrayBool, iterCt
285
+ ) {
286
+ if (arrayBool) {
287
+ return this.arrayKeyHandler(
288
+ key, parentObject, parentKey, parentObjectArrayBool
289
+ );
290
+ }
291
+ return this.objectKeyHandler(
292
+ key, parentObject, parentKey, parentObjectArrayBool, iterCt
293
+ );
294
+ }
295
+ /**
296
+ * @param {AnyDelegated} value
297
+ * @param {string} key
298
+ * @param {object|undefined} parentObject
299
+ * @param {string|undefined} parentKey
300
+ * @param {boolean|undefined} parentObjectArrayBool
301
+ * @param {boolean} arrayBool
302
+ * @param {number} iterCt
303
+ * @returns {AnyDelegated}
304
+ */
305
+ valueHandler (
306
+ value, key, parentObject, parentKey,
307
+ parentObjectArrayBool, arrayBool,
308
+ iterCt
309
+ ) {
310
+ if (arrayBool) {
311
+ return this.arrayValueHandler(
312
+ value, key, parentObject, parentKey, parentObjectArrayBool
313
+ );
314
+ }
315
+ return this.objectValueHandler(
316
+ value, key, parentObject, parentKey, parentObjectArrayBool, iterCt
317
+ );
318
+ }
319
+
320
+ /**
321
+ * @param {AnyDelegated} value
322
+ * @param {string} key
323
+ * @param {object|undefined} parentObject
324
+ * @param {string|undefined} parentKey
325
+ * @param {boolean|undefined} parentObjectArrayBool
326
+ * @param {number} [iterCt]
327
+ * @returns {AnyDelegated}
328
+ */
329
+ objectValueHandler (
330
+ value, key, parentObject, parentKey, parentObjectArrayBool,
331
+ // eslint-disable-next-line no-unused-vars -- Placeholder?
332
+ iterCt
333
+ ) {
334
+ return this.delegateHandlersByType(
335
+ value, parentObject, parentKey, parentObjectArrayBool
336
+ );
337
+ }
338
+
339
+ /**
340
+ * @param {AnyDelegated[]} value
341
+ * @param {string} key
342
+ * @param {object|undefined} parentObject
343
+ * @param {string|undefined} parentKey
344
+ * @param {boolean|undefined} parentObjectArrayBool
345
+ * @returns {AnyDelegated}
346
+ */
347
+ arrayValueHandler (
348
+ value, key, parentObject, parentKey, parentObjectArrayBool
349
+ ) {
350
+ return this.delegateHandlersByType(
351
+ value, parentObject, parentKey, parentObjectArrayBool
352
+ );
353
+ }
354
+ }
355
+
356
+ export default ObjectArrayDelegator;
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Provides JSON.stringifier()-like functionality (no replacer or space
3
+ * arguments currently, however).
4
+ * This class uses the abstract `ObjectArrayDelegator` for
5
+ * object/array delegating so the stringification can occur solely on
6
+ * the terminal methods here.
7
+ * @todo Could implement our own stringifier for strings rather than using
8
+ * `JSON.stringify`
9
+ */
10
+ import ObjectArrayDelegator from './SAJJ.ObjectArrayDelegator.js';
11
+
12
+ /**
13
+ *
14
+ */
15
+ export default class Stringifier extends ObjectArrayDelegator {
16
+ // JSON terminal handler methods
17
+
18
+ // These four methods can be overridden without affecting the logic of
19
+ // the objectHandler and arrayHandler to utilize reporting of the
20
+ // object as a whole
21
+ /**
22
+ * @returns {string}
23
+ */
24
+ beginObjectHandler (
25
+ /* value, parentObject, parentKey, parentObjectArrayBool */
26
+ ) {
27
+ return '{';
28
+ }
29
+ /**
30
+ * @returns {string}
31
+ */
32
+ endObjectHandler (
33
+ /* value, parentObject, parentKey, parentObjectArrayBool */
34
+ ) {
35
+ return '}';
36
+ }
37
+ /**
38
+ * @returns {string}
39
+ */
40
+ beginArrayHandler (
41
+ /* value, parentObject, parentKey, parentObjectArrayBool */
42
+ ) {
43
+ return '[';
44
+ }
45
+ /**
46
+ * @returns {string}
47
+ */
48
+ endArrayHandler (
49
+ /* value, parentObject, parentKey, parentObjectArrayBool */
50
+ ) {
51
+ return ']';
52
+ }
53
+
54
+ // JSON terminal key handler methods
55
+
56
+ /**
57
+ * @param {string} key
58
+ * @returns {string}
59
+ */
60
+ objectKeyHandler (
61
+ key /* , parentObject, parentKey, parentObjectArrayBool, iterCt */
62
+ ) {
63
+ return '"' +
64
+ key.replaceAll('\\', '\\\\').replaceAll('"', String.raw`\"`) + '":';
65
+ }
66
+
67
+ /**
68
+ * @returns {string}
69
+ */
70
+ arrayKeyHandler (/* key, parentObject, parentKey, parentObjectArrayBool */) {
71
+ return '';
72
+ }
73
+
74
+ // JSON terminal joiner handler methods
75
+
76
+ /**
77
+ * @returns {string}
78
+ */
79
+ objectKeyValueJoinerHandler () {
80
+ return ',';
81
+ }
82
+ /**
83
+ * @returns {string}
84
+ */
85
+ arrayKeyValueJoinerHandler () {
86
+ return ',';
87
+ }
88
+
89
+ // JSON terminal primitive handler methods
90
+
91
+ /**
92
+ * @returns {string}
93
+ */
94
+ nullHandler (/* parentObject, parentKey, parentObjectArrayBool */) {
95
+ return 'null';
96
+ }
97
+
98
+ /**
99
+ * @param {boolean} value
100
+ * @returns {string}
101
+ */
102
+ // eslint-disable-next-line @stylistic/max-len -- Long
103
+ // eslint-disable-next-line unicorn/prefer-native-coercion-functions -- Clearer
104
+ booleanHandler (
105
+ value /* , parentObject, parentKey, parentObjectArrayBool */
106
+ ) {
107
+ return String(value);
108
+ }
109
+
110
+ /**
111
+ * @param {number} value
112
+ * @returns {string}
113
+ */
114
+ // eslint-disable-next-line @stylistic/max-len -- Long
115
+ // eslint-disable-next-line unicorn/prefer-native-coercion-functions -- Clearer
116
+ numberHandler (value /* , parentObject, parentKey, parentObjectArrayBool */) {
117
+ return String(value);
118
+ }
119
+
120
+ /**
121
+ * @param {string} value
122
+ * @returns {string}
123
+ */
124
+ stringHandler (value /* , parentObject, parentKey, parentObjectArrayBool */) {
125
+ return JSON.stringify(value);
126
+ }
127
+
128
+ /* eslint-disable jsdoc/reject-function-type -- Generic */
129
+ /**
130
+ * @typedef {Function} GenericFunction
131
+ */
132
+ /* eslint-enable jsdoc/reject-function-type -- Generic */
133
+
134
+ // JavaScript-only (non-JSON) (terminal) handler methods (not used or
135
+ // required for JSON mode)
136
+ /**
137
+ * @param {GenericFunction} value
138
+ * @returns {string}
139
+ */
140
+ functionHandler (
141
+ value /* , parentObject, parentKey, parentObjectArrayBool */
142
+ ) {
143
+ return value.toString(); // May not be supported everywhere
144
+ }
145
+
146
+ /**
147
+ * @returns {string}
148
+ */
149
+ undefinedHandler (/* parentObject, parentKey, parentObjectArrayBool */) {
150
+ return 'undefined';
151
+ }
152
+
153
+ /**
154
+ * @param {bigint} value
155
+ * @returns {string}
156
+ */
157
+ bigintHandler (
158
+ value /* , parentObject, parentKey, parentObjectArrayBool */
159
+ ) {
160
+ return String(value) + 'n';
161
+ }
162
+
163
+ /**
164
+ * @param {symbol} value
165
+ * @returns {string}
166
+ */
167
+ // eslint-disable-next-line @stylistic/max-len -- Long
168
+ // eslint-disable-next-line unicorn/prefer-native-coercion-functions -- Clearer
169
+ symbolHandler (
170
+ value /* , parentObject, parentKey, parentObjectArrayBool */
171
+ ) {
172
+ return String(value);
173
+ }
174
+
175
+ /**
176
+ * @param {number} value
177
+ * @returns {string}
178
+ */
179
+ // eslint-disable-next-line @stylistic/max-len -- Long
180
+ // eslint-disable-next-line unicorn/prefer-native-coercion-functions -- Clearer
181
+ nonfiniteNumberHandler (
182
+ value /* , parentObject, parentKey, parentObjectArrayBool */
183
+ ) {
184
+ return String(value);
185
+ }
186
+ }