@livetemplate/client 0.1.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 (100) hide show
  1. package/README.md +179 -0
  2. package/dist/constants.d.ts +2 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +19 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/dom/directives.d.ts +13 -0
  7. package/dist/dom/directives.d.ts.map +1 -0
  8. package/dist/dom/directives.js +137 -0
  9. package/dist/dom/directives.js.map +1 -0
  10. package/dist/dom/event-delegation.d.ts +24 -0
  11. package/dist/dom/event-delegation.d.ts.map +1 -0
  12. package/dist/dom/event-delegation.js +437 -0
  13. package/dist/dom/event-delegation.js.map +1 -0
  14. package/dist/dom/focus-manager.d.ts +19 -0
  15. package/dist/dom/focus-manager.d.ts.map +1 -0
  16. package/dist/dom/focus-manager.js +144 -0
  17. package/dist/dom/focus-manager.js.map +1 -0
  18. package/dist/dom/form-disabler.d.ts +8 -0
  19. package/dist/dom/form-disabler.d.ts.map +1 -0
  20. package/dist/dom/form-disabler.js +32 -0
  21. package/dist/dom/form-disabler.js.map +1 -0
  22. package/dist/dom/loading-indicator.d.ts +9 -0
  23. package/dist/dom/loading-indicator.d.ts.map +1 -0
  24. package/dist/dom/loading-indicator.js +50 -0
  25. package/dist/dom/loading-indicator.js.map +1 -0
  26. package/dist/dom/modal-manager.d.ts +11 -0
  27. package/dist/dom/modal-manager.d.ts.map +1 -0
  28. package/dist/dom/modal-manager.js +62 -0
  29. package/dist/dom/modal-manager.js.map +1 -0
  30. package/dist/dom/observer-manager.d.ts +19 -0
  31. package/dist/dom/observer-manager.d.ts.map +1 -0
  32. package/dist/dom/observer-manager.js +64 -0
  33. package/dist/dom/observer-manager.js.map +1 -0
  34. package/dist/livetemplate-client.browser.js +44 -0
  35. package/dist/livetemplate-client.browser.js.map +7 -0
  36. package/dist/livetemplate-client.d.ts +106 -0
  37. package/dist/livetemplate-client.d.ts.map +1 -0
  38. package/dist/livetemplate-client.js +507 -0
  39. package/dist/livetemplate-client.js.map +1 -0
  40. package/dist/state/form-lifecycle-manager.d.ts +19 -0
  41. package/dist/state/form-lifecycle-manager.d.ts.map +1 -0
  42. package/dist/state/form-lifecycle-manager.js +64 -0
  43. package/dist/state/form-lifecycle-manager.js.map +1 -0
  44. package/dist/state/tree-renderer.d.ts +27 -0
  45. package/dist/state/tree-renderer.d.ts.map +1 -0
  46. package/dist/state/tree-renderer.js +359 -0
  47. package/dist/state/tree-renderer.js.map +1 -0
  48. package/dist/tests/event-delegation.test.d.ts +2 -0
  49. package/dist/tests/event-delegation.test.d.ts.map +1 -0
  50. package/dist/tests/event-delegation.test.js +102 -0
  51. package/dist/tests/event-delegation.test.js.map +1 -0
  52. package/dist/tests/focus-manager.test.d.ts +2 -0
  53. package/dist/tests/focus-manager.test.d.ts.map +1 -0
  54. package/dist/tests/focus-manager.test.js +45 -0
  55. package/dist/tests/focus-manager.test.js.map +1 -0
  56. package/dist/tests/form-disabler.test.d.ts +2 -0
  57. package/dist/tests/form-disabler.test.d.ts.map +1 -0
  58. package/dist/tests/form-disabler.test.js +35 -0
  59. package/dist/tests/form-disabler.test.js.map +1 -0
  60. package/dist/tests/form-lifecycle-manager.test.d.ts +2 -0
  61. package/dist/tests/form-lifecycle-manager.test.d.ts.map +1 -0
  62. package/dist/tests/form-lifecycle-manager.test.js +90 -0
  63. package/dist/tests/form-lifecycle-manager.test.js.map +1 -0
  64. package/dist/tests/modal-manager.test.d.ts +2 -0
  65. package/dist/tests/modal-manager.test.d.ts.map +1 -0
  66. package/dist/tests/modal-manager.test.js +80 -0
  67. package/dist/tests/modal-manager.test.js.map +1 -0
  68. package/dist/tests/rate-limit.test.d.ts +2 -0
  69. package/dist/tests/rate-limit.test.d.ts.map +1 -0
  70. package/dist/tests/rate-limit.test.js +38 -0
  71. package/dist/tests/rate-limit.test.js.map +1 -0
  72. package/dist/tests/test-conditional-debug.test.d.ts +8 -0
  73. package/dist/tests/test-conditional-debug.test.d.ts.map +1 -0
  74. package/dist/tests/test-conditional-debug.test.js +187 -0
  75. package/dist/tests/test-conditional-debug.test.js.map +1 -0
  76. package/dist/tests/test-reconstruction.test.d.ts +8 -0
  77. package/dist/tests/test-reconstruction.test.d.ts.map +1 -0
  78. package/dist/tests/test-reconstruction.test.js +284 -0
  79. package/dist/tests/test-reconstruction.test.js.map +1 -0
  80. package/dist/transport/websocket.d.ts +62 -0
  81. package/dist/transport/websocket.d.ts.map +1 -0
  82. package/dist/transport/websocket.js +194 -0
  83. package/dist/transport/websocket.js.map +1 -0
  84. package/dist/types.d.ts +34 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +3 -0
  87. package/dist/types.js.map +1 -0
  88. package/dist/utils/logger.d.ts +32 -0
  89. package/dist/utils/logger.d.ts.map +1 -0
  90. package/dist/utils/logger.js +77 -0
  91. package/dist/utils/logger.js.map +1 -0
  92. package/dist/utils/rate-limit.d.ts +10 -0
  93. package/dist/utils/rate-limit.d.ts.map +1 -0
  94. package/dist/utils/rate-limit.js +37 -0
  95. package/dist/utils/rate-limit.js.map +1 -0
  96. package/dist/utils/testing.d.ts +14 -0
  97. package/dist/utils/testing.d.ts.map +1 -0
  98. package/dist/utils/testing.js +51 -0
  99. package/dist/utils/testing.js.map +1 -0
  100. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAUtE,UAAU,QAAQ;IAChB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAMD;;GAEG;AACH,qBAAa,MAAM;IAEf,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,QAAQ,EACf,KAAK,GAAE,MAAM,EAAO,EACpB,IAAI,GAAE,OAAiB;IAG1C,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,QAAQ,IAAI,QAAQ;IAIpB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI5B,cAAc,IAAI,OAAO;IAIzB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI9B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI9B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI/B,OAAO,CAAC,GAAG;IAYX,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;CAOrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAYhE"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Logger = void 0;
4
+ exports.createLogger = createLogger;
5
+ const levelPriority = {
6
+ silent: 0,
7
+ error: 1,
8
+ warn: 2,
9
+ info: 3,
10
+ debug: 4,
11
+ };
12
+ const DEFAULT_SCOPE = "LiveTemplate";
13
+ /**
14
+ * Lightweight console logger with support for log levels and scoped prefixes.
15
+ */
16
+ class Logger {
17
+ constructor(state, scope = [], sink = console) {
18
+ this.state = state;
19
+ this.scope = scope;
20
+ this.sink = sink;
21
+ }
22
+ setLevel(level) {
23
+ this.state.level = level;
24
+ }
25
+ getLevel() {
26
+ return this.state.level;
27
+ }
28
+ child(scope) {
29
+ return new Logger(this.state, [...this.scope, scope], this.sink);
30
+ }
31
+ isDebugEnabled() {
32
+ return this.shouldLog("debug");
33
+ }
34
+ error(...args) {
35
+ this.log("error", "error", args);
36
+ }
37
+ warn(...args) {
38
+ this.log("warn", "warn", args);
39
+ }
40
+ info(...args) {
41
+ this.log("info", "info", args);
42
+ }
43
+ debug(...args) {
44
+ this.log("debug", "debug", args);
45
+ }
46
+ log(level, method, args) {
47
+ if (!this.shouldLog(level)) {
48
+ return;
49
+ }
50
+ const target = this.sink[method] ||
51
+ console[method] ||
52
+ console.log;
53
+ target.apply(this.sink, [this.formatPrefix(), ...args]);
54
+ }
55
+ shouldLog(level) {
56
+ return levelPriority[level] <= levelPriority[this.state.level];
57
+ }
58
+ formatPrefix() {
59
+ if (this.scope.length === 0) {
60
+ return `[${DEFAULT_SCOPE}]`;
61
+ }
62
+ return `[${DEFAULT_SCOPE}:${this.scope.join(":")}]`;
63
+ }
64
+ }
65
+ exports.Logger = Logger;
66
+ function createLogger(options = {}) {
67
+ const state = {
68
+ level: options.level ?? "info",
69
+ };
70
+ const scope = Array.isArray(options.scope)
71
+ ? options.scope
72
+ : options.scope
73
+ ? [options.scope]
74
+ : [];
75
+ return new Logger(state, scope, options.sink ?? console);
76
+ }
77
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Debounce function: delays execution until after a pause in calls
3
+ */
4
+ export declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number): (...args: Parameters<T>) => void;
5
+ /**
6
+ * Throttle function: limits execution to at most once per time period
7
+ * First call executes immediately, subsequent calls are delayed
8
+ */
9
+ export declare function throttle<T extends (...args: any[]) => any>(func: T, limit: number): (...args: Parameters<T>) => void;
10
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../utils/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAclC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAelC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.debounce = debounce;
4
+ exports.throttle = throttle;
5
+ /**
6
+ * Debounce function: delays execution until after a pause in calls
7
+ */
8
+ function debounce(func, wait) {
9
+ let timeout = null;
10
+ return function debounceWrapper(...args) {
11
+ const context = this;
12
+ if (timeout !== null) {
13
+ clearTimeout(timeout);
14
+ }
15
+ timeout = window.setTimeout(() => {
16
+ func.apply(context, args);
17
+ }, wait);
18
+ };
19
+ }
20
+ /**
21
+ * Throttle function: limits execution to at most once per time period
22
+ * First call executes immediately, subsequent calls are delayed
23
+ */
24
+ function throttle(func, limit) {
25
+ let inThrottle = false;
26
+ return function throttleWrapper(...args) {
27
+ const context = this;
28
+ if (!inThrottle) {
29
+ func.apply(context, args);
30
+ inThrottle = true;
31
+ setTimeout(() => {
32
+ inThrottle = false;
33
+ }, limit);
34
+ }
35
+ };
36
+ }
37
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../utils/rate-limit.ts"],"names":[],"mappings":";;AAGA,4BAiBC;AAMD,4BAkBC;AA5CD;;GAEG;AACH,SAAgB,QAAQ,CACtB,IAAO,EACP,IAAY;IAEZ,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,OAAO,SAAS,eAAe,CAAgB,GAAG,IAAmB;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC;QAErB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,QAAQ,CACtB,IAAO,EACP,KAAa;IAEb,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,OAAO,SAAS,eAAe,CAAgB,GAAG,IAAmB;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,UAAU,GAAG,IAAI,CAAC;YAElB,UAAU,CAAC,GAAG,EAAE;gBACd,UAAU,GAAG,KAAK,CAAC;YACrB,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { LiveTemplateClient } from "../livetemplate-client";
2
+ import type { UpdateResult } from "../types";
3
+ /**
4
+ * Utility function to load and apply updates from JSON files.
5
+ */
6
+ export declare function loadAndApplyUpdate(client: LiveTemplateClient, updatePath: string): Promise<UpdateResult>;
7
+ /**
8
+ * Compare two HTML strings, ignoring whitespace differences.
9
+ */
10
+ export declare function compareHTML(expected: string, actual: string): {
11
+ match: boolean;
12
+ differences: string[];
13
+ };
14
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../utils/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,CAevB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IACD,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CA8BA"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadAndApplyUpdate = loadAndApplyUpdate;
4
+ exports.compareHTML = compareHTML;
5
+ /**
6
+ * Utility function to load and apply updates from JSON files.
7
+ */
8
+ async function loadAndApplyUpdate(client, updatePath) {
9
+ try {
10
+ const nodeRequire = globalThis?.require;
11
+ if (typeof nodeRequire === "function") {
12
+ const fs = nodeRequire("fs");
13
+ const updateData = JSON.parse(fs.readFileSync(updatePath, "utf8"));
14
+ return client.applyUpdate(updateData);
15
+ }
16
+ const response = await fetch(updatePath);
17
+ const updateData = await response.json();
18
+ return client.applyUpdate(updateData);
19
+ }
20
+ catch (error) {
21
+ throw new Error(`Failed to load update from ${updatePath}: ${error}`);
22
+ }
23
+ }
24
+ /**
25
+ * Compare two HTML strings, ignoring whitespace differences.
26
+ */
27
+ function compareHTML(expected, actual) {
28
+ const differences = [];
29
+ const normalizeHTML = (html) => {
30
+ return html.replace(/\s+/g, " ").replace(/>\s+</g, "><").trim();
31
+ };
32
+ const normalizedExpected = normalizeHTML(expected);
33
+ const normalizedActual = normalizeHTML(actual);
34
+ if (normalizedExpected === normalizedActual) {
35
+ return { match: true, differences: [] };
36
+ }
37
+ const expectedLines = normalizedExpected.split("\n");
38
+ const actualLines = normalizedActual.split("\n");
39
+ const maxLines = Math.max(expectedLines.length, actualLines.length);
40
+ for (let i = 0; i < maxLines; i++) {
41
+ const expectedLine = expectedLines[i] || "";
42
+ const actualLine = actualLines[i] || "";
43
+ if (expectedLine !== actualLine) {
44
+ differences.push(`Line ${i + 1}:`);
45
+ differences.push(` Expected: ${expectedLine}`);
46
+ differences.push(` Actual: ${actualLine}`);
47
+ }
48
+ }
49
+ return { match: false, differences };
50
+ }
51
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../utils/testing.ts"],"names":[],"mappings":";;AAMA,gDAkBC;AAKD,kCAoCC;AA9DD;;GAEG;AACI,KAAK,UAAU,kBAAkB,CACtC,MAA0B,EAC1B,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,WAAW,GAAI,UAAkB,EAAE,OAAO,CAAC;QACjD,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACnE,OAAO,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,KAAK,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CACzB,QAAgB,EAChB,MAAc;IAKd,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,kBAAkB,KAAK,gBAAgB,EAAE,CAAC;QAC5C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAEpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAExC,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,WAAW,CAAC,IAAI,CAAC,eAAe,YAAY,EAAE,CAAC,CAAC;YAChD,WAAW,CAAC,IAAI,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@livetemplate/client",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript client for LiveTemplate tree-based updates",
5
+ "main": "dist/livetemplate-client.js",
6
+ "browser": "dist/livetemplate-client.browser.js",
7
+ "types": "dist/livetemplate-client.d.ts",
8
+ "scripts": {
9
+ "build": "tsc && npm run build:browser",
10
+ "build:browser": "esbuild livetemplate-client.ts --bundle --format=iife --global-name=LiveTemplateClient --outfile=dist/livetemplate-client.browser.js --sourcemap --minify --target=es2018 --legal-comments=none",
11
+ "test": "jest --no-cache",
12
+ "test:reconstruction": "jest test-reconstruction",
13
+ "clean": "rm -rf dist",
14
+ "prepublishOnly": "npm run clean && npm run build"
15
+ },
16
+ "keywords": [
17
+ "livetemplate",
18
+ "html",
19
+ "tree-updates",
20
+ "phoenix-liveview",
21
+ "htmx",
22
+ "websocket",
23
+ "client"
24
+ ],
25
+ "author": "Adnaan Badr",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/livetemplate/livetemplate.git",
30
+ "directory": "client"
31
+ },
32
+ "homepage": "https://github.com/livetemplate/livetemplate#readme",
33
+ "bugs": {
34
+ "url": "https://github.com/livetemplate/livetemplate/issues"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "devDependencies": {
40
+ "@types/jest": "^30.0.0",
41
+ "@types/node": "^20.0.0",
42
+ "esbuild": "^0.25.10",
43
+ "jest": "^30.1.3",
44
+ "jest-environment-jsdom": "^30.2.0",
45
+ "ts-jest": "^29.4.4",
46
+ "typescript": "^5.0.0"
47
+ },
48
+ "files": [
49
+ "dist/**/*",
50
+ "README.md",
51
+ "LICENSE"
52
+ ],
53
+ "dependencies": {
54
+ "@types/morphdom": "^2.3.0",
55
+ "morphdom": "^2.7.7"
56
+ }
57
+ }