sinwan 0.0.0 → 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.
- package/LICENSE +21 -0
- package/README.md +67 -1
- package/dist/cjs/index.development.js +1625 -0
- package/dist/cjs/index.development.js.map +32 -0
- package/dist/cjs/index.production.min.js +3 -0
- package/dist/cjs/index.production.min.js.map +32 -0
- package/dist/cjs/jsx/jsx-dev-runtime.development.js +134 -0
- package/dist/cjs/jsx/jsx-dev-runtime.development.js.map +10 -0
- package/dist/cjs/jsx/jsx-dev-runtime.production.min.js +3 -0
- package/dist/cjs/jsx/jsx-dev-runtime.production.min.js.map +10 -0
- package/dist/cjs/jsx/jsx-runtime.development.js +126 -0
- package/dist/cjs/jsx/jsx-runtime.development.js.map +10 -0
- package/dist/cjs/jsx/jsx-runtime.production.min.js +3 -0
- package/dist/cjs/jsx/jsx-runtime.production.min.js.map +10 -0
- package/dist/cjs/package.json +4 -0
- package/dist/cjs/server/index.development.js +929 -0
- package/dist/cjs/server/index.development.js.map +22 -0
- package/dist/cjs/server/index.production.min.js +3 -0
- package/dist/cjs/server/index.production.min.js.map +22 -0
- package/dist/component/create.d.ts +75 -0
- package/dist/component/create.d.ts.map +1 -0
- package/dist/component/index.d.ts +10 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component/instance.d.ts +78 -0
- package/dist/component/instance.d.ts.map +1 -0
- package/dist/component/lifecycle.d.ts +40 -0
- package/dist/component/lifecycle.d.ts.map +1 -0
- package/dist/component/provide-inject.d.ts +39 -0
- package/dist/component/provide-inject.d.ts.map +1 -0
- package/dist/escaper.d.ts +26 -0
- package/dist/escaper.d.ts.map +1 -0
- package/dist/esm/index.development.js +1560 -0
- package/dist/esm/index.development.js.map +32 -0
- package/dist/esm/index.production.min.js +4 -0
- package/dist/esm/index.production.min.js.map +32 -0
- package/dist/esm/jsx/jsx-dev-runtime.development.js +83 -0
- package/dist/esm/jsx/jsx-dev-runtime.development.js.map +10 -0
- package/dist/esm/jsx/jsx-dev-runtime.production.min.js +4 -0
- package/dist/esm/jsx/jsx-dev-runtime.production.min.js.map +10 -0
- package/dist/esm/jsx/jsx-runtime.development.js +87 -0
- package/dist/esm/jsx/jsx-runtime.development.js.map +10 -0
- package/dist/esm/jsx/jsx-runtime.production.min.js +4 -0
- package/dist/esm/jsx/jsx-runtime.production.min.js.map +10 -0
- package/dist/esm/package.json +4 -0
- package/dist/esm/server/index.development.js +878 -0
- package/dist/esm/server/index.development.js.map +22 -0
- package/dist/esm/server/index.production.min.js +4 -0
- package/dist/esm/server/index.production.min.js.map +22 -0
- package/dist/hydration/hydrate.d.ts +29 -0
- package/dist/hydration/hydrate.d.ts.map +1 -0
- package/dist/hydration/index.d.ts +7 -0
- package/dist/hydration/index.d.ts.map +1 -0
- package/dist/hydration/markers.d.ts +48 -0
- package/dist/hydration/markers.d.ts.map +1 -0
- package/dist/hydration/walk.d.ts +32 -0
- package/dist/hydration/walk.d.ts.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.mjs +4 -0
- package/dist/jsx/jsx-dev-runtime.d.ts +10 -0
- package/dist/jsx/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx/jsx-runtime.d.ts +54 -0
- package/dist/jsx/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx/jsx-types.d.ts +637 -0
- package/dist/jsx/jsx-types.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +1 -0
- package/dist/jsx-dev-runtime.js +7 -0
- package/dist/jsx-dev-runtime.mjs +4 -0
- package/dist/jsx-runtime.d.ts +1 -0
- package/dist/jsx-runtime.js +7 -0
- package/dist/jsx-runtime.mjs +4 -0
- package/dist/reactivity/batch.d.ts +27 -0
- package/dist/reactivity/batch.d.ts.map +1 -0
- package/dist/reactivity/computed.d.ts +41 -0
- package/dist/reactivity/computed.d.ts.map +1 -0
- package/dist/reactivity/effect.d.ts +79 -0
- package/dist/reactivity/effect.d.ts.map +1 -0
- package/dist/reactivity/index.d.ts +15 -0
- package/dist/reactivity/index.d.ts.map +1 -0
- package/dist/reactivity/scheduler.d.ts +35 -0
- package/dist/reactivity/scheduler.d.ts.map +1 -0
- package/dist/reactivity/signal.d.ts +36 -0
- package/dist/reactivity/signal.d.ts.map +1 -0
- package/dist/renderer/attributes.d.ts +8 -0
- package/dist/renderer/attributes.d.ts.map +1 -0
- package/dist/renderer/dom-ops.d.ts +27 -0
- package/dist/renderer/dom-ops.d.ts.map +1 -0
- package/dist/renderer/events.d.ts +21 -0
- package/dist/renderer/events.d.ts.map +1 -0
- package/dist/renderer/index.d.ts +12 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/mount.d.ts +30 -0
- package/dist/renderer/mount.d.ts.map +1 -0
- package/dist/renderer/render-children.d.ts +19 -0
- package/dist/renderer/render-children.d.ts.map +1 -0
- package/dist/renderer/render-element.d.ts +13 -0
- package/dist/renderer/render-element.d.ts.map +1 -0
- package/dist/renderer/types.d.ts +63 -0
- package/dist/renderer/types.d.ts.map +1 -0
- package/dist/server/hydration-markers.d.ts +23 -0
- package/dist/server/hydration-markers.d.ts.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/renderer.d.ts +33 -0
- package/dist/server/renderer.d.ts.map +1 -0
- package/dist/server/stream.d.ts +12 -0
- package/dist/server/stream.d.ts.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +7 -0
- package/dist/server.mjs +4 -0
- package/dist/types.d.ts +42 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +102 -4
- package/bun.lock +0 -26
- package/src/index.ts +0 -1
- package/tsconfig.json +0 -29
|
@@ -0,0 +1,878 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/jsx/jsx-runtime.ts
|
|
3
|
+
var Fragment = Symbol("Fragment");
|
|
4
|
+
|
|
5
|
+
class HtmlEscapedString extends String {
|
|
6
|
+
value;
|
|
7
|
+
constructor(value) {
|
|
8
|
+
super(value);
|
|
9
|
+
this.value = value;
|
|
10
|
+
}
|
|
11
|
+
toString() {
|
|
12
|
+
return this.value;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
var raw = (str) => new HtmlEscapedString(str);
|
|
16
|
+
var VOID_ELEMENTS = new Set([
|
|
17
|
+
"area",
|
|
18
|
+
"base",
|
|
19
|
+
"br",
|
|
20
|
+
"col",
|
|
21
|
+
"embed",
|
|
22
|
+
"hr",
|
|
23
|
+
"img",
|
|
24
|
+
"input",
|
|
25
|
+
"link",
|
|
26
|
+
"meta",
|
|
27
|
+
"param",
|
|
28
|
+
"source",
|
|
29
|
+
"track",
|
|
30
|
+
"wbr"
|
|
31
|
+
]);
|
|
32
|
+
function normalizeChildren(children) {
|
|
33
|
+
if (children == null || typeof children === "boolean")
|
|
34
|
+
return [];
|
|
35
|
+
if (Array.isArray(children))
|
|
36
|
+
return children.flat(Infinity);
|
|
37
|
+
return [children];
|
|
38
|
+
}
|
|
39
|
+
function buildElement(type, props, children) {
|
|
40
|
+
if (type === Fragment) {
|
|
41
|
+
return { tag: "", props: {}, children };
|
|
42
|
+
}
|
|
43
|
+
if (typeof type === "function") {
|
|
44
|
+
if (type._SinwanComponent || type._SinwanPage) {
|
|
45
|
+
const result2 = type(props);
|
|
46
|
+
if (result2 && typeof result2 === "object" && "tag" in result2) {
|
|
47
|
+
return result2;
|
|
48
|
+
}
|
|
49
|
+
return { tag: "", props: {}, children: normalizeChildren(result2) };
|
|
50
|
+
}
|
|
51
|
+
const result = type(props);
|
|
52
|
+
if (result && typeof result === "object" && "tag" in result) {
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
return { tag: "", props: {}, children: normalizeChildren(result) };
|
|
56
|
+
}
|
|
57
|
+
if (typeof type === "string") {
|
|
58
|
+
return { tag: type, props: props || {}, children };
|
|
59
|
+
}
|
|
60
|
+
return { tag: "", props: {}, children };
|
|
61
|
+
}
|
|
62
|
+
function jsx(type, props, key) {
|
|
63
|
+
return buildElement(type, props, normalizeChildren(props?.children));
|
|
64
|
+
}
|
|
65
|
+
function jsxs(type, props, key) {
|
|
66
|
+
const children = props?.children;
|
|
67
|
+
return buildElement(type, props, Array.isArray(children) ? children.flat(Infinity) : normalizeChildren(children));
|
|
68
|
+
}
|
|
69
|
+
function jsxDEV(type, props, key, isStaticChildren, source, self) {
|
|
70
|
+
const children = isStaticChildren ? Array.isArray(props?.children) ? props.children.flat(Infinity) : normalizeChildren(props?.children) : normalizeChildren(props?.children);
|
|
71
|
+
const element = buildElement(type, props, children);
|
|
72
|
+
if (source) {
|
|
73
|
+
element.__source = source;
|
|
74
|
+
}
|
|
75
|
+
return element;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// src/escaper.ts
|
|
79
|
+
var _bun = globalThis.Bun;
|
|
80
|
+
var _nativeEscape = typeof _bun?.escapeHTML === "function" ? _bun.escapeHTML.bind(_bun) : undefined;
|
|
81
|
+
var HTML_ESCAPE_RE = /[&<>"']/g;
|
|
82
|
+
var HTML_ESCAPE_MAP = {
|
|
83
|
+
"&": "&",
|
|
84
|
+
"<": "<",
|
|
85
|
+
">": ">",
|
|
86
|
+
'"': """,
|
|
87
|
+
"'": "'"
|
|
88
|
+
};
|
|
89
|
+
function portableEscape(str) {
|
|
90
|
+
HTML_ESCAPE_RE.lastIndex = 0;
|
|
91
|
+
if (!HTML_ESCAPE_RE.test(str))
|
|
92
|
+
return str;
|
|
93
|
+
return str.replace(HTML_ESCAPE_RE, (c) => HTML_ESCAPE_MAP[c]);
|
|
94
|
+
}
|
|
95
|
+
function escapeHtml(value) {
|
|
96
|
+
if (value == null || typeof value === "boolean")
|
|
97
|
+
return "";
|
|
98
|
+
if (typeof value === "number")
|
|
99
|
+
return String(value);
|
|
100
|
+
if (value instanceof HtmlEscapedString)
|
|
101
|
+
return value.value;
|
|
102
|
+
const s = String(value);
|
|
103
|
+
return _nativeEscape ? _nativeEscape(s) : portableEscape(s);
|
|
104
|
+
}
|
|
105
|
+
function safeHtml(html) {
|
|
106
|
+
return raw(html);
|
|
107
|
+
}
|
|
108
|
+
function isSafeHtml(value) {
|
|
109
|
+
return value instanceof HtmlEscapedString;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// src/server/renderer.ts
|
|
113
|
+
var componentCache = new WeakMap;
|
|
114
|
+
var pageRegistry = new Map;
|
|
115
|
+
function registerPage(name, page) {
|
|
116
|
+
pageRegistry.set(name, page);
|
|
117
|
+
}
|
|
118
|
+
function getPage(name) {
|
|
119
|
+
return pageRegistry.get(name);
|
|
120
|
+
}
|
|
121
|
+
function hasPage(name) {
|
|
122
|
+
return pageRegistry.has(name);
|
|
123
|
+
}
|
|
124
|
+
async function renderPage(name, data) {
|
|
125
|
+
const page = getPage(name);
|
|
126
|
+
if (!page) {
|
|
127
|
+
throw new Error(`Page "${name}" not found in registry`);
|
|
128
|
+
}
|
|
129
|
+
const element = await page(data);
|
|
130
|
+
return renderToString(element);
|
|
131
|
+
}
|
|
132
|
+
async function renderToString(node) {
|
|
133
|
+
if (node == null || typeof node === "boolean") {
|
|
134
|
+
return "";
|
|
135
|
+
}
|
|
136
|
+
if (typeof node === "string") {
|
|
137
|
+
return escapeHtml(node);
|
|
138
|
+
}
|
|
139
|
+
if (typeof node === "number") {
|
|
140
|
+
return String(node);
|
|
141
|
+
}
|
|
142
|
+
if (node instanceof HtmlEscapedString) {
|
|
143
|
+
return node.value;
|
|
144
|
+
}
|
|
145
|
+
if (Array.isArray(node)) {
|
|
146
|
+
const results = await Promise.all(node.map((child) => renderToString(child)));
|
|
147
|
+
return results.join("");
|
|
148
|
+
}
|
|
149
|
+
if (node instanceof Promise) {
|
|
150
|
+
return renderElement(await node);
|
|
151
|
+
}
|
|
152
|
+
return renderElement(node);
|
|
153
|
+
}
|
|
154
|
+
async function renderElement(element) {
|
|
155
|
+
const { tag, props, children } = element;
|
|
156
|
+
if (typeof tag === "function") {
|
|
157
|
+
const result = await tag(props);
|
|
158
|
+
return renderToString(result);
|
|
159
|
+
}
|
|
160
|
+
if (typeof tag === "string") {
|
|
161
|
+
return renderIntrinsicElement(tag, props, children);
|
|
162
|
+
}
|
|
163
|
+
return renderToString(children);
|
|
164
|
+
}
|
|
165
|
+
var VOID_ELEMENTS2 = new Set([
|
|
166
|
+
"area",
|
|
167
|
+
"base",
|
|
168
|
+
"br",
|
|
169
|
+
"col",
|
|
170
|
+
"embed",
|
|
171
|
+
"hr",
|
|
172
|
+
"img",
|
|
173
|
+
"input",
|
|
174
|
+
"link",
|
|
175
|
+
"meta",
|
|
176
|
+
"param",
|
|
177
|
+
"source",
|
|
178
|
+
"track",
|
|
179
|
+
"wbr"
|
|
180
|
+
]);
|
|
181
|
+
async function renderIntrinsicElement(tag, props, children) {
|
|
182
|
+
const attrs = renderAttributes(props);
|
|
183
|
+
if (VOID_ELEMENTS2.has(tag)) {
|
|
184
|
+
return attrs ? `<${tag}${attrs}>` : `<${tag}>`;
|
|
185
|
+
}
|
|
186
|
+
const childrenHtml = await renderChildren(children, props);
|
|
187
|
+
return attrs ? `<${tag}${attrs}>${childrenHtml}</${tag}>` : `<${tag}>${childrenHtml}</${tag}>`;
|
|
188
|
+
}
|
|
189
|
+
function renderAttributes(props) {
|
|
190
|
+
let attrs = "";
|
|
191
|
+
for (const [key, value] of Object.entries(props)) {
|
|
192
|
+
if (key === "children")
|
|
193
|
+
continue;
|
|
194
|
+
if (value == null || value === false)
|
|
195
|
+
continue;
|
|
196
|
+
if (value === true) {
|
|
197
|
+
attrs += ` ${key}`;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (key === "dangerouslySetInnerHTML") {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const attrName = key === "className" ? "class" : key;
|
|
204
|
+
const finalName = attrName === "htmlFor" ? "for" : attrName;
|
|
205
|
+
const attrValue = escapeHtml(String(value));
|
|
206
|
+
attrs += ` ${finalName}="${attrValue}"`;
|
|
207
|
+
}
|
|
208
|
+
return attrs;
|
|
209
|
+
}
|
|
210
|
+
async function renderChildren(children, props) {
|
|
211
|
+
const dangerous = props.dangerouslySetInnerHTML;
|
|
212
|
+
if (dangerous && typeof dangerous.__html === "string") {
|
|
213
|
+
return dangerous.__html;
|
|
214
|
+
}
|
|
215
|
+
return renderToString(children);
|
|
216
|
+
}
|
|
217
|
+
function isSlots(children) {
|
|
218
|
+
return children != null && typeof children === "object" && !Array.isArray(children) && !(children instanceof HtmlEscapedString);
|
|
219
|
+
}
|
|
220
|
+
// src/server/stream.ts
|
|
221
|
+
var VOID_ELEMENTS3 = new Set([
|
|
222
|
+
"area",
|
|
223
|
+
"base",
|
|
224
|
+
"br",
|
|
225
|
+
"col",
|
|
226
|
+
"embed",
|
|
227
|
+
"hr",
|
|
228
|
+
"img",
|
|
229
|
+
"input",
|
|
230
|
+
"link",
|
|
231
|
+
"meta",
|
|
232
|
+
"param",
|
|
233
|
+
"source",
|
|
234
|
+
"track",
|
|
235
|
+
"wbr"
|
|
236
|
+
]);
|
|
237
|
+
function streamPage(page, data) {
|
|
238
|
+
const encoder = new TextEncoder;
|
|
239
|
+
return new ReadableStream({
|
|
240
|
+
async start(controller) {
|
|
241
|
+
try {
|
|
242
|
+
const element = await page(data);
|
|
243
|
+
await streamNode(element, controller, encoder);
|
|
244
|
+
controller.close();
|
|
245
|
+
} catch (error) {
|
|
246
|
+
controller.error(error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async function streamNode(node, controller, encoder) {
|
|
252
|
+
if (node == null || typeof node === "boolean") {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (typeof node === "string") {
|
|
256
|
+
controller.enqueue(encoder.encode(escapeHtml(node)));
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (typeof node === "number") {
|
|
260
|
+
controller.enqueue(encoder.encode(String(node)));
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (node instanceof HtmlEscapedString) {
|
|
264
|
+
controller.enqueue(encoder.encode(node.value));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (Array.isArray(node)) {
|
|
268
|
+
for (const child of node) {
|
|
269
|
+
await streamNode(child, controller, encoder);
|
|
270
|
+
}
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (node instanceof Promise) {
|
|
274
|
+
const resolved = await node;
|
|
275
|
+
await streamElement(resolved, controller, encoder);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
await streamElement(node, controller, encoder);
|
|
279
|
+
}
|
|
280
|
+
async function streamElement(element, controller, encoder) {
|
|
281
|
+
const { tag, props, children } = element;
|
|
282
|
+
if (typeof tag === "function") {
|
|
283
|
+
const result = await tag(props);
|
|
284
|
+
await streamNode(result, controller, encoder);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (typeof tag === "string") {
|
|
288
|
+
await streamIntrinsicElement(tag, props, children, controller, encoder);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
await streamNode(children, controller, encoder);
|
|
292
|
+
}
|
|
293
|
+
async function streamIntrinsicElement(tag, props, children, controller, encoder) {
|
|
294
|
+
const attrs = renderAttributes2(props);
|
|
295
|
+
const dangerous = props.dangerouslySetInnerHTML;
|
|
296
|
+
if (VOID_ELEMENTS3.has(tag)) {
|
|
297
|
+
const html = attrs ? `<${tag}${attrs}>` : `<${tag}>`;
|
|
298
|
+
controller.enqueue(encoder.encode(html));
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const openTag = attrs ? `<${tag}${attrs}>` : `<${tag}>`;
|
|
302
|
+
controller.enqueue(encoder.encode(openTag));
|
|
303
|
+
if (dangerous && typeof dangerous.__html === "string") {
|
|
304
|
+
controller.enqueue(encoder.encode(dangerous.__html));
|
|
305
|
+
} else {
|
|
306
|
+
await streamNode(children, controller, encoder);
|
|
307
|
+
}
|
|
308
|
+
controller.enqueue(encoder.encode(`</${tag}>`));
|
|
309
|
+
}
|
|
310
|
+
function renderAttributes2(props) {
|
|
311
|
+
let attrs = "";
|
|
312
|
+
for (const [key, value] of Object.entries(props)) {
|
|
313
|
+
if (key === "children" || key === "dangerouslySetInnerHTML")
|
|
314
|
+
continue;
|
|
315
|
+
if (value == null || value === false)
|
|
316
|
+
continue;
|
|
317
|
+
if (value === true) {
|
|
318
|
+
attrs += ` ${key}`;
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
const attrName = key === "className" ? "class" : key === "htmlFor" ? "for" : key;
|
|
322
|
+
const attrValue = escapeHtml(String(value));
|
|
323
|
+
attrs += ` ${attrName}="${attrValue}"`;
|
|
324
|
+
}
|
|
325
|
+
return attrs;
|
|
326
|
+
}
|
|
327
|
+
// src/reactivity/scheduler.ts
|
|
328
|
+
var pendingEffects = new Set;
|
|
329
|
+
var flushScheduled = false;
|
|
330
|
+
var isFlushing = false;
|
|
331
|
+
var pendingCallbacks = [];
|
|
332
|
+
function scheduleEffect(effect) {
|
|
333
|
+
if (!effect.active)
|
|
334
|
+
return;
|
|
335
|
+
pendingEffects.add(effect);
|
|
336
|
+
scheduleFlush();
|
|
337
|
+
}
|
|
338
|
+
function unscheduleEffect(effect) {
|
|
339
|
+
pendingEffects.delete(effect);
|
|
340
|
+
}
|
|
341
|
+
function scheduleFlush() {
|
|
342
|
+
if (!flushScheduled) {
|
|
343
|
+
flushScheduled = true;
|
|
344
|
+
queueMicrotask(flush);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function flush() {
|
|
348
|
+
isFlushing = true;
|
|
349
|
+
const sorted = [...pendingEffects].sort((a, b) => a.id - b.id);
|
|
350
|
+
pendingEffects.clear();
|
|
351
|
+
for (const effect of sorted) {
|
|
352
|
+
if (effect.active) {
|
|
353
|
+
effect.run();
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
let safety = 10;
|
|
357
|
+
while (pendingEffects.size > 0 && safety-- > 0) {
|
|
358
|
+
const next = [...pendingEffects].sort((a, b) => a.id - b.id);
|
|
359
|
+
pendingEffects.clear();
|
|
360
|
+
for (const effect of next) {
|
|
361
|
+
if (effect.active) {
|
|
362
|
+
effect.run();
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
flushScheduled = false;
|
|
367
|
+
isFlushing = false;
|
|
368
|
+
const cbs = pendingCallbacks.splice(0);
|
|
369
|
+
for (const cb of cbs) {
|
|
370
|
+
cb();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
function nextTick(fn) {
|
|
374
|
+
return new Promise((resolve) => {
|
|
375
|
+
const callback = () => {
|
|
376
|
+
fn?.();
|
|
377
|
+
resolve();
|
|
378
|
+
};
|
|
379
|
+
if (flushScheduled || isFlushing) {
|
|
380
|
+
pendingCallbacks.push(callback);
|
|
381
|
+
} else {
|
|
382
|
+
queueMicrotask(callback);
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
function flushSync() {
|
|
387
|
+
if (flushScheduled) {
|
|
388
|
+
flushScheduled = false;
|
|
389
|
+
flush();
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// src/reactivity/effect.ts
|
|
394
|
+
var activeEffect = null;
|
|
395
|
+
var effectStack = [];
|
|
396
|
+
var effectIdCounter = 0;
|
|
397
|
+
|
|
398
|
+
class ReactiveEffect {
|
|
399
|
+
id;
|
|
400
|
+
active = true;
|
|
401
|
+
fn;
|
|
402
|
+
cleanup = undefined;
|
|
403
|
+
deps = new Set;
|
|
404
|
+
constructor(fn) {
|
|
405
|
+
this.id = effectIdCounter++;
|
|
406
|
+
this.fn = fn;
|
|
407
|
+
}
|
|
408
|
+
run() {
|
|
409
|
+
if (!this.active)
|
|
410
|
+
return;
|
|
411
|
+
if (effectStack.includes(this))
|
|
412
|
+
return;
|
|
413
|
+
this.cleanupDeps();
|
|
414
|
+
if (this.cleanup) {
|
|
415
|
+
this.cleanup();
|
|
416
|
+
this.cleanup = undefined;
|
|
417
|
+
}
|
|
418
|
+
effectStack.push(this);
|
|
419
|
+
const prevEffect = activeEffect;
|
|
420
|
+
activeEffect = this;
|
|
421
|
+
try {
|
|
422
|
+
const result = this.fn();
|
|
423
|
+
if (typeof result === "function") {
|
|
424
|
+
this.cleanup = result;
|
|
425
|
+
}
|
|
426
|
+
} finally {
|
|
427
|
+
activeEffect = prevEffect;
|
|
428
|
+
effectStack.pop();
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
cleanupDeps() {
|
|
432
|
+
for (const dep of this.deps) {
|
|
433
|
+
dep.subscribers.delete(this);
|
|
434
|
+
}
|
|
435
|
+
this.deps.clear();
|
|
436
|
+
}
|
|
437
|
+
notify() {
|
|
438
|
+
scheduleEffect(this);
|
|
439
|
+
}
|
|
440
|
+
dispose() {
|
|
441
|
+
if (!this.active)
|
|
442
|
+
return;
|
|
443
|
+
this.active = false;
|
|
444
|
+
if (this.cleanup) {
|
|
445
|
+
this.cleanup();
|
|
446
|
+
this.cleanup = undefined;
|
|
447
|
+
}
|
|
448
|
+
this.cleanupDeps();
|
|
449
|
+
unscheduleEffect(this);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
function effect(fn) {
|
|
453
|
+
const e = new ReactiveEffect(fn);
|
|
454
|
+
e.run();
|
|
455
|
+
return () => e.dispose();
|
|
456
|
+
}
|
|
457
|
+
function track(dep) {
|
|
458
|
+
if (activeEffect) {
|
|
459
|
+
dep.subscribers.add(activeEffect);
|
|
460
|
+
activeEffect.deps.add(dep);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
function trigger(dep) {
|
|
464
|
+
const effects = [...dep.subscribers];
|
|
465
|
+
for (const effect2 of effects) {
|
|
466
|
+
effect2.notify();
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// src/reactivity/signal.ts
|
|
471
|
+
var SIGNAL_BRAND = Symbol("Sinwan:signal");
|
|
472
|
+
|
|
473
|
+
class SignalImpl {
|
|
474
|
+
[SIGNAL_BRAND] = true;
|
|
475
|
+
subscribers = new Set;
|
|
476
|
+
_value;
|
|
477
|
+
_manualSubs = new Set;
|
|
478
|
+
constructor(initial) {
|
|
479
|
+
this._value = initial;
|
|
480
|
+
}
|
|
481
|
+
get value() {
|
|
482
|
+
track(this);
|
|
483
|
+
return this._value;
|
|
484
|
+
}
|
|
485
|
+
set value(newValue) {
|
|
486
|
+
if (Object.is(this._value, newValue))
|
|
487
|
+
return;
|
|
488
|
+
this._value = newValue;
|
|
489
|
+
trigger(this);
|
|
490
|
+
for (const fn of this._manualSubs) {
|
|
491
|
+
fn(newValue);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
peek() {
|
|
495
|
+
return this._value;
|
|
496
|
+
}
|
|
497
|
+
subscribe(fn) {
|
|
498
|
+
this._manualSubs.add(fn);
|
|
499
|
+
return () => {
|
|
500
|
+
this._manualSubs.delete(fn);
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
toString() {
|
|
504
|
+
return String(this.value);
|
|
505
|
+
}
|
|
506
|
+
valueOf() {
|
|
507
|
+
return this.value;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
function signal(initial) {
|
|
511
|
+
return new SignalImpl(initial);
|
|
512
|
+
}
|
|
513
|
+
function isSignal(value) {
|
|
514
|
+
return value != null && typeof value === "object" && SIGNAL_BRAND in value;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// src/reactivity/computed.ts
|
|
518
|
+
var COMPUTED_BRAND = Symbol("Sinwan:computed");
|
|
519
|
+
|
|
520
|
+
class ComputedImpl {
|
|
521
|
+
[COMPUTED_BRAND] = true;
|
|
522
|
+
subscribers = new Set;
|
|
523
|
+
_value;
|
|
524
|
+
_dirty = true;
|
|
525
|
+
_effect;
|
|
526
|
+
constructor(getter) {
|
|
527
|
+
const self = this;
|
|
528
|
+
this._effect = new ReactiveEffect(() => {
|
|
529
|
+
self._value = getter();
|
|
530
|
+
});
|
|
531
|
+
this._effect.notify = function() {
|
|
532
|
+
if (!self._dirty) {
|
|
533
|
+
self._dirty = true;
|
|
534
|
+
trigger(self);
|
|
535
|
+
}
|
|
536
|
+
};
|
|
537
|
+
this._effect.run();
|
|
538
|
+
this._dirty = false;
|
|
539
|
+
}
|
|
540
|
+
get value() {
|
|
541
|
+
track(this);
|
|
542
|
+
if (this._dirty) {
|
|
543
|
+
this._effect.run();
|
|
544
|
+
this._dirty = false;
|
|
545
|
+
}
|
|
546
|
+
return this._value;
|
|
547
|
+
}
|
|
548
|
+
peek() {
|
|
549
|
+
if (this._dirty) {
|
|
550
|
+
this._effect.run();
|
|
551
|
+
this._dirty = false;
|
|
552
|
+
}
|
|
553
|
+
return this._value;
|
|
554
|
+
}
|
|
555
|
+
toString() {
|
|
556
|
+
return String(this.value);
|
|
557
|
+
}
|
|
558
|
+
valueOf() {
|
|
559
|
+
return this.value;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
function computed(getter) {
|
|
563
|
+
return new ComputedImpl(getter);
|
|
564
|
+
}
|
|
565
|
+
function isComputed(value) {
|
|
566
|
+
return value != null && typeof value === "object" && COMPUTED_BRAND in value;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// src/hydration/markers.ts
|
|
570
|
+
var COMP_ID_ATTR = "data-sinwan-id";
|
|
571
|
+
var COMP_ID_PREFIX = "c";
|
|
572
|
+
var TEXT_MARKER_OPEN = "sinwan-t:";
|
|
573
|
+
var TEXT_MARKER_CLOSE = "/sinwan-t";
|
|
574
|
+
var EVENT_ATTR = "data-sinwan-ev";
|
|
575
|
+
function compId(index) {
|
|
576
|
+
return `${COMP_ID_PREFIX}${index}`;
|
|
577
|
+
}
|
|
578
|
+
function textMarkerOpen(index) {
|
|
579
|
+
return `<!--${TEXT_MARKER_OPEN}${index}-->`;
|
|
580
|
+
}
|
|
581
|
+
function textMarkerCloseStr() {
|
|
582
|
+
return `<!--${TEXT_MARKER_CLOSE}-->`;
|
|
583
|
+
}
|
|
584
|
+
function parseTextOpenMarker(node) {
|
|
585
|
+
const data = node.data;
|
|
586
|
+
if (data.startsWith(TEXT_MARKER_OPEN)) {
|
|
587
|
+
const idx = parseInt(data.slice(TEXT_MARKER_OPEN.length), 10);
|
|
588
|
+
return Number.isNaN(idx) ? -1 : idx;
|
|
589
|
+
}
|
|
590
|
+
return -1;
|
|
591
|
+
}
|
|
592
|
+
function isTextCloseMarker(node) {
|
|
593
|
+
return node.data === TEXT_MARKER_CLOSE;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
// src/renderer/dom-ops.ts
|
|
597
|
+
var domOps = {
|
|
598
|
+
createElement(tag) {
|
|
599
|
+
return document.createElement(tag);
|
|
600
|
+
},
|
|
601
|
+
createTextNode(text) {
|
|
602
|
+
return document.createTextNode(text);
|
|
603
|
+
},
|
|
604
|
+
createComment(text) {
|
|
605
|
+
return document.createComment(text);
|
|
606
|
+
},
|
|
607
|
+
setAttribute(el, key, value) {
|
|
608
|
+
el.setAttribute(key, value);
|
|
609
|
+
},
|
|
610
|
+
removeAttribute(el, key) {
|
|
611
|
+
el.removeAttribute(key);
|
|
612
|
+
},
|
|
613
|
+
setProperty(el, key, value) {
|
|
614
|
+
el[key] = value;
|
|
615
|
+
},
|
|
616
|
+
insertBefore(parent, child, anchor) {
|
|
617
|
+
parent.insertBefore(child, anchor);
|
|
618
|
+
},
|
|
619
|
+
appendChild(parent, child) {
|
|
620
|
+
parent.appendChild(child);
|
|
621
|
+
},
|
|
622
|
+
remove(node) {
|
|
623
|
+
node.parentNode?.removeChild(node);
|
|
624
|
+
},
|
|
625
|
+
setTextContent(node, text) {
|
|
626
|
+
node.data = text;
|
|
627
|
+
},
|
|
628
|
+
addEventListener(el, event, handler) {
|
|
629
|
+
el.addEventListener(event, handler);
|
|
630
|
+
},
|
|
631
|
+
removeEventListener(el, event, handler) {
|
|
632
|
+
el.removeEventListener(event, handler);
|
|
633
|
+
},
|
|
634
|
+
parentNode(node) {
|
|
635
|
+
return node.parentNode;
|
|
636
|
+
},
|
|
637
|
+
nextSibling(node) {
|
|
638
|
+
return node.nextSibling;
|
|
639
|
+
}
|
|
640
|
+
};
|
|
641
|
+
|
|
642
|
+
// src/renderer/events.ts
|
|
643
|
+
function isEventProp(key) {
|
|
644
|
+
return key.length > 2 && key[0] === "o" && key[1] === "n" && key[2] >= "A" && key[2] <= "Z";
|
|
645
|
+
}
|
|
646
|
+
function toEventName(key) {
|
|
647
|
+
return key.slice(2).toLowerCase();
|
|
648
|
+
}
|
|
649
|
+
function bindEvent(el, eventName, handler) {
|
|
650
|
+
domOps.addEventListener(el, eventName, handler);
|
|
651
|
+
return () => {
|
|
652
|
+
domOps.removeEventListener(el, eventName, handler);
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
function bindEvents(el, props) {
|
|
656
|
+
const cleanups = [];
|
|
657
|
+
for (const key of Object.keys(props)) {
|
|
658
|
+
if (isEventProp(key)) {
|
|
659
|
+
const handler = props[key];
|
|
660
|
+
if (typeof handler === "function") {
|
|
661
|
+
const eventName = toEventName(key);
|
|
662
|
+
cleanups.push(bindEvent(el, eventName, handler));
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
return cleanups;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// src/component/instance.ts
|
|
670
|
+
var uidCounter = 0;
|
|
671
|
+
function createComponentInstance(component, props, parent) {
|
|
672
|
+
return {
|
|
673
|
+
uid: uidCounter++,
|
|
674
|
+
component,
|
|
675
|
+
props,
|
|
676
|
+
element: null,
|
|
677
|
+
parent,
|
|
678
|
+
children: [],
|
|
679
|
+
effects: [],
|
|
680
|
+
_mountedHooks: [],
|
|
681
|
+
_unmountedHooks: [],
|
|
682
|
+
_updatedHooks: [],
|
|
683
|
+
_errorHooks: [],
|
|
684
|
+
provides: parent ? Object.create(parent.provides) : Object.create(null),
|
|
685
|
+
isMounted: false,
|
|
686
|
+
isUnmounted: false
|
|
687
|
+
};
|
|
688
|
+
}
|
|
689
|
+
var currentInstance = null;
|
|
690
|
+
function getCurrentInstance() {
|
|
691
|
+
return currentInstance;
|
|
692
|
+
}
|
|
693
|
+
function setCurrentInstance(instance) {
|
|
694
|
+
const prev = currentInstance;
|
|
695
|
+
currentInstance = instance;
|
|
696
|
+
return prev;
|
|
697
|
+
}
|
|
698
|
+
function fireMountedHooks(instance) {
|
|
699
|
+
for (const child of instance.children) {
|
|
700
|
+
fireMountedHooks(child);
|
|
701
|
+
}
|
|
702
|
+
if (!instance.isMounted) {
|
|
703
|
+
instance.isMounted = true;
|
|
704
|
+
for (const hook of instance._mountedHooks) {
|
|
705
|
+
hook();
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
function fireUnmountedHooks(instance) {
|
|
710
|
+
for (const child of instance.children) {
|
|
711
|
+
fireUnmountedHooks(child);
|
|
712
|
+
}
|
|
713
|
+
if (instance.isMounted && !instance.isUnmounted) {
|
|
714
|
+
instance.isUnmounted = true;
|
|
715
|
+
instance.isMounted = false;
|
|
716
|
+
for (const hook of instance._unmountedHooks) {
|
|
717
|
+
hook();
|
|
718
|
+
}
|
|
719
|
+
for (const dispose of instance.effects) {
|
|
720
|
+
dispose();
|
|
721
|
+
}
|
|
722
|
+
instance.effects.length = 0;
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
function handleComponentError(instance, err) {
|
|
726
|
+
let current = instance;
|
|
727
|
+
while (current) {
|
|
728
|
+
if (current._errorHooks.length > 0) {
|
|
729
|
+
for (const hook of current._errorHooks) {
|
|
730
|
+
hook(err);
|
|
731
|
+
}
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
current = current.parent;
|
|
735
|
+
}
|
|
736
|
+
console.error("[Sinwan] Unhandled component error:", err);
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
// src/server/hydration-markers.ts
|
|
740
|
+
function createHydrationContext() {
|
|
741
|
+
return { componentIndex: 0, textIndex: 0, eventIndex: 0 };
|
|
742
|
+
}
|
|
743
|
+
async function renderToHydratableString(component, props) {
|
|
744
|
+
const ctx = createHydrationContext();
|
|
745
|
+
const mergedProps = props ?? {};
|
|
746
|
+
const instance = createComponentInstance(component, mergedProps, null);
|
|
747
|
+
setCurrentInstance(instance);
|
|
748
|
+
const result = await component(mergedProps);
|
|
749
|
+
setCurrentInstance(null);
|
|
750
|
+
if (result && typeof result === "object" && "tag" in result) {
|
|
751
|
+
return renderElementH(result, ctx, true);
|
|
752
|
+
}
|
|
753
|
+
return renderNodeH(result, ctx);
|
|
754
|
+
}
|
|
755
|
+
async function renderNodeToHydratableString(node) {
|
|
756
|
+
const ctx = createHydrationContext();
|
|
757
|
+
return renderNodeH(node, ctx);
|
|
758
|
+
}
|
|
759
|
+
var VOID_ELEMENTS4 = new Set([
|
|
760
|
+
"area",
|
|
761
|
+
"base",
|
|
762
|
+
"br",
|
|
763
|
+
"col",
|
|
764
|
+
"embed",
|
|
765
|
+
"hr",
|
|
766
|
+
"img",
|
|
767
|
+
"input",
|
|
768
|
+
"link",
|
|
769
|
+
"meta",
|
|
770
|
+
"param",
|
|
771
|
+
"source",
|
|
772
|
+
"track",
|
|
773
|
+
"wbr"
|
|
774
|
+
]);
|
|
775
|
+
function renderNodeH(node, ctx) {
|
|
776
|
+
if (node == null || typeof node === "boolean")
|
|
777
|
+
return "";
|
|
778
|
+
if (typeof node === "string")
|
|
779
|
+
return escapeHtml(node);
|
|
780
|
+
if (typeof node === "number")
|
|
781
|
+
return String(node);
|
|
782
|
+
if (node instanceof HtmlEscapedString)
|
|
783
|
+
return node.value;
|
|
784
|
+
if (isSignal(node) || isComputed(node)) {
|
|
785
|
+
const value = node.value;
|
|
786
|
+
const idx = ctx.textIndex++;
|
|
787
|
+
return `${textMarkerOpen(idx)}${escapeHtml(String(value))}${textMarkerCloseStr()}`;
|
|
788
|
+
}
|
|
789
|
+
if (Array.isArray(node)) {
|
|
790
|
+
return node.map((child) => renderNodeH(child, ctx)).join("");
|
|
791
|
+
}
|
|
792
|
+
if (node instanceof Promise) {
|
|
793
|
+
return "";
|
|
794
|
+
}
|
|
795
|
+
if (typeof node === "object" && "tag" in node) {
|
|
796
|
+
return renderElementH(node, ctx, false);
|
|
797
|
+
}
|
|
798
|
+
return escapeHtml(String(node));
|
|
799
|
+
}
|
|
800
|
+
function renderElementH(element, ctx, isComponentRoot) {
|
|
801
|
+
const { tag, props, children } = element;
|
|
802
|
+
if (tag === "") {
|
|
803
|
+
return children.map((child) => renderNodeH(child, ctx)).join("");
|
|
804
|
+
}
|
|
805
|
+
if (typeof tag === "function") {
|
|
806
|
+
return renderComponentH(tag, props, ctx);
|
|
807
|
+
}
|
|
808
|
+
if (typeof tag === "string") {
|
|
809
|
+
return renderIntrinsicH(tag, props, children, ctx, isComponentRoot);
|
|
810
|
+
}
|
|
811
|
+
return children.map((child) => renderNodeH(child, ctx)).join("");
|
|
812
|
+
}
|
|
813
|
+
function renderComponentH(component, props, ctx) {
|
|
814
|
+
const parentInstance = globalThis.__SinwanCurrentInstance;
|
|
815
|
+
const instance = createComponentInstance(component, props, null);
|
|
816
|
+
const prev = setCurrentInstance(instance);
|
|
817
|
+
const result = component(props);
|
|
818
|
+
setCurrentInstance(prev);
|
|
819
|
+
if (result && typeof result === "object" && "tag" in result) {
|
|
820
|
+
return renderElementH(result, ctx, true);
|
|
821
|
+
}
|
|
822
|
+
return renderNodeH(result, ctx);
|
|
823
|
+
}
|
|
824
|
+
function renderIntrinsicH(tag, props, children, ctx, isComponentRoot) {
|
|
825
|
+
let attrs = "";
|
|
826
|
+
if (isComponentRoot) {
|
|
827
|
+
attrs += ` ${COMP_ID_ATTR}="${compId(ctx.componentIndex++)}"`;
|
|
828
|
+
}
|
|
829
|
+
const eventParts = [];
|
|
830
|
+
for (const [key, value] of Object.entries(props)) {
|
|
831
|
+
if (key === "children" || key === "dangerouslySetInnerHTML")
|
|
832
|
+
continue;
|
|
833
|
+
if (isEventProp(key)) {
|
|
834
|
+
const eventName = toEventName(key);
|
|
835
|
+
eventParts.push(`${eventName}:${ctx.eventIndex++}`);
|
|
836
|
+
continue;
|
|
837
|
+
}
|
|
838
|
+
if (value == null || value === false)
|
|
839
|
+
continue;
|
|
840
|
+
let resolvedValue = value;
|
|
841
|
+
if (isSignal(value) || isComputed(value)) {
|
|
842
|
+
resolvedValue = value.value;
|
|
843
|
+
}
|
|
844
|
+
if (resolvedValue === true) {
|
|
845
|
+
const attrName2 = key === "className" ? "class" : key === "htmlFor" ? "for" : key;
|
|
846
|
+
attrs += ` ${attrName2}`;
|
|
847
|
+
continue;
|
|
848
|
+
}
|
|
849
|
+
const attrName = key === "className" ? "class" : key === "htmlFor" ? "for" : key;
|
|
850
|
+
attrs += ` ${attrName}="${escapeHtml(String(resolvedValue))}"`;
|
|
851
|
+
}
|
|
852
|
+
if (eventParts.length > 0) {
|
|
853
|
+
attrs += ` ${EVENT_ATTR}="${eventParts.join(",")}"`;
|
|
854
|
+
}
|
|
855
|
+
if (VOID_ELEMENTS4.has(tag)) {
|
|
856
|
+
return `<${tag}${attrs}>`;
|
|
857
|
+
}
|
|
858
|
+
const dangerous = props.dangerouslySetInnerHTML;
|
|
859
|
+
if (dangerous && typeof dangerous.__html === "string") {
|
|
860
|
+
return `<${tag}${attrs}>${dangerous.__html}</${tag}>`;
|
|
861
|
+
}
|
|
862
|
+
const childrenHtml = children.map((child) => renderNodeH(child, ctx)).join("");
|
|
863
|
+
return `<${tag}${attrs}>${childrenHtml}</${tag}>`;
|
|
864
|
+
}
|
|
865
|
+
export {
|
|
866
|
+
streamPage,
|
|
867
|
+
renderToString,
|
|
868
|
+
renderToHydratableString,
|
|
869
|
+
renderPage,
|
|
870
|
+
renderNodeToHydratableString,
|
|
871
|
+
registerPage,
|
|
872
|
+
isSlots,
|
|
873
|
+
hasPage,
|
|
874
|
+
getPage
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
//# debugId=46FB02649D98C84264756E2164756E21
|
|
878
|
+
//# sourceMappingURL=index.development.js.map
|