jtlt 0.20.0 → 0.22.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.
package/CHANGES.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # jtlt CHANGES
2
2
 
3
+ ## 0.22.0
4
+
5
+ BREAKING: Changes extension system to provide extensions with the full argument rather than assigning a special meaning to `select` and passing only its value.
6
+
7
+ - feat: extension-call declarative operation nodes — any operation-node key
8
+ not otherwise recognized, e.g. `{$greet: {select: '$.path'}}`, calls a
9
+ named function of that same name from `config.extensions` (`ctx[name]
10
+ (argObject)`, the argument object passed through entirely unresolved —
11
+ no key, including a conventional `select`, is interpreted by jtlt itself;
12
+ the extension reads whatever it needs via `this.get(...)`, `this.valueOf
13
+ (...)`, etc. — the argument is an object, matching `$indexedDB`'s own
14
+ convention, so a call can carry any number of named fields, e.g. `{select,
15
+ db, store}`). Restricted at runtime to names actually present in
16
+ `config.extensions` (tracked via a new `context._extensionNames` `Set`,
17
+ populated by `applyExtensions`): a declarative `behavior` — e.g. an
18
+ admin-authored, untrusted template — can never invoke an arbitrary
19
+ built-in context method (`element`, `indexedDB`, etc.) by name this way.
20
+ Like `$renderDefault`, the extension itself is responsible for inserting
21
+ any output (e.g. via `this.appendOutput(...)`); the interpreter never does
22
+ so on its behalf. Trade-off: because any not-otherwise-recognized
23
+ `$`-prefixed key becomes a live extension name, a future jtlt release
24
+ adding a new built-in operation could collide with an extension name a
25
+ consumer already uses — consumers documenting their extension names
26
+ ([jtlt's wiki](https://github.com/brettz9/jtlt/wiki/Extension-registry) is
27
+ reserved for this purpose) are encouraged to also list jtlt's own reserved
28
+ op keys as names to avoid.
29
+
30
+ ## 0.21.0
31
+
32
+ - feat: extension-call declarative operation nodes — any operation-node key
33
+ not otherwise recognized, e.g. `{$greet: {select?: '$.path'}}`, calls a
34
+ named function of that same name from `config.extensions` (`ctx[name]
35
+ (value)`, `value` from `select`, or the current `$` context data when
36
+ `select` is omitted — the argument is an object, matching `$indexedDB`'s
37
+ own convention, leaving room for more named fields later). Restricted at
38
+ runtime to names actually present in `config.extensions` (tracked via a
39
+ new `context._extensionNames` `Set`, populated by `applyExtensions`): a
40
+ declarative `behavior` — e.g. an admin-authored, untrusted template — can
41
+ never invoke an arbitrary built-in context method (`element`, `indexedDB`,
42
+ etc.) by name this way. Like `$renderDefault`, the extension itself is
43
+ responsible for inserting any output (e.g. via `this.appendOutput(...)`);
44
+ the interpreter never does so on its behalf. Trade-off: because any
45
+ not-otherwise-recognized `$`-prefixed key becomes a live extension name, a
46
+ future jtlt release adding a new built-in operation could collide with an
47
+ extension name a consumer already uses — consumers documenting their
48
+ extension names ([jtlt's wiki](https://github.com/brettz9/jtlt/wiki/Extension-registry) is reserved for this purpose)
49
+ are encouraged to also list jtlt's own reserved op keys as names to avoid.
50
+ - fix: `_autoStart`'s `transform()` call discarded its returned promise
51
+ entirely, so a rejection (e.g. a template throwing) became a silently
52
+ swallowed unhandled rejection instead of surfacing anywhere — `await
53
+ jtlt({...})` would hang forever rather than reject. Added a new `error`
54
+ config option (alongside the existing `success`) and wired a `.catch()` in
55
+ `_autoStart` that calls it (or falls back to `console.error`); the `jtlt()`
56
+ convenience function now rejects its promise via `error` on failure
57
+ instead of hanging.
58
+
3
59
  ## 0.20.0
4
60
 
5
61
  - fix: `ObjectCallback` / `ArrayCallback` / `SimpleCallback` (in the String/
@@ -2,6 +2,16 @@
2
2
  * Merges `extensions` onto a template context instance so templates can
3
3
  * invoke them as `this.myHelper()`. Shared by JSONPathTransformerContext
4
4
  * and XPathTransformerContext.
5
+ *
6
+ * Also records the registered names on `context._extensionNames` (a `Set`,
7
+ * merged with any already present from an earlier call) — consulted by the
8
+ * declarative interpreter's extension-call nodes (e.g. `{$greet: {select:
9
+ * '$.path'}}` — see `jsonTemplate.js`) so a declarative `behavior` can only
10
+ * ever invoke names that were actually supplied here, never an
11
+ * arbitrary/built-in context method (`element`, `indexedDB`, etc.) by name.
12
+ * Untrusted, admin-authored declarative source is exactly why this
13
+ * distinction matters — see ROUTE-OVERRIDES-PLAN.md's (idb-manager)
14
+ * "declarative subset" for the threat model this is part of.
5
15
  * @param {object} context - The context instance to extend
6
16
  * @param {Record<string, unknown>} extensions - Extra methods/values
7
17
  * @returns {void}
@@ -1 +1 @@
1
- {"version":3,"file":"extendContext.d.ts","sourceRoot":"","sources":["../src/extendContext.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAE,OAAO,EAJrC,MAIqC,EAAE,UAAU,EAHjD,MAAM,CAAC,MAAM,EAAE,OAAO,CAG2B,GAF/C,IAAI,CAchB"}
1
+ {"version":3,"file":"extendContext.d.ts","sourceRoot":"","sources":["../src/extendContext.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAE,OAAO,EAJrC,MAIqC,EAAE,UAAU,EAHjD,MAAM,CAAC,MAAM,EAAE,OAAO,CAG2B,GAF/C,IAAI,CAmBhB"}
package/dist/index.d.ts CHANGED
@@ -137,6 +137,8 @@ export type JSONOperationNode = [{
137
137
  {
138
138
  $renderDefault: true;
139
139
  }
140
+ ] | [
141
+ Record<`$${string}`, Record<string, unknown>>
140
142
  ];
141
143
  export type JSONTemplateNode = string | JSONElementNode | JSONOperationNode;
142
144
  export type JoiningTransformerContract = {
@@ -183,6 +185,17 @@ export type BaseJTLTOptions<T, E extends boolean | undefined = false> = {
183
185
  * generic as `success<T>(result: T): void`.
184
186
  */
185
187
  success?: (result: ResultType<T, E>) => ResultType<T, E> | void;
188
+ /**
189
+ * `success`'s counterpart for
190
+ * the autostart path (`config.autostart` unset/`true`, the common case):
191
+ * a template that throws (directly, or via an awaited Promise it
192
+ * returned) calls this instead, if supplied — otherwise the failure is
193
+ * only surfaced via `console.error`, since `_autoStart` invokes
194
+ * `transform()` without a caller able to `await`/`catch` it directly.
195
+ * Not consulted for a `transform()` call made directly (its own return
196
+ * value/rejection is observable there instead).
197
+ */
198
+ error?: (err: unknown) => void;
186
199
  /**
187
200
  * A JSON
188
201
  * object or DOM document (XPath)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jsonTemplate.d.ts","sourceRoot":"","sources":["../src/jsonTemplate.js"],"names":[],"mappings":"AAyCG,YAAwC,QAAQ,GAAtC,MAAM,GAAC,SAAS,GAAC,WAAW,CAAU;AA0LhD,YAAuC,UAAU,GAAvC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAY;AA2EpD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAE,KAAK,EAHxB,OAAO,EAGiB,GAFtB;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,CA0BnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAE,KAAK,EAJhC,OAAO,EAIyB,EAAE,EAAC,MAAe,EAAC,AAH3D,CACA,EADQ;IAAC,MAAM,CAAC,EAAE,MAAM,GAAC,YAAY,CAAA;CAG2B,GAFtD;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,CAgB9C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAE,CAAC,EAH/B,OAG+B,GAF7B,CAAC,IAAI,OAAO,EAAE,CAI1B;AAqID;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAE,KAAK,EAN/B,OAAO,EAMwB,EAAE,EAAC,MAAe,EAAC,AAL1D,CACA,EADQ;IAAC,MAAM,CAAC,EAAE,MAAM,GAAC,YAAY,CAAA;CAK0B,GAJrD,CACR,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,KAC7C,OAAO,CAAC,IAAI,CAAC,CAYpB"}
1
+ {"version":3,"file":"jsonTemplate.d.ts","sourceRoot":"","sources":["../src/jsonTemplate.js"],"names":[],"mappings":"AAyEG,YAAwC,QAAQ,GAAtC,MAAM,GAAC,SAAS,GAAC,WAAW,CAAU;AAgNhD,YAAuC,UAAU,GAAvC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAY;AA2EpD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAE,KAAK,EAHxB,OAAO,EAGiB,GAFtB;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,CA0BnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAE,KAAK,EAJhC,OAAO,EAIyB,EAAE,EAAC,MAAe,EAAC,AAH3D,CACA,EADQ;IAAC,MAAM,CAAC,EAAE,MAAM,GAAC,YAAY,CAAA;CAG2B,GAFtD;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,CAgB9C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAE,CAAC,EAH/B,OAG+B,GAF7B,CAAC,IAAI,OAAO,EAAE,CAI1B;AA0JD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAE,KAAK,EAN/B,OAAO,EAMwB,EAAE,EAAC,MAAe,EAAC,AAL1D,CACA,EADQ;IAAC,MAAM,CAAC,EAAE,MAAM,GAAC,YAAY,CAAA;CAK0B,GAJrD,CACR,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,KAC7C,OAAO,CAAC,IAAI,CAAC,CAYpB"}
@@ -138,6 +138,7 @@ A node is one of:
138
138
  | `[{$variable: name, $select: sel}]` | `this.variable(name, sel)`, readable back later via a bare `$name` reference |
139
139
  | `[{$indexedDB: {db, store, options?}, $as?: name}, childNodes?]` | fetches rows; with `$as`, binds them via `this.variable(name, {value: rows})`; without it, swaps the data context (`$`) to the rows for `childNodes` |
140
140
  | `[{$renderDefault: true}]` | `this.appendOutput(await this.renderDefault())` (an `extensions.renderDefault` your config supplies) |
141
+ | `[{$name: {...}}]` (any key not otherwise recognized above) | an extension call: `await this[name](argObject)` — the argument object is passed through entirely unresolved (no key, e.g. a conventional `select`, is interpreted by jtlt itself; the extension resolves whatever it needs via `this.get(...)`, `this.valueOf(...)`, etc.). `name` must be a key actually present in `config.extensions`; any other name throws |
141
142
 
142
143
  Every operation node's leading object is entirely `$`-prefixed — jamilih's
143
144
  own validator requires this of any first-position plain object. `$jtltMode`/
@@ -150,9 +151,40 @@ node's own trailing arguments are each *arrays* — including the
150
151
  easy-to-miss case of a single node or a single sibling, which still needs
151
152
  its wrapping array.
152
153
 
153
- `$indexedDB`/`$renderDefault` may appear nested anywhere a node is
154
- allowed — inside an element's children, or a `$if`/`$forEach` body — not
155
- just at a template's top level; see the README section above for why.
154
+ `$indexedDB`/`$renderDefault`/an extension call may appear nested anywhere a
155
+ node is allowed — inside an element's children, or a `$if`/`$forEach` body —
156
+ not just at a template's top level; see the README section above for why.
157
+
158
+ An extension call, like `$renderDefault`, never auto-inserts its call's
159
+ return value — the extension itself is responsible for that (e.g. via
160
+ `this.appendOutput(...)`), since a called extension may want to emit
161
+ nothing, emit synchronously, or await further work first. Restricting
162
+ callable names to those actually supplied via `config.extensions` (tracked
163
+ on the context as `_extensionNames`) matters when `behavior` itself is
164
+ untrusted, admin-authored declarative source: without it, an extension-call
165
+ key could invoke any built-in context method by name (`element`,
166
+ `indexedDB`, etc.), not just the helpers its author intentionally exposed.
167
+
168
+ The argument object's contents are entirely up to the extension itself —
169
+ jtlt neither resolves a `select` nor interprets any other key, just hands
170
+ the whole object over (`this`-bound to the live context, so the extension
171
+ can call `this.get(argObject.select, false)`, or read a literal field like
172
+ `argObject.db` directly, however it needs to). This is what lets one call
173
+ carry more than a single value — e.g. `{$generateJsoeEditUI: {select:
174
+ '$.record', db: 'x', store: 'y'}}` passing both the record to edit and
175
+ which store's schema should shape the controls.
176
+
177
+ **Trade-off**: because any operation-node key not in the fixed built-in set
178
+ is treated as a candidate extension name, a future jtlt release adding a
179
+ new built-in operation could collide with an extension name a consumer
180
+ already uses, silently changing that template's behavior on upgrade. This
181
+ is accepted in exchange for the terser `{$greet: {...}}` syntax over a more
182
+ defensive, explicitly namespaced `{$extension: 'greet', ...}` wrapper.
183
+ Consumers who register extensions are encouraged to document their chosen
184
+ names somewhere (e.g. a project wiki page) alongside jtlt's own reserved
185
+ op keys (`$text`, `$jtltText`, `$string`, `$valueOf`, `$applyTemplates`,
186
+ `$if`, `$forEach`, `$variable`, `$indexedDB`, `$renderDefault`, `$mode`,
187
+ `$jtltMode`, `$as`, `$sort`, `$select`) as names to avoid.
156
188
 
157
189
  **Validation**: `format: 'json'` (the default) rejects an embedded live
158
190
  function/DOM node anywhere in the tree — the intent is a safely
package/docs/API.md CHANGED
@@ -43,7 +43,13 @@ const out = JTLT.create({
43
43
  }).transform('');
44
44
  ```
45
45
 
46
- `jtlt()` accepts every `JTLT` option except `success`.
46
+ `jtlt()` accepts every `JTLT` option except `success`/`error` — it wires
47
+ both itself, so its returned `Promise` resolves or rejects instead.
48
+
49
+ For `JTLT`'s own autostart path (no explicit `.transform()` call), `error`
50
+ is `success`'s failure counterpart: a template that throws or otherwise
51
+ rejects the transform calls `error(err)` if provided, else falls back to
52
+ `console.error(err)`.
47
53
 
48
54
  ## Engines
49
55
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jtlt",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
4
4
  "type": "module",
5
5
  "author": "Brett Zamir",
6
6
  "contributors": [],
@@ -2,6 +2,16 @@
2
2
  * Merges `extensions` onto a template context instance so templates can
3
3
  * invoke them as `this.myHelper()`. Shared by JSONPathTransformerContext
4
4
  * and XPathTransformerContext.
5
+ *
6
+ * Also records the registered names on `context._extensionNames` (a `Set`,
7
+ * merged with any already present from an earlier call) — consulted by the
8
+ * declarative interpreter's extension-call nodes (e.g. `{$greet: {select:
9
+ * '$.path'}}` — see `jsonTemplate.js`) so a declarative `behavior` can only
10
+ * ever invoke names that were actually supplied here, never an
11
+ * arbitrary/built-in context method (`element`, `indexedDB`, etc.) by name.
12
+ * Untrusted, admin-authored declarative source is exactly why this
13
+ * distinction matters — see ROUTE-OVERRIDES-PLAN.md's (idb-manager)
14
+ * "declarative subset" for the threat model this is part of.
5
15
  * @param {object} context - The context instance to extend
6
16
  * @param {Record<string, unknown>} extensions - Extra methods/values
7
17
  * @returns {void}
@@ -18,4 +28,9 @@ export default function applyExtensions (context, extensions) {
18
28
  }
19
29
  }
20
30
  Object.assign(context, extensions);
31
+ const existingNames = /** @type {{_extensionNames?: Set<string>}} */ (
32
+ context
33
+ )._extensionNames;
34
+ /** @type {{_extensionNames: Set<string>}} */ (context)._extensionNames =
35
+ new Set([...(existingNames ?? []), ...Object.keys(extensions)]);
21
36
  }
package/src/index.js CHANGED
@@ -126,7 +126,24 @@ export const setWindow = (win) => {
126
126
  * (`UNKNOWN_MAGIC_PROPERTY`); that combined form needs `$jtltText` instead.
127
127
  * See §3.5. `$indexedDB`'s children are optional (unlike `$if`/`$forEach`,
128
128
  * which both require theirs): a bare prefetch — binding via `$as` for later
129
- * use, or simply discarding the rows — is a legitimate leaf use.
129
+ * use, or simply discarding the rows — is a legitimate leaf use. Any key
130
+ * not otherwise recognized here — e.g. `$greet` — is an extension call:
131
+ * `ctx[name](argObject)` calls a named function from `config.extensions`,
132
+ * passing the operation node's own argument object through entirely
133
+ * unresolved (no key, including a conventional `select`, is interpreted by
134
+ * jtlt itself — the extension reads whatever it needs via `this.get(...)`,
135
+ * `this.valueOf(...)`, etc.) — like `$renderDefault`, the extension itself
136
+ * is responsible for inserting any output (e.g. via
137
+ * `this.appendOutput(...)`); the interpreter never does so on its behalf.
138
+ * Restricted at runtime to names actually present in
139
+ * `config.extensions` (tracked via `ctx._extensionNames`, set by
140
+ * `applyExtensions`), so a declarative `behavior` — untrusted, admin-authored
141
+ * — can never invoke an arbitrary built-in context method by name. Because
142
+ * any not-otherwise-recognized `$`-prefixed key becomes a live extension
143
+ * name, a future built-in operation added here could collide with a name a
144
+ * consumer already uses for an extension — an accepted, documented risk
145
+ * (see `jsonTemplate.js`'s module doc comment) traded for this terser
146
+ * syntax over a more defensive, explicitly namespaced wrapper.
130
147
  * @typedef {[{$text: unknown}] |
131
148
  * [{$jtltText: unknown, $select?: string}] |
132
149
  * [{$string: unknown, $select?: string}] |
@@ -150,7 +167,8 @@ export const setWindow = (win) => {
150
167
  * },
151
168
  * $as?: string
152
169
  * }, JSONTemplateNode[]] |
153
- * [{$renderDefault: true}]
170
+ * [{$renderDefault: true}] |
171
+ * [Record<`$${string}`, Record<string, unknown>>]
154
172
  * } JSONOperationNode
155
173
  */
156
174
 
@@ -260,6 +278,14 @@ export const setWindow = (win) => {
260
278
  * with a single argument that is the result of this instance's
261
279
  * transform() method. When used in TypeScript, this can be made
262
280
  * generic as `success<T>(result: T): void`.
281
+ * @property {(err: unknown) => void} [error] `success`'s counterpart for
282
+ * the autostart path (`config.autostart` unset/`true`, the common case):
283
+ * a template that throws (directly, or via an awaited Promise it
284
+ * returned) calls this instead, if supplied — otherwise the failure is
285
+ * only surfaced via `console.error`, since `_autoStart` invokes
286
+ * `transform()` without a caller able to `await`/`catch` it directly.
287
+ * Not consulted for a `transform()` call made directly (its own return
288
+ * value/rejection is observable there instead).
263
289
  * @property {null|boolean|number|string|object} [data] A JSON
264
290
  * object or DOM document (XPath)
265
291
  * @property {string} [ajaxData] URL of a JSON file to retrieve for
@@ -567,7 +593,28 @@ class JTLT {
567
593
  return;
568
594
  }
569
595
 
570
- this.transform(/** @type {string} */ (mode));
596
+ // `transform()`'s result is a `Promise` whenever the template ran
597
+ // asynchronously (§ its own doc comment) — discarding that here, as
598
+ // this call previously did, meant a template that threw (or whose
599
+ // `success` callback threw) became an unhandled rejection with no way
600
+ // for the constructor's caller to observe it at all: `config.success`
601
+ // is the only callback `transform()` invokes, with nothing symmetric
602
+ // for failure. `config.error`, when supplied, is that missing
603
+ // counterpart; when it isn't, the failure is at least surfaced via
604
+ // `console.error` instead of silently vanishing.
605
+ const result = this.transform(/** @type {string} */ (mode));
606
+ const maybePromise = /** @type {{catch?: unknown}} */ (result);
607
+ if (maybePromise && typeof maybePromise.catch === 'function') {
608
+ // eslint-disable-next-line promise/prefer-await-to-then -- Fire+forget
609
+ /** @type {Promise<unknown>} */ (result).catch((err) => {
610
+ if (typeof this.config.error === 'function') {
611
+ this.config.error(err);
612
+ } else {
613
+ /* eslint-disable-next-line no-console -- Last-resort visibility */
614
+ console.error(err);
615
+ }
616
+ });
617
+ }
571
618
  }
572
619
 
573
620
  /**
@@ -865,7 +912,7 @@ class JTLT {
865
912
  */
866
913
  export function jtlt (cfg) {
867
914
  // eslint-disable-next-line promise/avoid-new -- Own API
868
- return new Promise((resolve) => {
915
+ return new Promise((resolve, reject) => {
869
916
  // Narrow the constructor overload based on engineType
870
917
  if (cfg && cfg.engineType === 'xpath') {
871
918
  const outputType = cfg.outputType || 'string';
@@ -877,7 +924,8 @@ export function jtlt (cfg) {
877
924
  outputType: 'json',
878
925
  success (val) {
879
926
  resolve(val);
880
- }
927
+ },
928
+ error: reject
881
929
  })
882
930
  );
883
931
  } else if (outputType === 'dom') {
@@ -887,7 +935,8 @@ export function jtlt (cfg) {
887
935
  outputType: 'dom',
888
936
  success (val) {
889
937
  resolve(val);
890
- }
938
+ },
939
+ error: reject
891
940
  })
892
941
  );
893
942
  } else {
@@ -897,7 +946,8 @@ export function jtlt (cfg) {
897
946
  outputType: 'string',
898
947
  success (val) {
899
948
  resolve(val);
900
- }
949
+ },
950
+ error: reject
901
951
  })
902
952
  );
903
953
  }
@@ -913,7 +963,8 @@ export function jtlt (cfg) {
913
963
  outputType: 'string',
914
964
  success (val) {
915
965
  resolve(val);
916
- }
966
+ },
967
+ error: reject
917
968
  })
918
969
  );
919
970
  } else if (outputType === 'dom') {
@@ -923,7 +974,8 @@ export function jtlt (cfg) {
923
974
  outputType: 'dom',
924
975
  success (val) {
925
976
  resolve(val);
926
- }
977
+ },
978
+ error: reject
927
979
  })
928
980
  );
929
981
  } else {
@@ -933,7 +985,8 @@ export function jtlt (cfg) {
933
985
  outputType: 'json',
934
986
  success (val) {
935
987
  resolve(val);
936
- }
988
+ },
989
+ error: reject
937
990
  })
938
991
  );
939
992
  }
@@ -18,16 +18,48 @@ import {isValidJamilih} from 'jamilih';
18
18
  * including the `$text`/`$jtltText` and `$mode`/`$jtltMode` namespacing
19
19
  * rules and `$indexedDB`'s optional `$as`.
20
20
  *
21
- * `$indexedDB`/`$renderDefault` (the only async operations) may appear
22
- * anywhere a node is allowed — nested inside an element's children, or a
23
- * `$if`/`$forEach` body, included — because every node here is run through
24
- * an `async` callback, and `element()`/`if()`/`choose()`/`forEach()` (in
25
- * every joining transformer and `JSONPathTransformerContext`) duck-type
26
- * their callback's return value: a synchronous callback keeps them
27
- * synchronous, but one returning a `Promise` (an async function that
28
- * awaited something) makes the call itself return a `Promise` that settles
29
- * once the callback's work is done, keeping output correctly ordered
30
- * either way.
21
+ * `$indexedDB`/`$renderDefault`/an extension call (the only operations that
22
+ * may be async — an extension call awaits whatever the named extension
23
+ * itself is) may appear anywhere a node is allowed — nested inside an
24
+ * element's children, or a `$if`/`$forEach` body, included — because every
25
+ * node here is run through an `async` callback, and
26
+ * `element()`/`if()`/`choose()`/`forEach()` (in every joining transformer
27
+ * and `JSONPathTransformerContext`) duck-type their callback's return
28
+ * value: a synchronous callback keeps them synchronous, but one returning a
29
+ * `Promise` (an async function that awaited something) makes the call
30
+ * itself return a `Promise` that settles once the callback's work is done,
31
+ * keeping output correctly ordered either way.
32
+ *
33
+ * An extension call (`{$name: {...}}`, e.g. `{$greet: {select:
34
+ * '$.user.name'}}`, or `{$generateJsoeEditUI: {select: '$.record', db:
35
+ * 'x', store: 'y'}}` — the argument is an object, matching `$indexedDB`'s
36
+ * own convention, rather than a bare value) calls a `this`-bound method of
37
+ * that same name supplied via `config.extensions` (`this.name(argObject)`)
38
+ * — restricted to names actually present in `config.extensions` (tracked
39
+ * by `applyExtensions` in
40
+ * `extendContext.js`), never an arbitrary/built-in context method, since a
41
+ * declarative `behavior` using this format is typically untrusted,
42
+ * admin-authored input (idb-manager's route overrides): any key not in
43
+ * `RECOGNIZED_OP_KEYS` is treated as a candidate extension name rather than
44
+ * a validation error, so whether it's actually callable can only be
45
+ * confirmed once a live context (and its `config.extensions`) exists — see
46
+ * `runOperation`, below. The interpreter does not interpret the argument
47
+ * object's contents at all — no key (including `select`) is special-cased
48
+ * — it's simply handed to the extension as-is, `this`-bound to the live
49
+ * context, so the extension resolves whatever it needs itself (e.g.
50
+ * `this.get(argObject.select, false)`) however suits it. Like
51
+ * `$renderDefault`, inserting the extension's return value into the output
52
+ * (if it has one worth inserting) is the extension's own job — e.g. via
53
+ * `this.appendOutput(node)` — not something this interpreter does for it.
54
+ * Because any not-otherwise-recognized
55
+ * `$`-prefixed key becomes a live extension name, a future jtlt release
56
+ * adding a new built-in operation could collide with an extension name a
57
+ * consumer already uses — accepted as a known, documented risk in exchange
58
+ * for the terser syntax (rather than the more defensive, explicitly
59
+ * namespaced `{$extension: 'name', $select?: sel}` wrapper this replaced) —
60
+ * consumers documenting their extension names (e.g. a project wiki page)
61
+ * are encouraged to also list jtlt's own reserved op keys as names to
62
+ * avoid.
31
63
  */
32
64
 
33
65
  /**
@@ -87,6 +119,9 @@ function splitElementRest (rest) {
87
119
  * is never valid bare (jamilih hard-reserves it); `$text` is valid bare
88
120
  * (jamilih's own text-node form) but not combined with `$select` (jamilih
89
121
  * rejects the unrecognized companion) — that combination needs `$jtltText`.
122
+ * Any `$`-prefixed key *not* in this set is a candidate extension call
123
+ * (see `runOperation`), not a validation error — see the module doc
124
+ * comment above for the namespace-collision tradeoff this implies.
90
125
  * @type {ReadonlySet<string>}
91
126
  */
92
127
  const RECOGNIZED_OP_KEYS = new Set([
@@ -108,8 +143,27 @@ function validateOperationHead (head) {
108
143
  }
109
144
  const opKeys = keys.filter((k) => RECOGNIZED_OP_KEYS.has(k));
110
145
  if (opKeys.length === 0) {
111
- const badKey = keys.find((k) => !k.startsWith('$')) ?? keys[0];
112
- return `Unrecognized operation-node key \`${badKey}\`.`;
146
+ const badKey = keys.find((k) => !k.startsWith('$'));
147
+ if (badKey) {
148
+ return `Unrecognized operation-node key \`${badKey}\`.`;
149
+ }
150
+ // Every key is `$`-prefixed but none is a built-in op: a single such
151
+ // key is a candidate extension call. Whether it names a name actually
152
+ // supplied via `config.extensions` can only be confirmed once a live
153
+ // context exists (`runOperation`), so that check isn't done here.
154
+ if (keys.length !== 1) {
155
+ return `Unrecognized operation-node key \`${keys[0]}\`.`;
156
+ }
157
+ const [extKey] = keys;
158
+ if (!isPlainObject(head[extKey])) {
159
+ return `\`${extKey}\` (an extension call) requires an object value, ` +
160
+ `e.g. \`{${extKey}: {select: '$.path'}}\` — matching ` +
161
+ '`$indexedDB`\'s own convention. Its contents are entirely up to ' +
162
+ 'the extension itself (e.g. a `select` it resolves via `this.get' +
163
+ '(...)`, literal fields like `db`/`store`, …) — not interpreted ' +
164
+ 'here.';
165
+ }
166
+ return null;
113
167
  }
114
168
  if (Object.hasOwn(head, '$text') && keys.length > 1) {
115
169
  return '`$text` combined with any other key (e.g. `$select`) is not ' +
@@ -482,25 +536,46 @@ async function runOperation (head, rest, ctx) {
482
536
  await ctx.renderDefault();
483
537
  return;
484
538
  }
485
- // Only $indexedDB is left (validateOperationHead already rejects
486
- // anything else, and every other recognized key returned above).
487
- const idb = /** @type {{db: string, store: string, options?: unknown}} */
488
- (head.$indexedDB);
489
- const rows = await ctx.indexedDB(idb.db, idb.store, idb.options);
490
- // Validation already confirmed this is an array, when given at all.
491
- const childNodes = /** @type {unknown[]} */ (rest[0] ?? []);
492
- if (Object.hasOwn(head, '$as')) {
493
- ctx.variable(head.$as, {value: rows});
494
- await runNodes(childNodes, ctx);
495
- } else {
496
- const prevContext = ctx._contextObj;
497
- ctx._contextObj = rows;
498
- try {
539
+ if (Object.hasOwn(head, '$indexedDB')) {
540
+ const idb = /** @type {{db: string, store: string, options?: unknown}} */
541
+ (head.$indexedDB);
542
+ const rows = await ctx.indexedDB(idb.db, idb.store, idb.options);
543
+ // Validation already confirmed this is an array, when given at all.
544
+ const childNodes = /** @type {unknown[]} */ (rest[0] ?? []);
545
+ if (Object.hasOwn(head, '$as')) {
546
+ ctx.variable(head.$as, {value: rows});
499
547
  await runNodes(childNodes, ctx);
500
- } finally {
501
- ctx._contextObj = prevContext;
548
+ } else {
549
+ const prevContext = ctx._contextObj;
550
+ ctx._contextObj = rows;
551
+ try {
552
+ await runNodes(childNodes, ctx);
553
+ } finally {
554
+ ctx._contextObj = prevContext;
555
+ }
502
556
  }
557
+ return;
558
+ }
559
+ // Only a single, not-otherwise-recognized `$`-prefixed key is left
560
+ // (`validateOperationHead` already confirmed this shape) — a candidate
561
+ // extension call. Only a name actually supplied via `config.extensions`
562
+ // (tracked by `applyExtensions` in `extendContext.js`) may be called this
563
+ // way — never an arbitrary/built-in context method (`element`,
564
+ // `indexedDB`, …) by name, since an admin-authored declarative `behavior`
565
+ // is untrusted input.
566
+ const [key] = Object.keys(head);
567
+ const name = key.slice(1);
568
+ if (!ctx._extensionNames?.has(name)) {
569
+ throw new Error(
570
+ `"${name}" is not a registered extension (an extension-call key ` +
571
+ 'may only name one actually supplied via `config.extensions`).'
572
+ );
503
573
  }
574
+ // The argument object's contents are entirely up to the extension: the
575
+ // interpreter neither resolves a `select` nor interprets any other key,
576
+ // just hands the whole thing over (`this` is still the live context, so
577
+ // the extension can call `this.get(...)`/`this.valueOf(...)` itself).
578
+ await ctx[name](/** @type {Record<string, unknown>} */ (head[key]));
504
579
  }
505
580
 
506
581
  /**
package/tsconfig.json CHANGED
@@ -14,5 +14,5 @@
14
14
  "*.js", "*.d.ts", "src/**/*.js", "src/**/*.d.ts", "demo/**/*.js",
15
15
  "test/**/*.js", "test/**/*.d.ts", "typings/xpath2-js.d.ts"
16
16
  ],
17
- "exclude": ["node_modules", "test.js", "./dist/**/*.js", "demo/codemirror.esm.js", "demo/vendor"]
17
+ "exclude": ["node_modules", "test.js", "demo/codemirror.esm.js", "demo/vendor"]
18
18
  }