valyrian.js 9.0.0 → 9.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 (125) hide show
  1. package/README.md +14 -11
  2. package/dist/context/index.js +119 -0
  3. package/dist/context/index.js.map +7 -0
  4. package/dist/context/index.min.js +1 -0
  5. package/dist/context/index.min.js.map +1 -0
  6. package/dist/context/index.mjs +98 -0
  7. package/dist/context/index.mjs.map +7 -0
  8. package/dist/forms/index.js +26 -20
  9. package/dist/forms/index.js.map +2 -2
  10. package/dist/forms/index.min.js +1 -1
  11. package/dist/forms/index.min.js.map +1 -1
  12. package/dist/forms/index.mjs +27 -21
  13. package/dist/forms/index.mjs.map +2 -2
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +1 -1
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/lib/context/index.d.ts +13 -0
  19. package/dist/lib/context/index.d.ts.map +1 -0
  20. package/dist/lib/forms/index.d.ts +4 -0
  21. package/dist/lib/forms/index.d.ts.map +1 -1
  22. package/dist/lib/native-store/index.d.ts.map +1 -1
  23. package/dist/lib/node/utils/server-storage.d.ts +2 -0
  24. package/dist/lib/node/utils/server-storage.d.ts.map +1 -1
  25. package/dist/lib/pulses/index.d.ts +1 -1
  26. package/dist/lib/pulses/index.d.ts.map +1 -1
  27. package/dist/lib/request/index.d.ts.map +1 -1
  28. package/dist/lib/router/index.d.ts.map +1 -1
  29. package/dist/lib/translate/index.d.ts.map +1 -1
  30. package/dist/native-store/index.js +17 -3
  31. package/dist/native-store/index.js.map +2 -2
  32. package/dist/native-store/index.min.js +1 -1
  33. package/dist/native-store/index.min.js.map +1 -1
  34. package/dist/native-store/index.mjs +17 -3
  35. package/dist/native-store/index.mjs.map +2 -2
  36. package/dist/node/index.js +7 -1
  37. package/dist/node/index.js.map +2 -2
  38. package/dist/node/index.mjs +7 -1
  39. package/dist/node/index.mjs.map +2 -2
  40. package/dist/pulses/index.js +2 -2
  41. package/dist/pulses/index.js.map +2 -2
  42. package/dist/pulses/index.min.js +1 -1
  43. package/dist/pulses/index.min.js.map +1 -1
  44. package/dist/pulses/index.mjs +2 -2
  45. package/dist/pulses/index.mjs.map +2 -2
  46. package/dist/request/index.js +53 -3
  47. package/dist/request/index.js.map +2 -2
  48. package/dist/request/index.min.js +1 -1
  49. package/dist/request/index.min.js.map +1 -1
  50. package/dist/request/index.mjs +53 -3
  51. package/dist/request/index.mjs.map +2 -2
  52. package/dist/router/index.js +96 -72
  53. package/dist/router/index.js.map +2 -2
  54. package/dist/router/index.min.js +1 -1
  55. package/dist/router/index.min.js.map +1 -1
  56. package/dist/router/index.mjs +96 -72
  57. package/dist/router/index.mjs.map +2 -2
  58. package/dist/translate/index.js +13 -1
  59. package/dist/translate/index.js.map +2 -2
  60. package/dist/translate/index.min.js +1 -1
  61. package/dist/translate/index.min.js.map +1 -1
  62. package/dist/translate/index.mjs +14 -2
  63. package/dist/translate/index.mjs.map +2 -2
  64. package/dist/utils/index.js +1 -1
  65. package/dist/utils/index.js.map +1 -1
  66. package/dist/utils/index.min.js +1 -1
  67. package/dist/utils/index.min.js.map +1 -1
  68. package/dist/utils/index.mjs +1 -1
  69. package/dist/utils/index.mjs.map +1 -1
  70. package/docs/1-introduction.md +62 -0
  71. package/docs/10-meta-framework-cli.md +37 -0
  72. package/docs/11-roadmap-and-contribution.md +46 -0
  73. package/docs/2-getting-started.md +155 -0
  74. package/docs/3-the-essentials.md +358 -0
  75. package/docs/3.1-runtime-core.md +166 -0
  76. package/docs/4-building-spa.md +38 -0
  77. package/docs/4.1-routing-and-navigation.md +236 -0
  78. package/docs/4.2-data-fetching-and-async.md +51 -0
  79. package/docs/4.2.1-request.md +137 -0
  80. package/docs/4.2.2-suspense.md +57 -0
  81. package/docs/4.2.3-tasks.md +67 -0
  82. package/docs/4.2.4-query.md +112 -0
  83. package/docs/4.2.5-network.md +64 -0
  84. package/docs/4.2.6-offline.md +74 -0
  85. package/docs/4.3-forms.md +164 -0
  86. package/docs/5-advanced-state-management.md +52 -0
  87. package/docs/5.2-pulses.md +82 -0
  88. package/docs/5.3-flux-store.md +80 -0
  89. package/docs/5.4-redux-devtools.md +47 -0
  90. package/docs/6-optimization-and-performance.md +73 -0
  91. package/docs/7-full-stack-capability.md +45 -0
  92. package/docs/7.1-ssr.md +280 -0
  93. package/docs/7.1.1-node-runtime-apis.md +61 -0
  94. package/docs/7.2-isomorphic-networking-and-storage.md +188 -0
  95. package/docs/7.3-pwa-and-build-tooling.md +63 -0
  96. package/docs/7.3.1-sw-runtime.md +49 -0
  97. package/docs/7.4-server-context.md +48 -0
  98. package/docs/8-utilities-and-ecosystem.md +34 -0
  99. package/docs/8.1-translate.md +74 -0
  100. package/docs/8.2-money.md +74 -0
  101. package/docs/8.3-native-store.md +59 -0
  102. package/docs/8.4-utils.md +53 -0
  103. package/docs/9-recipes-and-integrations.md +60 -0
  104. package/docs/9.1-vite-integration.md +94 -0
  105. package/docs/9.2-webpack-rspack-integration.md +199 -0
  106. package/docs/9.3-express-fastify-ssr.md +510 -0
  107. package/docs/9.4-api-client-composition.md +99 -0
  108. package/docs/9.5-offline-first-commands.md +91 -0
  109. package/docs/9.6-production-checklist.md +26 -0
  110. package/docs/9.7-counter-variants-by-component-shape.md +212 -0
  111. package/docs/9.8-reactive-counter-variants.md +156 -0
  112. package/docs/toc.md +63 -0
  113. package/lib/context/index.ts +135 -0
  114. package/lib/forms/index.ts +35 -23
  115. package/lib/native-store/index.ts +20 -3
  116. package/lib/node/utils/server-storage.ts +8 -0
  117. package/lib/node/utils/tree-adapter.ts +1 -1
  118. package/lib/pulses/index.ts +3 -3
  119. package/lib/request/index.ts +66 -3
  120. package/lib/router/index.ts +104 -85
  121. package/lib/translate/index.ts +16 -2
  122. package/lib/utils/getter-setter.ts +1 -1
  123. package/llms-full.txt +4966 -0
  124. package/llms.txt +439 -0
  125. package/package.json +27 -40
package/README.md CHANGED
@@ -10,17 +10,17 @@
10
10
  ![](https://badgen.net/npm/types/valyrian.js)
11
11
  [![License](https://img.shields.io/github/license/masquerade-circus/valyrian.js.svg)](https://github.com/masquerade-circus/valyrian.js/blob/main/LICENSE)
12
12
 
13
- ![](https://badgen.net/badgesize/normal/masquerade-circus/valyrian.js/main/dist/index.min.js)
14
- ![](https://badgen.net/badgesize/gzip/masquerade-circus/valyrian.js/main/dist/index.min.js)
15
- ![](https://badgen.net/badgesize/brotli/masquerade-circus/valyrian.js/main/dist/index.min.js)
13
+ [![Minified size](assets/badges/size-min.svg)](dist/index.min.js)
14
+ [![Gzip size](assets/badges/size-gzip.svg)](dist/index.min.js)
15
+ [![Brotli size](assets/badges/size-brotli.svg)](dist/index.min.js)
16
16
 
17
- ![Travis (.org)](https://img.shields.io/travis/masquerade-circus/valyrian.js)
17
+ [![Test](https://github.com/Masquerade-Circus/valyrian.js/actions/workflows/test.yml/badge.svg)](https://github.com/Masquerade-Circus/valyrian.js/actions/workflows/test.yml)
18
18
  ![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/npm/valyrian.js)
19
- [![Maintainability](https://api.codeclimate.com/v1/badges/aa7528a4a6b0d264e4d6/maintainability)](https://codeclimate.com/github/Masquerade-Circus/valyrian.js/maintainability)
19
+ [![CodeQL](https://github.com/Masquerade-Circus/valyrian.js/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/Masquerade-Circus/valyrian.js/actions/workflows/codeql-analysis.yml)
20
20
  [![Codacy Badge](https://app.codacy.com/project/badge/Grade/8d5204c73bdc42089e4cebdb4b4d43e0)](https://www.codacy.com/gh/Masquerade-Circus/valyrian.js/dashboard?utm_source=github.com\&utm_medium=referral\&utm_content=Masquerade-Circus/valyrian.js\&utm_campaign=Badge_Grade)
21
21
 
22
22
  ![](https://img.shields.io/github/issues/masquerade-circus/valyrian.js.svg)
23
- [![Coverage Status](https://coveralls.io/repos/github/Masquerade-Circus/valyrian.js/badge.svg?branch=main)](https://coveralls.io/github/Masquerade-Circus/valyrian.js?branch=main)
23
+ [![Coverage](assets/badges/coverage.svg)](https://github.com/Masquerade-Circus/valyrian.js/actions/workflows/test.yml)
24
24
 
25
25
  </p>
26
26
 
@@ -92,7 +92,7 @@ If this works, you already have the core Valyrian mental model.
92
92
  * Introduction: [docs/1-introduction.md](docs/1-introduction.md)
93
93
  * Getting Started (No-Build First): [docs/2-getting-started.md](docs/2-getting-started.md)
94
94
  * The Essentials: [docs/3-the-essentials.md](docs/3-the-essentials.md)
95
- * Runtime core API reference: [docs/3-runtime-core.md](docs/3-runtime-core.md)
95
+ * Runtime core API reference: [docs/3.1-runtime-core.md](docs/3.1-runtime-core.md)
96
96
  * Building Single Page Applications (SPA Hub): [docs/4-building-spa.md](docs/4-building-spa.md)
97
97
  * Advanced State Management (Hub): [docs/5-advanced-state-management.md](docs/5-advanced-state-management.md)
98
98
  * The Full-Stack Capability (Isomorphism Hub): [docs/7-full-stack-capability.md](docs/7-full-stack-capability.md)
@@ -121,18 +121,21 @@ Not the best fit:
121
121
 
122
122
  Valyrian.js tests are behavior-first and API-contract driven. Public modules validate happy paths, edge cases, and runtime consistency across browser-like and Node-like environments. Documentation examples are kept aligned with tested behavior.
123
123
 
124
- ## Tests
124
+ ## Tests (Framework Repository)
125
125
 
126
126
  ```bash
127
- npm test
127
+ bun test
128
128
  ```
129
129
 
130
- For development mode:
130
+ For development mode in this repository:
131
131
 
132
132
  ```bash
133
- npm run dev:test
133
+ bun run dev:test
134
134
  ```
135
135
 
136
+ These commands are for contributors developing this framework repository.
137
+ For app usage, keep following [docs/2-getting-started.md](docs/2-getting-started.md).
138
+
136
139
  ## More Guides
137
140
 
138
141
  * Recipes and integrations: [docs/9-recipes-and-integrations.md](docs/9-recipes-and-integrations.md)
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // lib/context/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ createContextScope: () => createContextScope,
24
+ getContext: () => getContext,
25
+ hasContext: () => hasContext,
26
+ isServerContextActive: () => isServerContextActive,
27
+ runWithContext: () => runWithContext,
28
+ setContext: () => setContext
29
+ });
30
+ module.exports = __toCommonJS(index_exports);
31
+ var import_valyrian = require("valyrian.js");
32
+ var NODE_CONTEXT_STORE_KEY = "__valyrian_context_values__";
33
+ var browserContextStore = /* @__PURE__ */ new Map();
34
+ function createContextScope(name) {
35
+ return {
36
+ key: Symbol(name),
37
+ name
38
+ };
39
+ }
40
+ function getNodeStoreObject() {
41
+ if (!import_valyrian.isNodeJs || typeof sessionStorage === "undefined") {
42
+ return null;
43
+ }
44
+ const storage = sessionStorage;
45
+ if (!storage.store || typeof storage.store !== "object") {
46
+ return null;
47
+ }
48
+ return storage.store;
49
+ }
50
+ function getScopeMap(create = false) {
51
+ const nodeStore = getNodeStoreObject();
52
+ if (nodeStore) {
53
+ const existingMap = nodeStore[NODE_CONTEXT_STORE_KEY];
54
+ if (existingMap) {
55
+ return existingMap;
56
+ }
57
+ if (create) {
58
+ const nextMap = /* @__PURE__ */ new Map();
59
+ nodeStore[NODE_CONTEXT_STORE_KEY] = nextMap;
60
+ return nextMap;
61
+ }
62
+ return null;
63
+ }
64
+ if (create) {
65
+ return browserContextStore;
66
+ }
67
+ return browserContextStore.size > 0 ? browserContextStore : null;
68
+ }
69
+ function isServerContextActive() {
70
+ if (!import_valyrian.isNodeJs || typeof sessionStorage === "undefined") {
71
+ return false;
72
+ }
73
+ const maybeServerStorage = sessionStorage;
74
+ if (typeof maybeServerStorage.isContextActive === "function") {
75
+ return Boolean(maybeServerStorage.isContextActive());
76
+ }
77
+ return false;
78
+ }
79
+ function getContext(scope) {
80
+ const map = getScopeMap(false);
81
+ if (!map) {
82
+ return void 0;
83
+ }
84
+ return map.get(scope.key);
85
+ }
86
+ function hasContext(scope) {
87
+ const map = getScopeMap(false);
88
+ if (!map) {
89
+ return false;
90
+ }
91
+ return map.has(scope.key);
92
+ }
93
+ function setContext(scope, value) {
94
+ const map = getScopeMap(true);
95
+ const hasPrevious = map.has(scope.key);
96
+ const previousValue = map.get(scope.key);
97
+ map.set(scope.key, value);
98
+ return () => {
99
+ if (!hasPrevious) {
100
+ map.delete(scope.key);
101
+ return;
102
+ }
103
+ map.set(scope.key, previousValue);
104
+ };
105
+ }
106
+ function runWithContext(scope, value, callback) {
107
+ const restore = setContext(scope, value);
108
+ try {
109
+ const result = callback();
110
+ if (result instanceof Promise) {
111
+ return result.finally(restore);
112
+ }
113
+ restore();
114
+ return result;
115
+ } catch (error) {
116
+ restore();
117
+ throw error;
118
+ }
119
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../lib/context/index.ts"],
4
+ "sourcesContent": ["import { isNodeJs } from \"valyrian.js\";\n\ntype ScopeMap = Map<symbol, unknown>;\n\nconst NODE_CONTEXT_STORE_KEY = \"__valyrian_context_values__\";\nconst browserContextStore: ScopeMap = new Map();\n\nexport type ContextScope<T> = {\n key: symbol;\n name: string;\n // Type marker only\n __type?: T;\n};\n\nexport function createContextScope<T>(name: string): ContextScope<T> {\n return {\n key: Symbol(name),\n name\n };\n}\n\nfunction getNodeStoreObject(): Record<string | symbol, unknown> | null {\n if (!isNodeJs || typeof sessionStorage === \"undefined\") {\n return null;\n }\n\n const storage = sessionStorage as Storage & {\n store?: Record<string | symbol, unknown>;\n };\n\n if (!storage.store || typeof storage.store !== \"object\") {\n return null;\n }\n\n return storage.store;\n}\n\nfunction getScopeMap(create = false): ScopeMap | null {\n const nodeStore = getNodeStoreObject();\n if (nodeStore) {\n const existingMap = nodeStore[NODE_CONTEXT_STORE_KEY] as ScopeMap | undefined;\n if (existingMap) {\n return existingMap;\n }\n\n if (create) {\n const nextMap: ScopeMap = new Map();\n nodeStore[NODE_CONTEXT_STORE_KEY] = nextMap;\n return nextMap;\n }\n\n return null;\n }\n\n if (create) {\n return browserContextStore;\n }\n\n return browserContextStore.size > 0 ? browserContextStore : null;\n}\n\nexport function isServerContextActive() {\n if (!isNodeJs || typeof sessionStorage === \"undefined\") {\n return false;\n }\n\n const maybeServerStorage = sessionStorage as Storage & {\n isContextActive?: () => boolean;\n };\n\n if (typeof maybeServerStorage.isContextActive === \"function\") {\n return Boolean(maybeServerStorage.isContextActive());\n }\n\n return false;\n}\n\nexport function getContext<T>(scope: ContextScope<T>): T | undefined {\n const map = getScopeMap(false);\n if (!map) {\n return undefined;\n }\n\n return map.get(scope.key) as T | undefined;\n}\n\nexport function hasContext<T>(scope: ContextScope<T>): boolean {\n const map = getScopeMap(false);\n if (!map) {\n return false;\n }\n\n return map.has(scope.key);\n}\n\nexport function setContext<T>(scope: ContextScope<T>, value: T): () => void {\n const map = getScopeMap(true) as ScopeMap;\n const hasPrevious = map.has(scope.key);\n const previousValue = map.get(scope.key);\n\n map.set(scope.key, value);\n\n return () => {\n if (!hasPrevious) {\n map.delete(scope.key);\n return;\n }\n map.set(scope.key, previousValue);\n };\n}\n\nexport function runWithContext<T, TResult>(scope: ContextScope<T>, value: T, callback: () => TResult): TResult;\nexport function runWithContext<T, TResult>(\n scope: ContextScope<T>,\n value: T,\n callback: () => Promise<TResult>\n): Promise<TResult>;\nexport function runWithContext<T, TResult>(\n scope: ContextScope<T>,\n value: T,\n callback: () => TResult | Promise<TResult>\n) {\n const restore = setContext(scope, value);\n try {\n const result = callback();\n if (result instanceof Promise) {\n return result.finally(restore);\n }\n restore();\n return result;\n } catch (error) {\n restore();\n throw error;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAyB;AAIzB,IAAM,yBAAyB;AAC/B,IAAM,sBAAgC,oBAAI,IAAI;AASvC,SAAS,mBAAsB,MAA+B;AACnE,SAAO;AAAA,IACL,KAAK,OAAO,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,qBAA8D;AACrE,MAAI,CAAC,4BAAY,OAAO,mBAAmB,aAAa;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU;AAIhB,MAAI,CAAC,QAAQ,SAAS,OAAO,QAAQ,UAAU,UAAU;AACvD,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ;AACjB;AAEA,SAAS,YAAY,SAAS,OAAwB;AACpD,QAAM,YAAY,mBAAmB;AACrC,MAAI,WAAW;AACb,UAAM,cAAc,UAAU,sBAAsB;AACpD,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ;AACV,YAAM,UAAoB,oBAAI,IAAI;AAClC,gBAAU,sBAAsB,IAAI;AACpC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB,OAAO,IAAI,sBAAsB;AAC9D;AAEO,SAAS,wBAAwB;AACtC,MAAI,CAAC,4BAAY,OAAO,mBAAmB,aAAa;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB;AAI3B,MAAI,OAAO,mBAAmB,oBAAoB,YAAY;AAC5D,WAAO,QAAQ,mBAAmB,gBAAgB,CAAC;AAAA,EACrD;AAEA,SAAO;AACT;AAEO,SAAS,WAAc,OAAuC;AACnE,QAAM,MAAM,YAAY,KAAK;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,IAAI,MAAM,GAAG;AAC1B;AAEO,SAAS,WAAc,OAAiC;AAC7D,QAAM,MAAM,YAAY,KAAK;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,IAAI,MAAM,GAAG;AAC1B;AAEO,SAAS,WAAc,OAAwB,OAAsB;AAC1E,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,cAAc,IAAI,IAAI,MAAM,GAAG;AACrC,QAAM,gBAAgB,IAAI,IAAI,MAAM,GAAG;AAEvC,MAAI,IAAI,MAAM,KAAK,KAAK;AAExB,SAAO,MAAM;AACX,QAAI,CAAC,aAAa;AAChB,UAAI,OAAO,MAAM,GAAG;AACpB;AAAA,IACF;AACA,QAAI,IAAI,MAAM,KAAK,aAAa;AAAA,EAClC;AACF;AAQO,SAAS,eACd,OACA,OACA,UACA;AACA,QAAM,UAAU,WAAW,OAAO,KAAK;AACvC,MAAI;AACF,UAAM,SAAS,SAAS;AACxB,QAAI,kBAAkB,SAAS;AAC7B,aAAO,OAAO,QAAQ,OAAO;AAAA,IAC/B;AACA,YAAQ;AACR,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ;AACR,UAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,r={};((t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})})(r,{createContextScope:()=>a,getContext:()=>p,hasContext:()=>d,isServerContextActive:()=>y,runWithContext:()=>v,setContext:()=>g});var s,i=(s=r,((r,s,i,u)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))o.call(r,c)||c===i||e(r,c,{get:()=>s[c],enumerable:!(u=t(s,c))||u.enumerable});return r})(e({},"__esModule",{value:!0}),s)),u=require("valyrian.js"),c="__valyrian_context_values__",f=new Map;function a(e){return{key:Symbol(e),name:e}}function l(e=!1){const t=function(){if(!u.isNodeJs||"undefined"==typeof sessionStorage)return null;const e=sessionStorage;return e.store&&"object"==typeof e.store?e.store:null}();if(t){const n=t[c];if(n)return n;if(e){const e=new Map;return t[c]=e,e}return null}return e||f.size>0?f:null}function y(){if(!u.isNodeJs||"undefined"==typeof sessionStorage)return!1;const e=sessionStorage;return"function"==typeof e.isContextActive&&Boolean(e.isContextActive())}function p(e){const t=l(!1);if(t)return t.get(e.key)}function d(e){const t=l(!1);return!!t&&t.has(e.key)}function g(e,t){const n=l(!0),o=n.has(e.key),r=n.get(e.key);return n.set(e.key,t),()=>{o?n.set(e.key,r):n.delete(e.key)}}function v(e,t,n){const o=g(e,t);try{const e=n();return e instanceof Promise?e.finally(o):(o(),e)}catch(e){throw o(),e}}"undefined"!=typeof module?module.exports=i:self.ValyrianContext=i})();//# sourceMappingURL=index.min.js.map
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJjcmVhdGVDb250ZXh0U2NvcGUiLCJnZXRDb250ZXh0IiwiaGFzQ29udGV4dCIsImlzU2VydmVyQ29udGV4dEFjdGl2ZSIsInJ1bldpdGhDb250ZXh0Iiwic2V0Q29udGV4dCIsIl9fRVhQT1JUU19fIiwiaW1wb3J0X3ZhbHlyaWFuIiwicmVxdWlyZSIsIk5PREVfQ09OVEVYVF9TVE9SRV9LRVkiLCJicm93c2VyQ29udGV4dFN0b3JlIiwiTWFwIiwibmFtZSIsImtleSIsIlN5bWJvbCIsImdldFNjb3BlTWFwIiwiY3JlYXRlIiwibm9kZVN0b3JlIiwiaXNOb2RlSnMiLCJzZXNzaW9uU3RvcmFnZSIsInN0b3JhZ2UiLCJzdG9yZSIsImdldE5vZGVTdG9yZU9iamVjdCIsImV4aXN0aW5nTWFwIiwibmV4dE1hcCIsInNpemUiLCJtYXliZVNlcnZlclN0b3JhZ2UiLCJpc0NvbnRleHRBY3RpdmUiLCJCb29sZWFuIiwic2NvcGUiLCJtYXAiLCJnZXQiLCJoYXMiLCJ2YWx1ZSIsImhhc1ByZXZpb3VzIiwicHJldmlvdXNWYWx1ZSIsInNldCIsImRlbGV0ZSIsImNhbGxiYWNrIiwicmVzdG9yZSIsInJlc3VsdCIsIlByb21pc2UiLCJmaW5hbGx5IiwiZXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY29udGV4dC9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGVKcyB9IGZyb20gXCJ2YWx5cmlhbi5qc1wiO1xuXG50eXBlIFNjb3BlTWFwID0gTWFwPHN5bWJvbCwgdW5rbm93bj47XG5cbmNvbnN0IE5PREVfQ09OVEVYVF9TVE9SRV9LRVkgPSBcIl9fdmFseXJpYW5fY29udGV4dF92YWx1ZXNfX1wiO1xuY29uc3QgYnJvd3NlckNvbnRleHRTdG9yZTogU2NvcGVNYXAgPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCB0eXBlIENvbnRleHRTY29wZTxUPiA9IHtcbiAga2V5OiBzeW1ib2w7XG4gIG5hbWU6IHN0cmluZztcbiAgLy8gVHlwZSBtYXJrZXIgb25seVxuICBfX3R5cGU/OiBUO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRTY29wZTxUPihuYW1lOiBzdHJpbmcpOiBDb250ZXh0U2NvcGU8VD4ge1xuICByZXR1cm4ge1xuICAgIGtleTogU3ltYm9sKG5hbWUpLFxuICAgIG5hbWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZVN0b3JlT2JqZWN0KCk6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+IHwgbnVsbCB7XG4gIGlmICghaXNOb2RlSnMgfHwgdHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2UgYXMgU3RvcmFnZSAmIHtcbiAgICBzdG9yZT86IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICB9O1xuXG4gIGlmICghc3RvcmFnZS5zdG9yZSB8fCB0eXBlb2Ygc3RvcmFnZS5zdG9yZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHN0b3JhZ2Uuc3RvcmU7XG59XG5cbmZ1bmN0aW9uIGdldFNjb3BlTWFwKGNyZWF0ZSA9IGZhbHNlKTogU2NvcGVNYXAgfCBudWxsIHtcbiAgY29uc3Qgbm9kZVN0b3JlID0gZ2V0Tm9kZVN0b3JlT2JqZWN0KCk7XG4gIGlmIChub2RlU3RvcmUpIHtcbiAgICBjb25zdCBleGlzdGluZ01hcCA9IG5vZGVTdG9yZVtOT0RFX0NPTlRFWFRfU1RPUkVfS0VZXSBhcyBTY29wZU1hcCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhpc3RpbmdNYXApIHtcbiAgICAgIHJldHVybiBleGlzdGluZ01hcDtcbiAgICB9XG5cbiAgICBpZiAoY3JlYXRlKSB7XG4gICAgICBjb25zdCBuZXh0TWFwOiBTY29wZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIG5vZGVTdG9yZVtOT0RFX0NPTlRFWFRfU1RPUkVfS0VZXSA9IG5leHRNYXA7XG4gICAgICByZXR1cm4gbmV4dE1hcDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjcmVhdGUpIHtcbiAgICByZXR1cm4gYnJvd3NlckNvbnRleHRTdG9yZTtcbiAgfVxuXG4gIHJldHVybiBicm93c2VyQ29udGV4dFN0b3JlLnNpemUgPiAwID8gYnJvd3NlckNvbnRleHRTdG9yZSA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZlckNvbnRleHRBY3RpdmUoKSB7XG4gIGlmICghaXNOb2RlSnMgfHwgdHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWF5YmVTZXJ2ZXJTdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2UgYXMgU3RvcmFnZSAmIHtcbiAgICBpc0NvbnRleHRBY3RpdmU/OiAoKSA9PiBib29sZWFuO1xuICB9O1xuXG4gIGlmICh0eXBlb2YgbWF5YmVTZXJ2ZXJTdG9yYWdlLmlzQ29udGV4dEFjdGl2ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obWF5YmVTZXJ2ZXJTdG9yYWdlLmlzQ29udGV4dEFjdGl2ZSgpKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRleHQ8VD4oc2NvcGU6IENvbnRleHRTY29wZTxUPik6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXAgPSBnZXRTY29wZU1hcChmYWxzZSk7XG4gIGlmICghbWFwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBtYXAuZ2V0KHNjb3BlLmtleSkgYXMgVCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0NvbnRleHQ8VD4oc2NvcGU6IENvbnRleHRTY29wZTxUPik6IGJvb2xlYW4ge1xuICBjb25zdCBtYXAgPSBnZXRTY29wZU1hcChmYWxzZSk7XG4gIGlmICghbWFwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG1hcC5oYXMoc2NvcGUua2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRleHQ8VD4oc2NvcGU6IENvbnRleHRTY29wZTxUPiwgdmFsdWU6IFQpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgbWFwID0gZ2V0U2NvcGVNYXAodHJ1ZSkgYXMgU2NvcGVNYXA7XG4gIGNvbnN0IGhhc1ByZXZpb3VzID0gbWFwLmhhcyhzY29wZS5rZXkpO1xuICBjb25zdCBwcmV2aW91c1ZhbHVlID0gbWFwLmdldChzY29wZS5rZXkpO1xuXG4gIG1hcC5zZXQoc2NvcGUua2V5LCB2YWx1ZSk7XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoIWhhc1ByZXZpb3VzKSB7XG4gICAgICBtYXAuZGVsZXRlKHNjb3BlLmtleSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1hcC5zZXQoc2NvcGUua2V5LCBwcmV2aW91c1ZhbHVlKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhDb250ZXh0PFQsIFRSZXN1bHQ+KHNjb3BlOiBDb250ZXh0U2NvcGU8VD4sIHZhbHVlOiBULCBjYWxsYmFjazogKCkgPT4gVFJlc3VsdCk6IFRSZXN1bHQ7XG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aENvbnRleHQ8VCwgVFJlc3VsdD4oXG4gIHNjb3BlOiBDb250ZXh0U2NvcGU8VD4sXG4gIHZhbHVlOiBULFxuICBjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxUUmVzdWx0PlxuKTogUHJvbWlzZTxUUmVzdWx0PjtcbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoQ29udGV4dDxULCBUUmVzdWx0PihcbiAgc2NvcGU6IENvbnRleHRTY29wZTxUPixcbiAgdmFsdWU6IFQsXG4gIGNhbGxiYWNrOiAoKSA9PiBUUmVzdWx0IHwgUHJvbWlzZTxUUmVzdWx0PlxuKSB7XG4gIGNvbnN0IHJlc3RvcmUgPSBzZXRDb250ZXh0KHNjb3BlLCB2YWx1ZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2soKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdC5maW5hbGx5KHJlc3RvcmUpO1xuICAgIH1cbiAgICByZXN0b3JlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXN0b3JlKCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6ImdKQUFBQSxFQUFBLEcseURBQUFDLENBQUFELEVBQUEsQ0FBQUUsbUJBQUEsSUFBQUEsRUFBQUMsV0FBQSxJQUFBQSxFQUFBQyxXQUFBLElBQUFBLEVBQUFDLHNCQUFBLElBQUFBLEVBQUFDLGVBQUEsSUFBQUEsRUFBQUMsV0FBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBUixFLDBNQUFBUyxFQUF5QkMsUUFBQSxlQUluQkMsRUFBeUIsOEJBQ3pCQyxFQUFnQyxJQUFJQyxJQVNuQyxTQUFTWCxFQUFzQlksR0FDcEMsTUFBTyxDQUNMQyxJQUFLQyxPQUFPRixHQUNaQSxPQUVKLENBa0JBLFNBQVNHLEVBQVlDLEdBQVMsR0FDNUIsTUFBTUMsRUFqQlIsV0FDRSxJQUFLVixFQUFBVyxVQUFzQyxvQkFBbkJDLGVBQ3RCLE9BQU8sS0FHVCxNQUFNQyxFQUFVRCxlQUloQixPQUFLQyxFQUFRQyxPQUFrQyxpQkFBbEJELEVBQVFDLE1BSTlCRCxFQUFRQyxNQUhOLElBSVgsQ0FHb0JDLEdBQ2xCLEdBQUlMLEVBQVcsQ0FDYixNQUFNTSxFQUFjTixFQUFVUixHQUM5QixHQUFJYyxFQUNGLE9BQU9BLEVBR1QsR0FBSVAsRUFBUSxDQUNWLE1BQU1RLEVBQW9CLElBQUliLElBRTlCLE9BREFNLEVBQVVSLEdBQTBCZSxFQUM3QkEsQ0FDVCxDQUVBLE9BQU8sSUFDVCxDQUVBLE9BQUlSLEdBSUdOLEVBQW9CZSxLQUFPLEVBSHpCZixFQUdtRCxJQUM5RCxDQUVPLFNBQVNQLElBQ2QsSUFBS0ksRUFBQVcsVUFBc0Msb0JBQW5CQyxlQUN0QixPQUFPLEVBR1QsTUFBTU8sRUFBcUJQLGVBSTNCLE1BQWtELG1CQUF2Q08sRUFBbUJDLGlCQUNyQkMsUUFBUUYsRUFBbUJDLGtCQUl0QyxDQUVPLFNBQVMxQixFQUFjNEIsR0FDNUIsTUFBTUMsRUFBTWYsR0FBWSxHQUN4QixHQUFLZSxFQUlMLE9BQU9BLEVBQUlDLElBQUlGLEVBQU1oQixJQUN2QixDQUVPLFNBQVNYLEVBQWMyQixHQUM1QixNQUFNQyxFQUFNZixHQUFZLEdBQ3hCLFFBQUtlLEdBSUVBLEVBQUlFLElBQUlILEVBQU1oQixJQUN2QixDQUVPLFNBQVNSLEVBQWN3QixFQUF3QkksR0FDcEQsTUFBTUgsRUFBTWYsR0FBWSxHQUNsQm1CLEVBQWNKLEVBQUlFLElBQUlILEVBQU1oQixLQUM1QnNCLEVBQWdCTCxFQUFJQyxJQUFJRixFQUFNaEIsS0FJcEMsT0FGQWlCLEVBQUlNLElBQUlQLEVBQU1oQixJQUFLb0IsR0FFWixLQUNBQyxFQUlMSixFQUFJTSxJQUFJUCxFQUFNaEIsSUFBS3NCLEdBSGpCTCxFQUFJTyxPQUFPUixFQUFNaEIsS0FLdkIsQ0FRTyxTQUFTVCxFQUNkeUIsRUFDQUksRUFDQUssR0FFQSxNQUFNQyxFQUFVbEMsRUFBV3dCLEVBQU9JLEdBQ2xDLElBQ0UsTUFBTU8sRUFBU0YsSUFDZixPQUFJRSxhQUFrQkMsUUFDYkQsRUFBT0UsUUFBUUgsSUFFeEJBLElBQ09DLEVBQ1QsT0FBU0csR0FFUCxNQURBSixJQUNNSSxDQUNSLENBQ0YsQyJ9
@@ -0,0 +1,98 @@
1
+ // lib/context/index.ts
2
+ import { isNodeJs } from "valyrian.js";
3
+ var NODE_CONTEXT_STORE_KEY = "__valyrian_context_values__";
4
+ var browserContextStore = /* @__PURE__ */ new Map();
5
+ function createContextScope(name) {
6
+ return {
7
+ key: Symbol(name),
8
+ name
9
+ };
10
+ }
11
+ function getNodeStoreObject() {
12
+ if (!isNodeJs || typeof sessionStorage === "undefined") {
13
+ return null;
14
+ }
15
+ const storage = sessionStorage;
16
+ if (!storage.store || typeof storage.store !== "object") {
17
+ return null;
18
+ }
19
+ return storage.store;
20
+ }
21
+ function getScopeMap(create = false) {
22
+ const nodeStore = getNodeStoreObject();
23
+ if (nodeStore) {
24
+ const existingMap = nodeStore[NODE_CONTEXT_STORE_KEY];
25
+ if (existingMap) {
26
+ return existingMap;
27
+ }
28
+ if (create) {
29
+ const nextMap = /* @__PURE__ */ new Map();
30
+ nodeStore[NODE_CONTEXT_STORE_KEY] = nextMap;
31
+ return nextMap;
32
+ }
33
+ return null;
34
+ }
35
+ if (create) {
36
+ return browserContextStore;
37
+ }
38
+ return browserContextStore.size > 0 ? browserContextStore : null;
39
+ }
40
+ function isServerContextActive() {
41
+ if (!isNodeJs || typeof sessionStorage === "undefined") {
42
+ return false;
43
+ }
44
+ const maybeServerStorage = sessionStorage;
45
+ if (typeof maybeServerStorage.isContextActive === "function") {
46
+ return Boolean(maybeServerStorage.isContextActive());
47
+ }
48
+ return false;
49
+ }
50
+ function getContext(scope) {
51
+ const map = getScopeMap(false);
52
+ if (!map) {
53
+ return void 0;
54
+ }
55
+ return map.get(scope.key);
56
+ }
57
+ function hasContext(scope) {
58
+ const map = getScopeMap(false);
59
+ if (!map) {
60
+ return false;
61
+ }
62
+ return map.has(scope.key);
63
+ }
64
+ function setContext(scope, value) {
65
+ const map = getScopeMap(true);
66
+ const hasPrevious = map.has(scope.key);
67
+ const previousValue = map.get(scope.key);
68
+ map.set(scope.key, value);
69
+ return () => {
70
+ if (!hasPrevious) {
71
+ map.delete(scope.key);
72
+ return;
73
+ }
74
+ map.set(scope.key, previousValue);
75
+ };
76
+ }
77
+ function runWithContext(scope, value, callback) {
78
+ const restore = setContext(scope, value);
79
+ try {
80
+ const result = callback();
81
+ if (result instanceof Promise) {
82
+ return result.finally(restore);
83
+ }
84
+ restore();
85
+ return result;
86
+ } catch (error) {
87
+ restore();
88
+ throw error;
89
+ }
90
+ }
91
+ export {
92
+ createContextScope,
93
+ getContext,
94
+ hasContext,
95
+ isServerContextActive,
96
+ runWithContext,
97
+ setContext
98
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../lib/context/index.ts"],
4
+ "sourcesContent": ["import { isNodeJs } from \"valyrian.js\";\n\ntype ScopeMap = Map<symbol, unknown>;\n\nconst NODE_CONTEXT_STORE_KEY = \"__valyrian_context_values__\";\nconst browserContextStore: ScopeMap = new Map();\n\nexport type ContextScope<T> = {\n key: symbol;\n name: string;\n // Type marker only\n __type?: T;\n};\n\nexport function createContextScope<T>(name: string): ContextScope<T> {\n return {\n key: Symbol(name),\n name\n };\n}\n\nfunction getNodeStoreObject(): Record<string | symbol, unknown> | null {\n if (!isNodeJs || typeof sessionStorage === \"undefined\") {\n return null;\n }\n\n const storage = sessionStorage as Storage & {\n store?: Record<string | symbol, unknown>;\n };\n\n if (!storage.store || typeof storage.store !== \"object\") {\n return null;\n }\n\n return storage.store;\n}\n\nfunction getScopeMap(create = false): ScopeMap | null {\n const nodeStore = getNodeStoreObject();\n if (nodeStore) {\n const existingMap = nodeStore[NODE_CONTEXT_STORE_KEY] as ScopeMap | undefined;\n if (existingMap) {\n return existingMap;\n }\n\n if (create) {\n const nextMap: ScopeMap = new Map();\n nodeStore[NODE_CONTEXT_STORE_KEY] = nextMap;\n return nextMap;\n }\n\n return null;\n }\n\n if (create) {\n return browserContextStore;\n }\n\n return browserContextStore.size > 0 ? browserContextStore : null;\n}\n\nexport function isServerContextActive() {\n if (!isNodeJs || typeof sessionStorage === \"undefined\") {\n return false;\n }\n\n const maybeServerStorage = sessionStorage as Storage & {\n isContextActive?: () => boolean;\n };\n\n if (typeof maybeServerStorage.isContextActive === \"function\") {\n return Boolean(maybeServerStorage.isContextActive());\n }\n\n return false;\n}\n\nexport function getContext<T>(scope: ContextScope<T>): T | undefined {\n const map = getScopeMap(false);\n if (!map) {\n return undefined;\n }\n\n return map.get(scope.key) as T | undefined;\n}\n\nexport function hasContext<T>(scope: ContextScope<T>): boolean {\n const map = getScopeMap(false);\n if (!map) {\n return false;\n }\n\n return map.has(scope.key);\n}\n\nexport function setContext<T>(scope: ContextScope<T>, value: T): () => void {\n const map = getScopeMap(true) as ScopeMap;\n const hasPrevious = map.has(scope.key);\n const previousValue = map.get(scope.key);\n\n map.set(scope.key, value);\n\n return () => {\n if (!hasPrevious) {\n map.delete(scope.key);\n return;\n }\n map.set(scope.key, previousValue);\n };\n}\n\nexport function runWithContext<T, TResult>(scope: ContextScope<T>, value: T, callback: () => TResult): TResult;\nexport function runWithContext<T, TResult>(\n scope: ContextScope<T>,\n value: T,\n callback: () => Promise<TResult>\n): Promise<TResult>;\nexport function runWithContext<T, TResult>(\n scope: ContextScope<T>,\n value: T,\n callback: () => TResult | Promise<TResult>\n) {\n const restore = setContext(scope, value);\n try {\n const result = callback();\n if (result instanceof Promise) {\n return result.finally(restore);\n }\n restore();\n return result;\n } catch (error) {\n restore();\n throw error;\n }\n}\n"],
5
+ "mappings": ";AAAA,SAAS,gBAAgB;AAIzB,IAAM,yBAAyB;AAC/B,IAAM,sBAAgC,oBAAI,IAAI;AASvC,SAAS,mBAAsB,MAA+B;AACnE,SAAO;AAAA,IACL,KAAK,OAAO,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,qBAA8D;AACrE,MAAI,CAAC,YAAY,OAAO,mBAAmB,aAAa;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU;AAIhB,MAAI,CAAC,QAAQ,SAAS,OAAO,QAAQ,UAAU,UAAU;AACvD,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ;AACjB;AAEA,SAAS,YAAY,SAAS,OAAwB;AACpD,QAAM,YAAY,mBAAmB;AACrC,MAAI,WAAW;AACb,UAAM,cAAc,UAAU,sBAAsB;AACpD,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ;AACV,YAAM,UAAoB,oBAAI,IAAI;AAClC,gBAAU,sBAAsB,IAAI;AACpC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB,OAAO,IAAI,sBAAsB;AAC9D;AAEO,SAAS,wBAAwB;AACtC,MAAI,CAAC,YAAY,OAAO,mBAAmB,aAAa;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB;AAI3B,MAAI,OAAO,mBAAmB,oBAAoB,YAAY;AAC5D,WAAO,QAAQ,mBAAmB,gBAAgB,CAAC;AAAA,EACrD;AAEA,SAAO;AACT;AAEO,SAAS,WAAc,OAAuC;AACnE,QAAM,MAAM,YAAY,KAAK;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,IAAI,MAAM,GAAG;AAC1B;AAEO,SAAS,WAAc,OAAiC;AAC7D,QAAM,MAAM,YAAY,KAAK;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,IAAI,MAAM,GAAG;AAC1B;AAEO,SAAS,WAAc,OAAwB,OAAsB;AAC1E,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,cAAc,IAAI,IAAI,MAAM,GAAG;AACrC,QAAM,gBAAgB,IAAI,IAAI,MAAM,GAAG;AAEvC,MAAI,IAAI,MAAM,KAAK,KAAK;AAExB,SAAO,MAAM;AACX,QAAI,CAAC,aAAa;AAChB,UAAI,OAAO,MAAM,GAAG;AACpB;AAAA,IACF;AACA,QAAI,IAAI,MAAM,KAAK,aAAa;AAAA,EAClC;AACF;AAQO,SAAS,eACd,OACA,OACA,UACA;AACA,QAAM,UAAU,WAAW,OAAO,KAAK;AACvC,MAAI;AACF,UAAM,SAAS,SAAS;AACxB,QAAI,kBAAkB,SAAS;AAC7B,aAAO,OAAO,QAAQ,OAAO;AAAA,IAC/B;AACA,YAAQ;AACR,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ;AACR,UAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -20,7 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // lib/forms/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- FormStore: () => FormStore
23
+ FormStore: () => FormStore,
24
+ formSchemaShield: () => formSchemaShield
24
25
  });
25
26
  module.exports = __toCommonJS(index_exports);
26
27
  var import_valyrian = require("valyrian.js");
@@ -1620,8 +1621,8 @@ var SchemaShield = class {
1620
1621
  };
1621
1622
 
1622
1623
  // lib/forms/index.ts
1623
- var controlBindingKey = Symbol("forms-control-binding");
1624
- var formBindingKey = Symbol("forms-form-binding");
1624
+ var controlBindingKey = /* @__PURE__ */ Symbol("forms-control-binding");
1625
+ var formBindingKey = /* @__PURE__ */ Symbol("forms-form-binding");
1625
1626
  function getTagName(node) {
1626
1627
  return String(node.tagName || "").toUpperCase();
1627
1628
  }
@@ -1679,10 +1680,6 @@ function getRootError(error) {
1679
1680
  }
1680
1681
  return current;
1681
1682
  }
1682
- function cloneStateShallow(state) {
1683
- const clone = Object.create(Object.getPrototypeOf(state));
1684
- return Object.assign(clone, state);
1685
- }
1686
1683
  function walkElements(root, visitor) {
1687
1684
  const children = root.childNodes || [];
1688
1685
  for (const child of children) {
@@ -1730,11 +1727,15 @@ var FormStore = class _FormStore {
1730
1727
  #onSubmit;
1731
1728
  #clean;
1732
1729
  #format;
1730
+ #validationMode;
1733
1731
  #pulseStore;
1732
+ static get schemaShield() {
1733
+ return this.#schemaShield;
1734
+ }
1734
1735
  static createSchemaShield() {
1735
1736
  const schemaShield = new SchemaShield({
1736
1737
  failFast: false,
1737
- immutable: true
1738
+ immutable: false
1738
1739
  });
1739
1740
  schemaShield.addFormat(
1740
1741
  "url",
@@ -1758,27 +1759,35 @@ var FormStore = class _FormStore {
1758
1759
  this.#onSubmit = options.onSubmit || null;
1759
1760
  this.#clean = options.clean || {};
1760
1761
  this.#format = options.format || {};
1761
- const initialValues = cloneStateShallow(options.state);
1762
+ this.#validationMode = options.validationMode || "safe";
1763
+ const getValidationErrors = (values) => {
1764
+ const valuesToValidate = this.#validationMode === "safe" ? (0, import_utils.deepCloneUnfreeze)(values) : values;
1765
+ const result = this.#validator(valuesToValidate);
1766
+ return result.valid ? {} : this.#mapValidationError(result.error);
1767
+ };
1768
+ const initialValues = (0, import_utils.deepCloneUnfreeze)(options.state);
1762
1769
  this.#pulseStore = (0, import_pulses.createPulseStore)(
1763
1770
  {
1764
- values: cloneStateShallow(initialValues),
1771
+ values: (0, import_utils.deepCloneUnfreeze)(initialValues),
1765
1772
  errors: {},
1766
1773
  isInflight: false,
1767
1774
  isDirty: false
1768
1775
  },
1769
1776
  {
1770
- setValue(state, name, value) {
1777
+ setField(state, name, value) {
1771
1778
  state.values[name] = value;
1772
1779
  state.isDirty = true;
1780
+ state.errors = getValidationErrors(state.values);
1773
1781
  },
1774
- setErrors(state, errors) {
1775
- state.errors = errors;
1782
+ validate(state) {
1783
+ state.errors = getValidationErrors(state.values);
1784
+ return Object.keys(state.errors).length === 0;
1776
1785
  },
1777
1786
  setInflight(state, inflight) {
1778
1787
  state.isInflight = inflight;
1779
1788
  },
1780
1789
  reset(state) {
1781
- state.values = cloneStateShallow(initialValues);
1790
+ state.values = (0, import_utils.deepCloneUnfreeze)(initialValues);
1782
1791
  state.errors = {};
1783
1792
  state.isInflight = false;
1784
1793
  state.isDirty = false;
@@ -1815,8 +1824,7 @@ var FormStore = class _FormStore {
1815
1824
  }
1816
1825
  setField(name, rawValue, control = null, event) {
1817
1826
  const cleanedValue = this.#runTransform(this.#clean, name, rawValue, control, event);
1818
- this.#pulseStore.setValue(name, cleanedValue);
1819
- this.validate();
1827
+ this.#pulseStore.setField(name, cleanedValue);
1820
1828
  }
1821
1829
  #mapValidationError(error) {
1822
1830
  if (!error) {
@@ -1834,10 +1842,7 @@ var FormStore = class _FormStore {
1834
1842
  return { [fieldName]: message };
1835
1843
  }
1836
1844
  validate() {
1837
- const result = this.#validator(this.state);
1838
- const errors = result.valid ? {} : this.#mapValidationError(result.error);
1839
- this.#pulseStore.setErrors(errors);
1840
- return Object.keys(errors).length === 0;
1845
+ return this.#pulseStore.validate();
1841
1846
  }
1842
1847
  async submit(event) {
1843
1848
  event?.preventDefault();
@@ -1861,6 +1866,7 @@ var FormStore = class _FormStore {
1861
1866
  this.#pulseStore.reset();
1862
1867
  }
1863
1868
  };
1869
+ var formSchemaShield = FormStore.schemaShield;
1864
1870
  function bindControl(formStore, control) {
1865
1871
  const name = getNodeName(control);
1866
1872
  if (name.length === 0) {