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.
- package/README.md +14 -11
- package/dist/context/index.js +119 -0
- package/dist/context/index.js.map +7 -0
- package/dist/context/index.min.js +1 -0
- package/dist/context/index.min.js.map +1 -0
- package/dist/context/index.mjs +98 -0
- package/dist/context/index.mjs.map +7 -0
- package/dist/forms/index.js +26 -20
- package/dist/forms/index.js.map +2 -2
- package/dist/forms/index.min.js +1 -1
- package/dist/forms/index.min.js.map +1 -1
- package/dist/forms/index.mjs +27 -21
- package/dist/forms/index.mjs.map +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/lib/context/index.d.ts +13 -0
- package/dist/lib/context/index.d.ts.map +1 -0
- package/dist/lib/forms/index.d.ts +4 -0
- package/dist/lib/forms/index.d.ts.map +1 -1
- package/dist/lib/native-store/index.d.ts.map +1 -1
- package/dist/lib/node/utils/server-storage.d.ts +2 -0
- package/dist/lib/node/utils/server-storage.d.ts.map +1 -1
- package/dist/lib/pulses/index.d.ts +1 -1
- package/dist/lib/pulses/index.d.ts.map +1 -1
- package/dist/lib/request/index.d.ts.map +1 -1
- package/dist/lib/router/index.d.ts.map +1 -1
- package/dist/lib/translate/index.d.ts.map +1 -1
- package/dist/native-store/index.js +17 -3
- package/dist/native-store/index.js.map +2 -2
- package/dist/native-store/index.min.js +1 -1
- package/dist/native-store/index.min.js.map +1 -1
- package/dist/native-store/index.mjs +17 -3
- package/dist/native-store/index.mjs.map +2 -2
- package/dist/node/index.js +7 -1
- package/dist/node/index.js.map +2 -2
- package/dist/node/index.mjs +7 -1
- package/dist/node/index.mjs.map +2 -2
- package/dist/pulses/index.js +2 -2
- package/dist/pulses/index.js.map +2 -2
- package/dist/pulses/index.min.js +1 -1
- package/dist/pulses/index.min.js.map +1 -1
- package/dist/pulses/index.mjs +2 -2
- package/dist/pulses/index.mjs.map +2 -2
- package/dist/request/index.js +53 -3
- package/dist/request/index.js.map +2 -2
- package/dist/request/index.min.js +1 -1
- package/dist/request/index.min.js.map +1 -1
- package/dist/request/index.mjs +53 -3
- package/dist/request/index.mjs.map +2 -2
- package/dist/router/index.js +96 -72
- package/dist/router/index.js.map +2 -2
- package/dist/router/index.min.js +1 -1
- package/dist/router/index.min.js.map +1 -1
- package/dist/router/index.mjs +96 -72
- package/dist/router/index.mjs.map +2 -2
- package/dist/translate/index.js +13 -1
- package/dist/translate/index.js.map +2 -2
- package/dist/translate/index.min.js +1 -1
- package/dist/translate/index.min.js.map +1 -1
- package/dist/translate/index.mjs +14 -2
- package/dist/translate/index.mjs.map +2 -2
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.min.js +1 -1
- package/dist/utils/index.min.js.map +1 -1
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/index.mjs.map +1 -1
- package/docs/1-introduction.md +62 -0
- package/docs/10-meta-framework-cli.md +37 -0
- package/docs/11-roadmap-and-contribution.md +46 -0
- package/docs/2-getting-started.md +155 -0
- package/docs/3-the-essentials.md +358 -0
- package/docs/3.1-runtime-core.md +166 -0
- package/docs/4-building-spa.md +38 -0
- package/docs/4.1-routing-and-navigation.md +236 -0
- package/docs/4.2-data-fetching-and-async.md +51 -0
- package/docs/4.2.1-request.md +137 -0
- package/docs/4.2.2-suspense.md +57 -0
- package/docs/4.2.3-tasks.md +67 -0
- package/docs/4.2.4-query.md +112 -0
- package/docs/4.2.5-network.md +64 -0
- package/docs/4.2.6-offline.md +74 -0
- package/docs/4.3-forms.md +164 -0
- package/docs/5-advanced-state-management.md +52 -0
- package/docs/5.2-pulses.md +82 -0
- package/docs/5.3-flux-store.md +80 -0
- package/docs/5.4-redux-devtools.md +47 -0
- package/docs/6-optimization-and-performance.md +73 -0
- package/docs/7-full-stack-capability.md +45 -0
- package/docs/7.1-ssr.md +280 -0
- package/docs/7.1.1-node-runtime-apis.md +61 -0
- package/docs/7.2-isomorphic-networking-and-storage.md +188 -0
- package/docs/7.3-pwa-and-build-tooling.md +63 -0
- package/docs/7.3.1-sw-runtime.md +49 -0
- package/docs/7.4-server-context.md +48 -0
- package/docs/8-utilities-and-ecosystem.md +34 -0
- package/docs/8.1-translate.md +74 -0
- package/docs/8.2-money.md +74 -0
- package/docs/8.3-native-store.md +59 -0
- package/docs/8.4-utils.md +53 -0
- package/docs/9-recipes-and-integrations.md +60 -0
- package/docs/9.1-vite-integration.md +94 -0
- package/docs/9.2-webpack-rspack-integration.md +199 -0
- package/docs/9.3-express-fastify-ssr.md +510 -0
- package/docs/9.4-api-client-composition.md +99 -0
- package/docs/9.5-offline-first-commands.md +91 -0
- package/docs/9.6-production-checklist.md +26 -0
- package/docs/9.7-counter-variants-by-component-shape.md +212 -0
- package/docs/9.8-reactive-counter-variants.md +156 -0
- package/docs/toc.md +63 -0
- package/lib/context/index.ts +135 -0
- package/lib/forms/index.ts +35 -23
- package/lib/native-store/index.ts +20 -3
- package/lib/node/utils/server-storage.ts +8 -0
- package/lib/node/utils/tree-adapter.ts +1 -1
- package/lib/pulses/index.ts +3 -3
- package/lib/request/index.ts +66 -3
- package/lib/router/index.ts +104 -85
- package/lib/translate/index.ts +16 -2
- package/lib/utils/getter-setter.ts +1 -1
- package/llms-full.txt +4966 -0
- package/llms.txt +439 -0
- package/package.json +27 -40
package/README.md
CHANGED
|
@@ -10,17 +10,17 @@
|
|
|
10
10
|

|
|
11
11
|
[](https://github.com/masquerade-circus/valyrian.js/blob/main/LICENSE)
|
|
12
12
|
|
|
13
|
-
](dist/index.min.js)
|
|
14
|
+
[](dist/index.min.js)
|
|
15
|
+
[](dist/index.min.js)
|
|
16
16
|
|
|
17
|
-
](https://github.com/Masquerade-Circus/valyrian.js/actions/workflows/test.yml)
|
|
18
18
|

|
|
19
|
-
[](https://github.com/Masquerade-Circus/valyrian.js/actions/workflows/codeql-analysis.yml)
|
|
20
20
|
[](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
|

|
|
23
|
-
[](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
|
-
|
|
127
|
+
bun test
|
|
128
128
|
```
|
|
129
129
|
|
|
130
|
-
For development mode:
|
|
130
|
+
For development mode in this repository:
|
|
131
131
|
|
|
132
132
|
```bash
|
|
133
|
-
|
|
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
|
+
}
|
package/dist/forms/index.js
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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:
|
|
1771
|
+
values: (0, import_utils.deepCloneUnfreeze)(initialValues),
|
|
1765
1772
|
errors: {},
|
|
1766
1773
|
isInflight: false,
|
|
1767
1774
|
isDirty: false
|
|
1768
1775
|
},
|
|
1769
1776
|
{
|
|
1770
|
-
|
|
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
|
-
|
|
1775
|
-
state.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 =
|
|
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.
|
|
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
|
-
|
|
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) {
|