@funcstache/stache-stream 0.2.2 → 0.2.3

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 (109) hide show
  1. package/.eslintrc.json +30 -0
  2. package/.swcrc +29 -0
  3. package/DEV.md +84 -0
  4. package/README.md +145 -0
  5. package/TASKS.md +13 -0
  6. package/TODO.md +28 -0
  7. package/docs/.nojekyll +1 -0
  8. package/docs/assets/hierarchy.js +1 -0
  9. package/docs/assets/highlight.css +120 -0
  10. package/docs/assets/icons.js +18 -0
  11. package/docs/assets/icons.svg +1 -0
  12. package/docs/assets/main.js +60 -0
  13. package/docs/assets/navigation.js +1 -0
  14. package/docs/assets/search.js +1 -0
  15. package/docs/assets/style.css +1633 -0
  16. package/docs/classes/StacheTransformStream.html +13 -0
  17. package/docs/hierarchy.html +1 -0
  18. package/docs/index.html +73 -0
  19. package/docs/interfaces/Context.html +3 -0
  20. package/docs/interfaces/ContextProvider.html +10 -0
  21. package/docs/interfaces/PartialTagContextLambda.html +11 -0
  22. package/docs/interfaces/PartialTagContextLambdaResult.html +7 -0
  23. package/docs/interfaces/SectionTagCallback.html +12 -0
  24. package/docs/interfaces/SectionTagContextRecord.html +4 -0
  25. package/docs/interfaces/Tag.html +45 -0
  26. package/docs/interfaces/VariableTagContextLambda.html +4 -0
  27. package/docs/interfaces/VariableTagContextRecord.html +3 -0
  28. package/docs/media/StacheStream.ts +79 -0
  29. package/docs/modules.html +1 -0
  30. package/docs/types/ContextTypes.html +3 -0
  31. package/docs/types/JsonType.html +2 -0
  32. package/docs/types/PartialTagContext.html +4 -0
  33. package/docs/types/SectionTagContext.html +4 -0
  34. package/docs/types/TemplateName.html +9 -0
  35. package/docs/types/VariableTagContext.html +4 -0
  36. package/docs/types/VariableTagContextPrimitive.html +3 -0
  37. package/docs-assets/images/context-dotted-found.png +0 -0
  38. package/docs-assets/images/context-dotted-not-found.png +0 -0
  39. package/docs-assets/images/context-not-found.png +0 -0
  40. package/package.json +3 -6
  41. package/project.json +26 -0
  42. package/src/global.d.ts +10 -0
  43. package/src/index.ts +67 -0
  44. package/src/lib/parse/Parse.spec.ts +50 -0
  45. package/src/lib/parse/Parse.ts +92 -0
  46. package/src/lib/parse/README.md +62 -0
  47. package/src/lib/plan_base_v2.md +33 -0
  48. package/src/lib/plan_comment.md +53 -0
  49. package/src/lib/plan_implicit-iterator.md +213 -0
  50. package/src/lib/plan_inverted-sections.md +160 -0
  51. package/src/lib/plan_partials.md +237 -0
  52. package/src/lib/plan_sections.md +167 -0
  53. package/src/lib/plan_stache-stream.md +110 -0
  54. package/src/lib/plan_whitespace.md +98 -0
  55. package/src/lib/queue/Queue.spec.ts +275 -0
  56. package/src/lib/queue/Queue.ts +253 -0
  57. package/src/lib/queue/README.md +110 -0
  58. package/src/lib/stache-stream/README.md +45 -0
  59. package/src/lib/stache-stream/StacheStream.spec.ts +107 -0
  60. package/src/lib/stache-stream/StacheStream.ts +79 -0
  61. package/src/lib/tag/README.md +95 -0
  62. package/src/lib/tag/Tag.spec.ts +212 -0
  63. package/src/lib/tag/Tag.ts +295 -0
  64. package/src/lib/template/README.md +102 -0
  65. package/src/lib/template/Template-comment.spec.ts +76 -0
  66. package/src/lib/template/Template-inverted-section.spec.ts +85 -0
  67. package/src/lib/template/Template-partials.spec.ts +125 -0
  68. package/src/lib/template/Template-section.spec.ts +142 -0
  69. package/src/lib/template/Template.spec.ts +178 -0
  70. package/src/lib/template/Template.ts +614 -0
  71. package/src/lib/test/streams.ts +36 -0
  72. package/src/lib/tokenize/README.md +97 -0
  73. package/src/lib/tokenize/Tokenize.spec.ts +364 -0
  74. package/src/lib/tokenize/Tokenize.ts +374 -0
  75. package/src/lib/{types.d.ts → types.ts} +73 -25
  76. package/tsconfig.json +21 -0
  77. package/tsconfig.lib.json +16 -0
  78. package/tsconfig.spec.json +21 -0
  79. package/typedoc.mjs +15 -0
  80. package/vite.config.ts +27 -0
  81. package/vitest.setup.ts +6 -0
  82. package/src/global.d.js +0 -8
  83. package/src/global.d.js.map +0 -1
  84. package/src/index.d.ts +0 -7
  85. package/src/index.js +0 -24
  86. package/src/index.js.map +0 -1
  87. package/src/lib/parse/Parse.d.ts +0 -14
  88. package/src/lib/parse/Parse.js +0 -79
  89. package/src/lib/parse/Parse.js.map +0 -1
  90. package/src/lib/queue/Queue.d.ts +0 -32
  91. package/src/lib/queue/Queue.js +0 -181
  92. package/src/lib/queue/Queue.js.map +0 -1
  93. package/src/lib/stache-stream/StacheStream.d.ts +0 -22
  94. package/src/lib/stache-stream/StacheStream.js +0 -71
  95. package/src/lib/stache-stream/StacheStream.js.map +0 -1
  96. package/src/lib/tag/Tag.d.ts +0 -33
  97. package/src/lib/tag/Tag.js +0 -231
  98. package/src/lib/tag/Tag.js.map +0 -1
  99. package/src/lib/template/Template.d.ts +0 -18
  100. package/src/lib/template/Template.js +0 -428
  101. package/src/lib/template/Template.js.map +0 -1
  102. package/src/lib/test/streams.d.ts +0 -2
  103. package/src/lib/test/streams.js +0 -39
  104. package/src/lib/test/streams.js.map +0 -1
  105. package/src/lib/tokenize/Tokenize.d.ts +0 -22
  106. package/src/lib/tokenize/Tokenize.js +0 -268
  107. package/src/lib/tokenize/Tokenize.js.map +0 -1
  108. package/src/lib/types.js +0 -33
  109. package/src/lib/types.js.map +0 -1
package/src/global.d.js DELETED
@@ -1,8 +0,0 @@
1
- /******************************************************************************
2
- * Set up our custom error
3
- *****************************************************************************/ "use strict";
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
-
8
- //# sourceMappingURL=global.d.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../libs/stache-stream/src/global.d.ts"],"sourcesContent":["/******************************************************************************\n * Set up our custom error\n *****************************************************************************/\nexport interface StacheStreamError extends Error {}\n\nexport interface StacheStreamErrorConstructor extends ErrorConstructor {\n new (message?: string): StacheStreamError;\n (message?: string): StacheStreamError;\n readonly prototype: StacheStreamError;\n}\n"],"names":[],"rangeMappings":";;","mappings":"AAAA;;6EAE6E"}
package/src/index.d.ts DELETED
@@ -1,7 +0,0 @@
1
- import type { StacheStreamErrorConstructor } from "./global";
2
- import type { Context, ContextProvider, ContextTypes, JsonType, PartialTagContext, PartialTagContextLambda, PartialTagContextLambdaResult, SectionTagCallback, SectionTagContext, SectionTagContextRecord, Tag, TemplateName, VariableTagContext, VariableTagContextLambda, VariableTagContextPrimitive, VariableTagContextRecord } from "./lib/types";
3
- export type { Context, ContextProvider, ContextTypes, JsonType, PartialTagContext, PartialTagContextLambda, PartialTagContextLambdaResult, SectionTagCallback, SectionTagContext, SectionTagContextRecord, Tag, TemplateName, VariableTagContext, VariableTagContextLambda, VariableTagContextPrimitive, VariableTagContextRecord, };
4
- export * from "./lib/stache-stream/StacheStream";
5
- declare global {
6
- var StacheStreamError: StacheStreamErrorConstructor;
7
- }
package/src/index.js DELETED
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- const _export_star = require("@swc/helpers/_/_export_star");
6
- _export_star._(require("./lib/stache-stream/StacheStream"), exports);
7
- /******************************************************************************
8
- * Set up our custom error
9
- *****************************************************************************/ function StacheStreamError(message) {
10
- if (new.target) {
11
- this.message = message || "";
12
- this.name = "StacheStreamError";
13
- return this;
14
- } else {
15
- const err = Error(message);
16
- err.name = "StacheStreamError";
17
- return err;
18
- }
19
- }
20
- StacheStreamError.prototype = new Error();
21
- // @ts-expect-error -- function satisfies StacheStreamErrorConstructor at runtime; captureStackTrace and stackTraceLimit are inherited from Error
22
- global.StacheStreamError = StacheStreamError;
23
-
24
- //# sourceMappingURL=index.js.map
package/src/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../libs/stache-stream/src/index.ts"],"sourcesContent":["import type { StacheStreamError, StacheStreamErrorConstructor } from \"./global\";\nimport type {\n Context,\n ContextProvider,\n ContextTypes,\n JsonType,\n PartialTagContext,\n PartialTagContextLambda,\n PartialTagContextLambdaResult,\n SectionTagCallback,\n SectionTagContext,\n SectionTagContextRecord,\n Tag,\n TemplateName,\n VariableTagContext,\n VariableTagContextLambda,\n VariableTagContextPrimitive,\n VariableTagContextRecord,\n} from \"./lib/types\";\nexport type {\n Context,\n ContextProvider,\n ContextTypes,\n JsonType,\n PartialTagContext,\n PartialTagContextLambda,\n PartialTagContextLambdaResult,\n SectionTagCallback,\n SectionTagContext,\n SectionTagContextRecord,\n Tag,\n TemplateName,\n VariableTagContext,\n VariableTagContextLambda,\n VariableTagContextPrimitive,\n VariableTagContextRecord,\n};\n\nexport * from \"./lib/stache-stream/StacheStream\";\n\n/******************************************************************************\n * Set up our custom error\n *****************************************************************************/\nfunction StacheStreamError(\n this: InstanceType<StacheStreamErrorConstructor>,\n message?: string\n): StacheStreamError {\n if (new.target) {\n this.message = message || \"\";\n this.name = \"StacheStreamError\";\n return this;\n } else {\n const err = Error(message);\n err.name = \"StacheStreamError\";\n return err;\n }\n}\n\nStacheStreamError.prototype = new Error();\n\ndeclare global {\n // eslint-disable-next-line no-var\n var StacheStreamError: StacheStreamErrorConstructor;\n}\n\n// @ts-expect-error -- function satisfies StacheStreamErrorConstructor at runtime; captureStackTrace and stackTraceLimit are inherited from Error\nglobal.StacheStreamError = StacheStreamError;\n"],"names":["StacheStreamError","message","name","err","Error","prototype","global"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;","mappings":";;;;;uBAsCc;AAEd;;6EAE6E,GAC7E,SAASA,kBAEPC,OAAgB;IAEhB,IAAI,YAAY;QACd,IAAI,CAACA,OAAO,GAAGA,WAAW;QAC1B,IAAI,CAACC,IAAI,GAAG;QACZ,OAAO,IAAI;IACb,OAAO;QACL,MAAMC,MAAMC,MAAMH;QAClBE,IAAID,IAAI,GAAG;QACX,OAAOC;IACT;AACF;AAEAH,kBAAkBK,SAAS,GAAG,IAAID;AAOlC,iJAAiJ;AACjJE,OAAON,iBAAiB,GAAGA"}
@@ -1,14 +0,0 @@
1
- import { ReadableStream } from "node:stream/web";
2
- import { EventEmitter } from "node:events";
3
- type ParseEventMap = {
4
- inactive: [Parse];
5
- };
6
- export interface ParseOptions {
7
- onChar: (char: string | null) => Promise<void>;
8
- }
9
- export declare class Parse extends EventEmitter<ParseEventMap> {
10
- #private;
11
- constructor(options: ConstructorParameters<typeof EventEmitter<ParseEventMap>>[0] & ParseOptions);
12
- read(readable: ReadableStream<string>): Promise<void>;
13
- }
14
- export {};
@@ -1,79 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "Parse", {
6
- enumerable: true,
7
- get: function() {
8
- return Parse;
9
- }
10
- });
11
- const _nodeevents = require("node:events");
12
- let Parse = class Parse extends _nodeevents.EventEmitter {
13
- #onChar;
14
- #processPending;
15
- #queue;
16
- #readState;
17
- constructor(options){
18
- super(options);
19
- this.#processPending = false;
20
- this.#queue = [];
21
- this.#readState = "pending";
22
- this.#onChar = options.onChar;
23
- }
24
- async read(readable) {
25
- this.#readState = "reading";
26
- for await (const chunk of readable){
27
- if (!chunk) {
28
- break;
29
- }
30
- if (1 < chunk.length) {
31
- for (const char of chunk){
32
- this.#push(char);
33
- }
34
- } else {
35
- this.#push(chunk);
36
- }
37
- }
38
- this.#readState = "finished";
39
- this.#finalize();
40
- }
41
- #invokeChar(char) {
42
- try {
43
- this.#onChar(char);
44
- } catch (err) {
45
- console.error(err);
46
- }
47
- }
48
- #process() {
49
- this.#processPending = false;
50
- while(this.#queue.length){
51
- const char = this.#queue.shift();
52
- if (!char) {
53
- continue;
54
- }
55
- this.#invokeChar(char);
56
- }
57
- this.#finalize();
58
- }
59
- #push(char) {
60
- this.#queue.push(char);
61
- if (this.#processPending) {
62
- return;
63
- }
64
- this.#processPending = true;
65
- setTimeout(()=>this.#process(), 0);
66
- }
67
- #finalize() {
68
- if (this.#readState !== "finished") {
69
- return;
70
- }
71
- if (this.#queue.length) {
72
- return;
73
- }
74
- this.#invokeChar(null);
75
- this.emit("inactive", this);
76
- }
77
- };
78
-
79
- //# sourceMappingURL=Parse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../libs/stache-stream/src/lib/parse/Parse.ts"],"sourcesContent":["import { ReadableStream } from \"node:stream/web\";\nimport { EventEmitter } from \"node:events\";\n\ntype ParseEventMap = { inactive: [Parse] };\n\nexport interface ParseOptions {\n onChar: (char: string | null) => Promise<void>;\n}\n\nexport class Parse extends EventEmitter<ParseEventMap> {\n #onChar: ParseOptions[\"onChar\"];\n #processPending = false;\n #queue: string[] = [];\n #readState: \"finished\" | \"pending\" | \"reading\" = \"pending\";\n\n constructor(\n options: ConstructorParameters<typeof EventEmitter<ParseEventMap>>[0] &\n ParseOptions\n ) {\n super(options);\n this.#onChar = options.onChar;\n }\n\n async read(readable: ReadableStream<string>) {\n this.#readState = \"reading\";\n\n for await (const chunk of readable) {\n if (!chunk) {\n break;\n }\n\n if (1 < chunk.length) {\n for (const char of chunk) {\n this.#push(char);\n }\n } else {\n this.#push(chunk);\n }\n }\n\n this.#readState = \"finished\";\n this.#finalize();\n }\n\n #invokeChar(char: string | null) {\n try {\n this.#onChar(char);\n } catch (err) {\n console.error(err);\n }\n }\n\n #process() {\n this.#processPending = false;\n\n while (this.#queue.length) {\n const char = this.#queue.shift();\n if (!char) {\n continue;\n }\n\n this.#invokeChar(char);\n }\n\n this.#finalize();\n }\n\n #push(char: string) {\n this.#queue.push(char);\n\n if (this.#processPending) {\n return;\n }\n\n this.#processPending = true;\n\n setTimeout(() => this.#process(), 0);\n }\n\n #finalize() {\n if (this.#readState !== \"finished\") {\n return;\n }\n\n if (this.#queue.length) {\n return;\n }\n\n this.#invokeChar(null);\n this.emit(\"inactive\", this);\n }\n}\n"],"names":["Parse","EventEmitter","onChar","processPending","queue","readState","constructor","options","read","readable","chunk","length","char","push","finalize","invokeChar","err","console","error","process","shift","setTimeout","emit"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BASaA;;;eAAAA;;;4BARgB;AAQtB,IAAA,AAAMA,QAAN,MAAMA,cAAcC,wBAAY;IACrC,CAACC,MAAM,CAAyB;IAChC,CAACC,cAAc,CAAS;IACxB,CAACC,KAAK,CAAgB;IACtB,CAACC,SAAS,CAAiD;IAE3DC,YACEC,OACc,CACd;QACA,KAAK,CAACA;aARR,CAACJ,cAAc,GAAG;aAClB,CAACC,KAAK,GAAa,EAAE;aACrB,CAACC,SAAS,GAAuC;QAO/C,IAAI,CAAC,CAACH,MAAM,GAAGK,QAAQL,MAAM;IAC/B;IAEA,MAAMM,KAAKC,QAAgC,EAAE;QAC3C,IAAI,CAAC,CAACJ,SAAS,GAAG;QAElB,WAAW,MAAMK,SAASD,SAAU;YAClC,IAAI,CAACC,OAAO;gBACV;YACF;YAEA,IAAI,IAAIA,MAAMC,MAAM,EAAE;gBACpB,KAAK,MAAMC,QAAQF,MAAO;oBACxB,IAAI,CAAC,CAACG,IAAI,CAACD;gBACb;YACF,OAAO;gBACL,IAAI,CAAC,CAACC,IAAI,CAACH;YACb;QACF;QAEA,IAAI,CAAC,CAACL,SAAS,GAAG;QAClB,IAAI,CAAC,CAACS,QAAQ;IAChB;IAEA,CAACC,UAAU,CAACH,IAAmB;QAC7B,IAAI;YACF,IAAI,CAAC,CAACV,MAAM,CAACU;QACf,EAAE,OAAOI,KAAK;YACZC,QAAQC,KAAK,CAACF;QAChB;IACF;IAEA,CAACG,OAAO;QACN,IAAI,CAAC,CAAChB,cAAc,GAAG;QAEvB,MAAO,IAAI,CAAC,CAACC,KAAK,CAACO,MAAM,CAAE;YACzB,MAAMC,OAAO,IAAI,CAAC,CAACR,KAAK,CAACgB,KAAK;YAC9B,IAAI,CAACR,MAAM;gBACT;YACF;YAEA,IAAI,CAAC,CAACG,UAAU,CAACH;QACnB;QAEA,IAAI,CAAC,CAACE,QAAQ;IAChB;IAEA,CAACD,IAAI,CAACD,IAAY;QAChB,IAAI,CAAC,CAACR,KAAK,CAACS,IAAI,CAACD;QAEjB,IAAI,IAAI,CAAC,CAACT,cAAc,EAAE;YACxB;QACF;QAEA,IAAI,CAAC,CAACA,cAAc,GAAG;QAEvBkB,WAAW,IAAM,IAAI,CAAC,CAACF,OAAO,IAAI;IACpC;IAEA,CAACL,QAAQ;QACP,IAAI,IAAI,CAAC,CAACT,SAAS,KAAK,YAAY;YAClC;QACF;QAEA,IAAI,IAAI,CAAC,CAACD,KAAK,CAACO,MAAM,EAAE;YACtB;QACF;QAEA,IAAI,CAAC,CAACI,UAAU,CAAC;QACjB,IAAI,CAACO,IAAI,CAAC,YAAY,IAAI;IAC5B;AACF"}
@@ -1,32 +0,0 @@
1
- import { TokenizeTagEvent, TokenizeTextEvent } from "../tokenize/Tokenize";
2
- export declare class Queue implements AsyncEventEmitter<QueueEventMap> {
3
- #private;
4
- get tokenQueue(): TokenizeEvent[];
5
- on<E extends keyof QueueEventMap>(eventName: Listeners<QueueEventMap, E>["eventName"], listener: Listeners<QueueEventMap, E>["listener"]): this;
6
- push(token: TokenizeEvent): Promise<void>;
7
- }
8
- export declare class QueueError<D extends TokenizeAllEvent | TokenizeAllEvent[] = TokenizeAllEvent> extends Error {
9
- readonly data: D;
10
- constructor(message: string, token: D);
11
- }
12
- interface AsyncEventEmitter<T extends object, K extends keyof T = keyof T> {
13
- on: (eventName: K, listener: (event: T[K]) => Promise<void>) => AsyncEventEmitter<T>;
14
- }
15
- interface Listeners<T extends object, K extends keyof T = keyof T> {
16
- eventName: K;
17
- listener: (event: T[K]) => Promise<void>;
18
- }
19
- export type TokenizeAllEvent = TokenizeTagEvent | TokenizeTextEvent;
20
- type TokenizeEvent = TokenizeAllEvent | null;
21
- type QueueEventMap = {
22
- comment: TokenizeTagEvent;
23
- error: QueueError<TokenizeAllEvent | TokenizeAllEvent[]>;
24
- implicit: TokenizeTagEvent;
25
- inactive: undefined;
26
- inverted: TokenizeAllEvent[];
27
- partial: TokenizeTagEvent;
28
- section: TokenizeAllEvent[];
29
- text: TokenizeTextEvent;
30
- variable: TokenizeTagEvent;
31
- };
32
- export {};
@@ -1,181 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- Queue: function() {
13
- return Queue;
14
- },
15
- QueueError: function() {
16
- return QueueError;
17
- }
18
- });
19
- const _logger = require("@funcstache/logger");
20
- let Queue = class Queue {
21
- #logger;
22
- #active;
23
- #listeners;
24
- #accumulator;
25
- #tokenQueue;
26
- get tokenQueue() {
27
- return Array.from(this.#tokenQueue);
28
- }
29
- on(eventName, listener) {
30
- if (!this.#listeners.some(({ eventName: evn, listener: lst })=>eventName === evn && listener === lst)) {
31
- const l = listener;
32
- this.#listeners.push({
33
- eventName,
34
- listener: l
35
- });
36
- }
37
- return this;
38
- }
39
- async push(token) {
40
- // this.#logger.debug(() => [`••• push: token=`, token]);
41
- this.#tokenQueue.push(token);
42
- this.#processToken();
43
- }
44
- async #emit(eventName, event) {
45
- for (const item of this.#listeners){
46
- if (item.eventName !== eventName) {
47
- continue;
48
- }
49
- this.#logger.debug(()=>[
50
- `••• #emit: event=`,
51
- event
52
- ]);
53
- await item.listener(event);
54
- }
55
- }
56
- async #processToken() {
57
- if (this.#active) {
58
- return;
59
- }
60
- this.#active = true;
61
- const token = this.#tokenQueue.shift();
62
- if (token === undefined) {
63
- return;
64
- }
65
- // this.#logger.debug(() => [
66
- // `••• #processToken: token='${JSON.stringify(token)}'`,
67
- // ]);
68
- if (token === null) {
69
- await this.#emit("inactive", undefined);
70
- return;
71
- }
72
- if (token.type === "text") {
73
- if (this.#accumulator) {
74
- this.#accumulator.push(token);
75
- } else {
76
- await this.#emit("text", token);
77
- }
78
- } else if (token.type === "tag") {
79
- // this.#logger.debug(() => [
80
- // ` #processToken: token type='${token.data.type}'`,
81
- // ]);
82
- switch(token.data.type){
83
- case "comment":
84
- case "implicit":
85
- case "partial":
86
- case "variable":
87
- {
88
- if (this.#accumulator) {
89
- this.#accumulator.push(token);
90
- } else {
91
- await this.#emit(token.data.type, token);
92
- }
93
- break;
94
- }
95
- case "inverted":
96
- case "section":
97
- {
98
- if (!this.#accumulator) {
99
- const acc = [
100
- token
101
- ];
102
- acc.level = 0;
103
- this.#accumulator = acc;
104
- } else {
105
- this.#accumulator.level++;
106
- this.#accumulator.push(token);
107
- }
108
- break;
109
- }
110
- case "end":
111
- {
112
- if (!this.#accumulator) {
113
- this.#emit("error", new QueueError(`Received end tag '${token.data.value}' without a start tag.`, token));
114
- break;
115
- }
116
- // Received an end tag, but we are not at the lowest level. Add this tag to the
117
- // accumulator and reduce the level by one then exit.
118
- if (0 < this.#accumulator.level) {
119
- this.#accumulator.level--;
120
- this.#accumulator.push(token);
121
- break;
122
- }
123
- // We are at accumulator level 0 so if we've done everything right thing we should emit a
124
- // "section" event with all the accumulated tags...
125
- const start = this.#accumulator[0];
126
- if (!isTagEvent(start)) {
127
- this.#emit("error", new QueueError(`The start tag '${JSON.stringify(start)}' is not a TokenizeTagEvent.`, start));
128
- break;
129
- }
130
- if (start.data.key !== token.data.key) {
131
- this.#emit("error", new QueueError(`The start tag '${JSON.stringify(start)}' does not match the end tag '${JSON.stringify(token)}'`, [
132
- start,
133
- token
134
- ]));
135
- break;
136
- }
137
- if (start.data.type === "inverted" || start.data.type === "section") {
138
- await this.#emit(start.data.type, [
139
- ...Array.from(this.#accumulator),
140
- token
141
- ]);
142
- this.#accumulator = undefined;
143
- } else {
144
- this.#emit("error", new QueueError(`The start tag '${JSON.stringify(start)}' is not a section tag`, start));
145
- }
146
- break;
147
- }
148
- }
149
- }
150
- // this.#logger.debug(() => [
151
- // ` #processToken: this.#accumulator.level=${
152
- // this.#accumulator?.level
153
- // }, this.#accumulator='${JSON.stringify(this.#accumulator)}'`,
154
- // ,
155
- // ]);
156
- this.#active = false;
157
- if (this.#tokenQueue.length) {
158
- this.#processToken();
159
- }
160
- }
161
- constructor(){
162
- this.#logger = new _logger.Log({
163
- category: "QUE",
164
- level: process.env.LOG_LEVEL || "warn"
165
- });
166
- this.#active = false;
167
- this.#listeners = [];
168
- this.#tokenQueue = [];
169
- }
170
- };
171
- let QueueError = class QueueError extends Error {
172
- constructor(message, token){
173
- super(message);
174
- this.data = token;
175
- }
176
- };
177
- function isTagEvent(obj) {
178
- return obj && "type" in obj && obj.type === "tag";
179
- }
180
-
181
- //# sourceMappingURL=Queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../libs/stache-stream/src/lib/queue/Queue.ts"],"sourcesContent":["import { Log } from \"@funcstache/logger\";\nimport { TokenizeTagEvent, TokenizeTextEvent } from \"../tokenize/Tokenize\";\n\nexport class Queue implements AsyncEventEmitter<QueueEventMap> {\n #logger = new Log({\n category: \"QUE\",\n level: (process.env as any).LOG_LEVEL || \"warn\",\n });\n\n #active = false;\n #listeners: Listeners<QueueEventMap>[] = [];\n #accumulator: Accumulator | undefined;\n #tokenQueue: TokenizeEvent[] = [];\n\n get tokenQueue() {\n return Array.from(this.#tokenQueue);\n }\n\n on<E extends keyof QueueEventMap>(\n eventName: Listeners<QueueEventMap, E>[\"eventName\"],\n listener: Listeners<QueueEventMap, E>[\"listener\"]\n ) {\n if (\n !this.#listeners.some(\n ({ eventName: evn, listener: lst }) =>\n eventName === evn && listener === lst\n )\n ) {\n const l = listener as any;\n this.#listeners.push({ eventName, listener: l });\n }\n\n return this;\n }\n\n async push(token: TokenizeEvent): Promise<void> {\n // this.#logger.debug(() => [`••• push: token=`, token]);\n\n this.#tokenQueue.push(token);\n this.#processToken();\n }\n\n async #emit<K extends keyof QueueEventMap>(\n eventName: K,\n event: QueueEventMap[K]\n ): Promise<void> {\n for (const item of this.#listeners) {\n if (item.eventName !== eventName) {\n continue;\n }\n\n this.#logger.debug(() => [`••• #emit: event=`, event]);\n await item.listener(event);\n }\n }\n\n async #processToken(): Promise<void> {\n if (this.#active) {\n return;\n }\n\n this.#active = true;\n\n const token = this.#tokenQueue.shift();\n if (token === undefined) {\n return;\n }\n\n // this.#logger.debug(() => [\n // `••• #processToken: token='${JSON.stringify(token)}'`,\n // ]);\n\n if (token === null) {\n await this.#emit(\"inactive\", undefined);\n return;\n }\n\n if (token.type === \"text\") {\n if (this.#accumulator) {\n this.#accumulator.push(token);\n } else {\n await this.#emit(\"text\", token);\n }\n } else if (token.type === \"tag\") {\n // this.#logger.debug(() => [\n // ` #processToken: token type='${token.data.type}'`,\n // ]);\n\n switch (token.data.type) {\n case \"comment\":\n case \"implicit\":\n case \"partial\":\n case \"variable\": {\n if (this.#accumulator) {\n this.#accumulator.push(token);\n } else {\n await this.#emit(token.data.type, token);\n }\n\n break;\n }\n\n case \"inverted\":\n case \"section\": {\n if (!this.#accumulator) {\n const acc: Accumulator = [token] as any;\n acc.level = 0;\n this.#accumulator = acc;\n } else {\n this.#accumulator.level++;\n this.#accumulator.push(token);\n }\n\n break;\n }\n\n case \"end\": {\n if (!this.#accumulator) {\n this.#emit(\n \"error\",\n new QueueError<TokenizeAllEvent>(\n `Received end tag '${token.data.value}' without a start tag.`,\n token\n )\n );\n break;\n }\n\n // Received an end tag, but we are not at the lowest level. Add this tag to the\n // accumulator and reduce the level by one then exit.\n if (0 < this.#accumulator.level) {\n this.#accumulator.level--;\n this.#accumulator.push(token);\n break;\n }\n\n // We are at accumulator level 0 so if we've done everything right thing we should emit a\n // \"section\" event with all the accumulated tags...\n const start = this.#accumulator[0];\n if (!isTagEvent(start)) {\n this.#emit(\n \"error\",\n new QueueError<TokenizeAllEvent>(\n `The start tag '${JSON.stringify(\n start\n )}' is not a TokenizeTagEvent.`,\n start\n )\n );\n break;\n }\n\n if (start.data.key !== token.data.key) {\n this.#emit(\n \"error\",\n new QueueError<TokenizeAllEvent[]>(\n `The start tag '${JSON.stringify(\n start\n )}' does not match the end tag '${JSON.stringify(token)}'`,\n [start, token]\n )\n );\n break;\n }\n\n if (\n start.data.type === \"inverted\" ||\n start.data.type === \"section\"\n ) {\n await this.#emit(start.data.type, [\n ...Array.from(this.#accumulator),\n token,\n ]);\n\n this.#accumulator = undefined;\n } else {\n this.#emit(\n \"error\",\n new QueueError<TokenizeAllEvent>(\n `The start tag '${JSON.stringify(start)}' is not a section tag`,\n start\n )\n );\n }\n\n break;\n }\n }\n }\n\n // this.#logger.debug(() => [\n // ` #processToken: this.#accumulator.level=${\n // this.#accumulator?.level\n // }, this.#accumulator='${JSON.stringify(this.#accumulator)}'`,\n // ,\n // ]);\n\n this.#active = false;\n\n if (this.#tokenQueue.length) {\n this.#processToken();\n }\n }\n}\n\nexport class QueueError<\n D extends TokenizeAllEvent | TokenizeAllEvent[] = TokenizeAllEvent\n> extends Error {\n readonly data: D;\n\n constructor(message: string, token: D) {\n super(message);\n\n this.data = token;\n }\n}\n\nfunction isTagEvent(obj: any): obj is TokenizeTagEvent {\n return obj && \"type\" in obj && obj.type === \"tag\";\n}\n\ninterface AsyncEventEmitter<T extends object, K extends keyof T = keyof T> {\n on: (\n eventName: K,\n listener: (event: T[K]) => Promise<void>\n ) => AsyncEventEmitter<T>;\n}\n\ntype Accumulator = TokenizeAllEvent[] & {\n level: number;\n};\n\ninterface Listeners<T extends object, K extends keyof T = keyof T> {\n eventName: K;\n listener: (event: T[K]) => Promise<void>;\n}\n\nexport type TokenizeAllEvent = TokenizeTagEvent | TokenizeTextEvent;\n\ntype TokenizeEvent = TokenizeAllEvent | null;\n\ntype QueueEventMap = {\n comment: TokenizeTagEvent;\n // end: TokenizeTagEvent;\n error: QueueError<TokenizeAllEvent | TokenizeAllEvent[]>;\n implicit: TokenizeTagEvent;\n inactive: undefined;\n inverted: TokenizeAllEvent[];\n partial: TokenizeTagEvent;\n section: TokenizeAllEvent[];\n text: TokenizeTextEvent;\n variable: TokenizeTagEvent;\n};\n"],"names":["Queue","QueueError","logger","active","listeners","accumulator","tokenQueue","Array","from","on","eventName","listener","some","evn","lst","l","push","token","processToken","emit","event","item","debug","shift","undefined","type","data","acc","level","value","start","isTagEvent","JSON","stringify","key","length","Log","category","process","env","LOG_LEVEL","Error","constructor","message","obj"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { TransformStream } from "node:stream/web";
2
- import type { ContextProvider } from "../types";
3
- /**
4
- * A {@link https://nodejs.org/api/webstreams.html#class-transformstream TransformStream} that
5
- * renders a Mustache template.
6
- *
7
- * @remarks
8
- * The incoming {@link https://nodejs.org/api/webstreams.html#class-readablestream ReadableStream}
9
- * provides the contents of a Mustache template. The stream is processed by StacheStreamTransform
10
- * which emits the rendered Mustache template. The information needed to render the template is made
11
- * available through `options` by the `ContextProvider`.
12
- */
13
- export declare class StacheTransformStream extends TransformStream<string, string> {
14
- /**
15
- * @param options Options needed to render a Mustache template stream.
16
- * @param options.contextProvider The `ContextProvider` is used during the render process to
17
- * access the context for tags.
18
- */
19
- constructor(options?: {
20
- contextProvider?: ContextProvider;
21
- });
22
- }
@@ -1,71 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "StacheTransformStream", {
6
- enumerable: true,
7
- get: function() {
8
- return StacheTransformStream;
9
- }
10
- });
11
- const _web = require("node:stream/web");
12
- const _Template = require("../template/Template");
13
- let StacheTransformStream = class StacheTransformStream extends _web.TransformStream {
14
- /**
15
- * @param options Options needed to render a Mustache template stream.
16
- * @param options.contextProvider The `ContextProvider` is used during the render process to
17
- * access the context for tags.
18
- */ constructor(options){
19
- const { readable, push, close } = createReadableProducer();
20
- let resolveInactive;
21
- let rejectInactive;
22
- const waitInactive = new Promise((resolve, reject)=>{
23
- resolveInactive = resolve;
24
- rejectInactive = reject;
25
- });
26
- super({
27
- start (controller) {
28
- new _Template.Template({
29
- contextProvider: options?.contextProvider,
30
- readable,
31
- writeToOutput: async (text)=>{
32
- try {
33
- controller.enqueue(text);
34
- } catch (err) {
35
- rejectInactive(err);
36
- throw err;
37
- }
38
- }
39
- }).on("inactive", ()=>resolveInactive()).read();
40
- },
41
- transform (chunk) {
42
- push(chunk);
43
- },
44
- async flush (controller) {
45
- close();
46
- try {
47
- await waitInactive;
48
- } catch (err) {
49
- controller.error(err);
50
- }
51
- }
52
- });
53
- }
54
- };
55
- function createReadableProducer() {
56
- let pushChunk;
57
- let closeStream;
58
- const readable = new _web.ReadableStream({
59
- start (controller) {
60
- pushChunk = controller.enqueue.bind(controller);
61
- closeStream = controller.close.bind(controller);
62
- }
63
- });
64
- return {
65
- readable,
66
- push: pushChunk,
67
- close: closeStream
68
- };
69
- }
70
-
71
- //# sourceMappingURL=StacheStream.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../libs/stache-stream/src/lib/stache-stream/StacheStream.ts"],"sourcesContent":["import { ReadableStream, TransformStream } from \"node:stream/web\";\nimport type { ContextProvider } from \"../types\";\nimport { Template } from \"../template/Template\";\n\n/**\n * A {@link https://nodejs.org/api/webstreams.html#class-transformstream TransformStream} that\n * renders a Mustache template.\n *\n * @remarks\n * The incoming {@link https://nodejs.org/api/webstreams.html#class-readablestream ReadableStream}\n * provides the contents of a Mustache template. The stream is processed by StacheStreamTransform\n * which emits the rendered Mustache template. The information needed to render the template is made\n * available through `options` by the `ContextProvider`.\n */\nexport class StacheTransformStream extends TransformStream<string, string> {\n /**\n * @param options Options needed to render a Mustache template stream.\n * @param options.contextProvider The `ContextProvider` is used during the render process to\n * access the context for tags.\n */\n constructor(options?: { contextProvider?: ContextProvider }) {\n const { readable, push, close } = createReadableProducer<string>();\n\n let resolveInactive!: () => void;\n let rejectInactive!: (err: unknown) => void;\n const waitInactive = new Promise<void>((resolve, reject) => {\n resolveInactive = resolve;\n rejectInactive = reject;\n });\n\n super({\n start(controller) {\n new Template({\n contextProvider: options?.contextProvider,\n readable,\n writeToOutput: async (text: string) => {\n try {\n controller.enqueue(text);\n } catch (err) {\n rejectInactive(err);\n throw err;\n }\n },\n })\n .on(\"inactive\", () => resolveInactive())\n .read();\n },\n transform(chunk) {\n push(chunk);\n },\n async flush(controller) {\n close();\n try {\n await waitInactive;\n } catch (err) {\n controller.error(err);\n }\n },\n });\n }\n}\n\nfunction createReadableProducer<T>(): {\n readable: ReadableStream<T>;\n push: (chunk: T) => void;\n close: () => void;\n} {\n let pushChunk!: (chunk: T) => void;\n let closeStream!: () => void;\n\n const readable = new ReadableStream<T>({\n start(controller) {\n pushChunk = controller.enqueue.bind(controller);\n closeStream = controller.close.bind(controller);\n },\n });\n\n return { readable, push: pushChunk, close: closeStream };\n}\n"],"names":["StacheTransformStream","TransformStream","constructor","options","readable","push","close","createReadableProducer","resolveInactive","rejectInactive","waitInactive","Promise","resolve","reject","start","controller","Template","contextProvider","writeToOutput","text","enqueue","err","on","read","transform","chunk","flush","error","pushChunk","closeStream","ReadableStream","bind"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAcaA;;;eAAAA;;;qBAdmC;0BAEvB;AAYlB,IAAA,AAAMA,wBAAN,MAAMA,8BAA8BC,oBAAe;IACxD;;;;GAIC,GACDC,YAAYC,OAA+C,CAAE;QAC3D,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAGC;QAElC,IAAIC;QACJ,IAAIC;QACJ,MAAMC,eAAe,IAAIC,QAAc,CAACC,SAASC;YAC/CL,kBAAkBI;YAClBH,iBAAiBI;QACnB;QAEA,KAAK,CAAC;YACJC,OAAMC,UAAU;gBACd,IAAIC,kBAAQ,CAAC;oBACXC,iBAAiBd,SAASc;oBAC1Bb;oBACAc,eAAe,OAAOC;wBACpB,IAAI;4BACFJ,WAAWK,OAAO,CAACD;wBACrB,EAAE,OAAOE,KAAK;4BACZZ,eAAeY;4BACf,MAAMA;wBACR;oBACF;gBACF,GACGC,EAAE,CAAC,YAAY,IAAMd,mBACrBe,IAAI;YACT;YACAC,WAAUC,KAAK;gBACbpB,KAAKoB;YACP;YACA,MAAMC,OAAMX,UAAU;gBACpBT;gBACA,IAAI;oBACF,MAAMI;gBACR,EAAE,OAAOW,KAAK;oBACZN,WAAWY,KAAK,CAACN;gBACnB;YACF;QACF;IACF;AACF;AAEA,SAASd;IAKP,IAAIqB;IACJ,IAAIC;IAEJ,MAAMzB,WAAW,IAAI0B,mBAAc,CAAI;QACrChB,OAAMC,UAAU;YACda,YAAYb,WAAWK,OAAO,CAACW,IAAI,CAAChB;YACpCc,cAAcd,WAAWT,KAAK,CAACyB,IAAI,CAAChB;QACtC;IACF;IAEA,OAAO;QAAEX;QAAUC,MAAMuB;QAAWtB,OAAOuB;IAAY;AACzD"}
@@ -1,33 +0,0 @@
1
- import { ContentTagTagTypes, Tag as TagType, ValueTagTagTypes } from "../types";
2
- export declare class Tag implements TagType {
3
- #private;
4
- constructor(options: TagOptions);
5
- get content(): string | null;
6
- get dynamic(): boolean;
7
- /** This should match a key in the Context associated with the template. */
8
- get key(): string;
9
- get raw(): boolean;
10
- get type(): ValueTagTagTypes | ContentTagTagTypes;
11
- get value(): string;
12
- /** The `value` passed to the constructor via the `option` parameter. Only really useful for
13
- * logging; prefer the `Tag.value` property. */
14
- get valueOption(): string;
15
- static copy(tag: Tag, options?: Partial<Omit<TagOptions, "value"> & {
16
- key?: string;
17
- }>): Tag;
18
- static parse(tag: string, tokens?: [enter: string, exit: string]): Tag | undefined;
19
- appendContent(text: string): void;
20
- toJSON(): string;
21
- toString(): string;
22
- }
23
- export interface TagAttributes {
24
- dynamic?: boolean;
25
- raw: boolean;
26
- tagType?: ContentTagTagTypes | ValueTagTagTypes;
27
- }
28
- interface TagOptions {
29
- rawBraces?: boolean;
30
- content?: string;
31
- value: string;
32
- }
33
- export {};