@symbiotejs/symbiote 3.4.6 → 3.5.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/AI_REFERENCE.md +15 -6
- package/CHANGELOG.md +18 -1
- package/README.md +13 -21
- package/core/AppRouter.js +16 -9
- package/core/PubSub.js +5 -12
- package/core/Symbiote.js +27 -18
- package/core/devMessages.js +59 -0
- package/core/html.js +2 -4
- package/core/itemizeProcessor-keyed.js +2 -1
- package/core/itemizeProcessor.js +2 -1
- package/core/tpl-processors.js +3 -9
- package/core/warn.js +27 -0
- package/package.json +9 -1
- package/types/core/AppRouter.d.ts +3 -3
- package/types/core/AppRouter.d.ts.map +1 -1
- package/types/core/PubSub.d.ts.map +1 -1
- package/types/core/Symbiote.d.ts.map +1 -1
- package/types/core/devMessages.d.ts +2 -0
- package/types/core/devMessages.d.ts.map +1 -0
- package/types/core/html.d.ts.map +1 -1
- package/types/core/itemizeProcessor-keyed.d.ts.map +1 -1
- package/types/core/itemizeProcessor.d.ts.map +1 -1
- package/types/core/tpl-processors.d.ts.map +1 -1
- package/types/core/warn.d.ts +4 -0
- package/types/core/warn.d.ts.map +1 -0
package/AI_REFERENCE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Symbiote.js — AI Context Reference (v3.x)
|
|
2
2
|
|
|
3
3
|
> **Purpose**: Authoritative reference for AI code assistants. All information is derived from source code analysis of [symbiote.js](https://github.com/symbiotejs/symbiote.js).
|
|
4
|
-
> Current version: **3.4.
|
|
4
|
+
> Current version: **3.4.7**. Zero dependencies. ~6.4 KB brotli / ~7.1 KB gzip.
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -775,14 +775,23 @@ Enable verbose warnings during development:
|
|
|
775
775
|
Symbiote.devMode = true;
|
|
776
776
|
```
|
|
777
777
|
|
|
778
|
+
### Dev messages module
|
|
779
|
+
|
|
780
|
+
All warning/error strings are in an optional module. Without it, warnings print short codes like `[Symbiote W5]`. Import once to get full messages and auto-enable `devMode`:
|
|
781
|
+
```js
|
|
782
|
+
import '@symbiotejs/symbiote/core/devMessages.js';
|
|
783
|
+
```
|
|
784
|
+
|
|
778
785
|
**Always-on** (regardless of `devMode`):
|
|
779
|
-
- `
|
|
780
|
-
- `
|
|
786
|
+
- `W1` PubSub: cannot read/publish/subscribe — property not found
|
|
787
|
+
- `W3` context already registered, `W4` context not found
|
|
788
|
+
- `W5` custom template not found, `W8` tag already registered, `W9` CSS data parse error
|
|
789
|
+
- `W13`/`W14` AppRouter messages, `W16` itemize data type error
|
|
790
|
+
- `E15` `this` in template interpolation error (`html` tag detects `${this.x}` usage)
|
|
781
791
|
|
|
782
792
|
**Dev-only** (`devMode = true`):
|
|
783
|
-
-
|
|
784
|
-
-
|
|
785
|
-
- `*prop` conflict — warns when a later component tries to set a different initial value for the same shared prop
|
|
793
|
+
- `W2` type change on publish, `W6` `*prop` without ctx, `W7` shared prop conflict
|
|
794
|
+
- `W10` CSS data binding in SSR, `W11` unresolved binding key, `W12` text-node binding in SSR/ISO
|
|
786
795
|
|
|
787
796
|
---
|
|
788
797
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 3.
|
|
3
|
+
## 3.5.0
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **External dev messages module (`core/devMessages.js`).** All warning and error message strings have been extracted from core files into an optional module. Core files now emit short numeric codes (e.g. `[Symbiote W5]`). Import `@symbiotejs/symbiote/core/devMessages.js` once to get full human-readable messages. This reduces the core bundle size by removing all formatting strings from `PubSub.js`, `Symbiote.js`, `tpl-processors.js`, `AppRouter.js`, `html.js`, and both itemize processors.
|
|
8
|
+
|
|
9
|
+
- **`core/warn.js` — lightweight message dispatcher.** Exports `warnMsg(code, ...args)`, `errMsg(code, ...args)`, and `registerMessages(map)`. All core files now use this dispatcher instead of inline `console.warn`/`console.error` calls.
|
|
10
|
+
|
|
11
|
+
- **AppRouter: `title` accepts functions.** Route descriptors and `setDefaultTitle()` now accept `() => String` in addition to plain strings. The function is called at navigation time, enabling dynamic or localized page titles:
|
|
12
|
+
```js
|
|
13
|
+
AppRouter.setDefaultTitle(() => i18n('app.title'));
|
|
14
|
+
AppRouter.initRoutingCtx('R', {
|
|
15
|
+
home: { pattern: '/', title: () => i18n('home.title'), default: true },
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 3.4.7
|
|
4
20
|
|
|
5
21
|
### Fixed
|
|
6
22
|
|
|
7
23
|
- **PubSub: computed properties with cross-context deps no longer depend on import order.** When a computed property declared `deps: ['CTX/prop']` and the target context wasn't registered yet, the subscription was silently skipped. Now deferred deps are stored in `PubSub.pendingDeps` and automatically resolved when `registerCtx()` is called.
|
|
8
24
|
- **Symbiote: named context access no longer crashes when context is not yet registered.** The `$` proxy, `sub()`, `notify()`, `has()`, and `add()` now handle missing named contexts gracefully (return `undefined`/no-op instead of throwing).
|
|
25
|
+
- **Symbiote: template bindings for named contexts are deferred when context is not yet registered.** Previously, `sub()` silently dropped the subscription; now it queues it via `PubSub.pendingDeps` and resolves automatically when `registerCtx()` is called.
|
|
9
26
|
|
|
10
27
|
## 3.4.4
|
|
11
28
|
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[](https://github.com/symbiotejs/symbiote.js/actions/workflows/tests.yml)
|
|
2
2
|
[](https://www.npmjs.com/package/@symbiotejs/symbiote)
|
|
3
3
|
[](https://www.npmjs.com/package/@symbiotejs/symbiote)
|
|
4
|
-

|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
<img src="https://rnd-pro.com/svg/symbiote/index.svg" width="200" alt="Symbiote.js">
|
|
11
11
|
|
|
12
|
-
A lightweight, standards-first UI library built on Web Components. No virtual DOM, no compiler, no build step required — works directly in the browser. A bundler is recommended for production performance, but entirely optional. **~
|
|
12
|
+
A lightweight, standards-first UI library built on Web Components. No virtual DOM, no compiler, no build step required — works directly in the browser. A bundler is recommended for production performance, but entirely optional. **~6kb** brotli / **~7kb** gzip.
|
|
13
13
|
|
|
14
14
|
Symbiote.js gives you the convenience of a modern framework while staying close to the native platform — HTML, CSS, and DOM APIs. Components are real custom elements that work everywhere: in any framework, in plain HTML, or in a micro-frontend architecture. And with **isomorphic mode**, the same component code works on the server and the client — server-rendered pages hydrate automatically, no diffing, no mismatch errors.
|
|
15
15
|
|
|
@@ -20,7 +20,7 @@ Symbiote.js gives you the convenience of a modern framework while staying close
|
|
|
20
20
|
- **Computed properties** — reactive derived state with microtask batching.
|
|
21
21
|
- **Path-based router** — optional `AppRouter` module with `:param` extraction, route guards, and lazy loading.
|
|
22
22
|
- **Exit animations** — `animateOut(el)` for CSS-driven exit transitions, integrated into itemize API.
|
|
23
|
-
- **Dev mode** — `Symbiote.devMode` enables verbose warnings for
|
|
23
|
+
- **Dev mode** — `Symbiote.devMode` enables verbose warnings; import `devMessages.js` for full human-readable messages.
|
|
24
24
|
- **DSD hydration** — `ssrMode` supports both light DOM and Declarative Shadow DOM.
|
|
25
25
|
- **Class property fallback** — binding keys not in `init$` fall back to own class properties/methods.
|
|
26
26
|
- And [more](https://github.com/symbiotejs/symbiote.js/blob/main/CHANGELOG.md).
|
|
@@ -64,7 +64,6 @@ import Symbiote, { html, css } from '@symbiotejs/symbiote';
|
|
|
64
64
|
## Isomorphic Web Components
|
|
65
65
|
|
|
66
66
|
One component. Server-rendered or client-rendered — automatically. Set `isoMode = true` and the component figures it out: if server-rendered content exists, it hydrates; otherwise it renders from template. No conditional logic, no separate server/client versions:
|
|
67
|
-
|
|
68
67
|
```js
|
|
69
68
|
class MyComponent extends Symbiote {
|
|
70
69
|
isoMode = true;
|
|
@@ -75,7 +74,7 @@ class MyComponent extends Symbiote {
|
|
|
75
74
|
}
|
|
76
75
|
|
|
77
76
|
MyComponent.template = html`
|
|
78
|
-
<h2
|
|
77
|
+
<h2 ${{textContent: 'count'}}></h2>
|
|
79
78
|
<button ${{onclick: 'increment'}}>Click me!</button>
|
|
80
79
|
`;
|
|
81
80
|
MyComponent.reg('my-component');
|
|
@@ -157,10 +156,9 @@ The `html` function supports two interpolation modes:
|
|
|
157
156
|
- **Object** → reactive binding: `${{onclick: 'handler'}}`
|
|
158
157
|
- **String/number** → native concatenation: `${pageTitle}`
|
|
159
158
|
|
|
160
|
-
### Itemize (lists)
|
|
161
|
-
|
|
162
|
-
Render lists from data arrays with efficient diffing:
|
|
159
|
+
### Itemize (dynamic reactive lists)
|
|
163
160
|
|
|
161
|
+
Render lists from data arrays with efficient updates:
|
|
164
162
|
```js
|
|
165
163
|
class TaskList extends Symbiote {
|
|
166
164
|
tasks = [
|
|
@@ -176,11 +174,11 @@ class TaskList extends Symbiote {
|
|
|
176
174
|
}
|
|
177
175
|
|
|
178
176
|
TaskList.template = html`
|
|
179
|
-
<
|
|
177
|
+
<div itemize="tasks">
|
|
180
178
|
<template>
|
|
181
|
-
<
|
|
179
|
+
<div ${{onclick: '^onItemClick'}}>{{name}}</div>
|
|
182
180
|
</template>
|
|
183
|
-
</
|
|
181
|
+
</div>
|
|
184
182
|
`;
|
|
185
183
|
```
|
|
186
184
|
|
|
@@ -312,18 +310,12 @@ Components can read CSS custom properties as reactive state via `cssInit$`:
|
|
|
312
310
|
|
|
313
311
|
```css
|
|
314
312
|
my-widget {
|
|
315
|
-
--columns: 3;
|
|
316
313
|
--label: 'Click me';
|
|
317
314
|
}
|
|
318
315
|
```
|
|
319
316
|
|
|
320
317
|
```js
|
|
321
|
-
class MyWidget extends Symbiote {
|
|
322
|
-
cssInit$ = {
|
|
323
|
-
'--columns': 1,
|
|
324
|
-
'--label': '',
|
|
325
|
-
}
|
|
326
|
-
}
|
|
318
|
+
class MyWidget extends Symbiote {...}
|
|
327
319
|
|
|
328
320
|
MyWidget.template = html`
|
|
329
321
|
<span>{{--label}}</span>
|
|
@@ -344,12 +336,12 @@ CSS values are parsed automatically — quoted strings become strings, numbers b
|
|
|
344
336
|
|
|
345
337
|
| Library | Minified | Gzip | Brotli |
|
|
346
338
|
|---------|----------|------|--------|
|
|
347
|
-
| **Symbiote.js** (core) |
|
|
348
|
-
| **Symbiote.js** (full, with AppRouter) | 24.
|
|
339
|
+
| **Symbiote.js** (core) | 20.2 kb | 7.1 kb | **6.4 kb** |
|
|
340
|
+
| **Symbiote.js** (full, with AppRouter) | 24.4 kb | 8.5 kb | **7.6 kb** |
|
|
349
341
|
| **Lit** 3.3 | 15.5 kb | 6.0 kb | **~5.1 kb** |
|
|
350
342
|
| **React 19 + ReactDOM** | ~186 kb | ~59 kb | **~50 kb** |
|
|
351
343
|
|
|
352
|
-
Symbiote and Lit have similar base sizes, but Symbiote's **6.
|
|
344
|
+
Symbiote and Lit have similar base sizes, but Symbiote's **6.4 kb** core includes more built-in features: global state management, lists (itemize API), exit animations, computed properties etc. Lit needs additional packages for comparable features. React is **~8× larger** before adding a router, state manager, or SSR framework.
|
|
353
345
|
|
|
354
346
|
## Browser support
|
|
355
347
|
|
package/core/AppRouter.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import PubSub from './PubSub.js';
|
|
2
|
+
import { warnMsg } from './warn.js';
|
|
2
3
|
|
|
3
4
|
export class AppRouter {
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* @typedef {{
|
|
7
|
-
* title?: String,
|
|
8
|
+
* title?: String | (() => String),
|
|
8
9
|
* default?: Boolean,
|
|
9
10
|
* error?: Boolean,
|
|
10
11
|
* pattern?: String,
|
|
@@ -49,14 +50,19 @@ export class AppRouter {
|
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
static #print(msg) {
|
|
52
|
-
|
|
53
|
+
warnMsg(13, msg);
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
/** @param {String} title */
|
|
56
|
+
/** @param {String | (() => String)} title */
|
|
56
57
|
static setDefaultTitle(title) {
|
|
57
58
|
this.defaultTitle = title;
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
/** @param {String | (() => String) | undefined} title */
|
|
62
|
+
static #resolveTitle(title) {
|
|
63
|
+
return typeof title === 'function' ? title() : title;
|
|
64
|
+
}
|
|
65
|
+
|
|
60
66
|
/** @param {Object<string, {}>} map */
|
|
61
67
|
static setRoutingMap(map) {
|
|
62
68
|
Object.assign(this.appMap, map);
|
|
@@ -232,8 +238,9 @@ export class AppRouter {
|
|
|
232
238
|
}
|
|
233
239
|
}
|
|
234
240
|
|
|
235
|
-
|
|
236
|
-
|
|
241
|
+
let resolvedTitle = this.#resolveTitle(routeScheme.title);
|
|
242
|
+
if (resolvedTitle) {
|
|
243
|
+
document.title = resolvedTitle;
|
|
237
244
|
}
|
|
238
245
|
|
|
239
246
|
this.#currentState = routeBase;
|
|
@@ -290,11 +297,11 @@ export class AppRouter {
|
|
|
290
297
|
}
|
|
291
298
|
}
|
|
292
299
|
|
|
293
|
-
let title = routeScheme.title || this.defaultTitle || '';
|
|
300
|
+
let title = this.#resolveTitle(routeScheme.title) || this.#resolveTitle(this.defaultTitle) || '';
|
|
294
301
|
try {
|
|
295
302
|
window.history.pushState(null, title, url);
|
|
296
303
|
} catch (err) {
|
|
297
|
-
|
|
304
|
+
warnMsg(14);
|
|
298
305
|
}
|
|
299
306
|
document.title = title;
|
|
300
307
|
}
|
|
@@ -354,7 +361,7 @@ export class AppRouter {
|
|
|
354
361
|
window.addEventListener(this.routingEventName, (/** @type {CustomEvent} */ e) => {
|
|
355
362
|
routingCtx.multiPub({
|
|
356
363
|
options: e.detail.options,
|
|
357
|
-
title: e.detail.options?.title || this.defaultTitle || '',
|
|
364
|
+
title: this.#resolveTitle(e.detail.options?.title) || this.#resolveTitle(this.defaultTitle) || '',
|
|
358
365
|
route: e.detail.route,
|
|
359
366
|
});
|
|
360
367
|
});
|
|
@@ -365,7 +372,7 @@ export class AppRouter {
|
|
|
365
372
|
routingCtx.multiPub({
|
|
366
373
|
route: this.defaultRoute,
|
|
367
374
|
options: {},
|
|
368
|
-
title: defaultDesc?.title || this.defaultTitle || '',
|
|
375
|
+
title: this.#resolveTitle(defaultDesc?.title) || this.#resolveTitle(this.defaultTitle) || '',
|
|
369
376
|
});
|
|
370
377
|
}
|
|
371
378
|
return routingCtx;
|
package/core/PubSub.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DICT } from './dictionary.js';
|
|
2
|
+
import { warnMsg } from './warn.js';
|
|
2
3
|
|
|
3
4
|
// structuredClone() is limited by supported types, so we use custom cloning:
|
|
4
5
|
function cloneObj(obj) {
|
|
@@ -73,8 +74,7 @@ export class PubSub {
|
|
|
73
74
|
* @param {*} prop
|
|
74
75
|
*/
|
|
75
76
|
static #warn(actionName, prop, ctx) {
|
|
76
|
-
|
|
77
|
-
console.warn(`[Symbiote] PubSub (${uid}): cannot ${actionName}. Property: "${prop}"`);
|
|
77
|
+
warnMsg(1, String(ctx?.uid || 'local'), actionName, prop);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
/**
|
|
@@ -270,11 +270,7 @@ export class PubSub {
|
|
|
270
270
|
return;
|
|
271
271
|
}
|
|
272
272
|
if (PubSub.devMode && !(this.store[prop] === null || val === null) && typeof this.store[prop] !== typeof val) {
|
|
273
|
-
|
|
274
|
-
console.warn(
|
|
275
|
-
`[Symbiote] PubSub (${uid}): type change for "${String(prop)}" [${typeof this.store[prop]} → ${typeof val}].\n`
|
|
276
|
-
+ `Previous: ${JSON.stringify(this.store[prop])}\nNew: ${JSON.stringify(val)}`
|
|
277
|
-
);
|
|
273
|
+
warnMsg(2, String(this.uid || 'local'), String(prop), typeof this.store[prop], typeof val, JSON.stringify(this.store[prop]), JSON.stringify(val));
|
|
278
274
|
}
|
|
279
275
|
this.store[prop] = val;
|
|
280
276
|
this.notify(prop, val);
|
|
@@ -375,7 +371,7 @@ export class PubSub {
|
|
|
375
371
|
/** @type {PubSub} */
|
|
376
372
|
let data = PubSub.globalStore.get(uid);
|
|
377
373
|
if (data) {
|
|
378
|
-
|
|
374
|
+
warnMsg(3, uid);
|
|
379
375
|
} else {
|
|
380
376
|
data = new PubSub(schema);
|
|
381
377
|
data.uid = uid;
|
|
@@ -404,10 +400,7 @@ export class PubSub {
|
|
|
404
400
|
* @returns {PubSub}
|
|
405
401
|
*/
|
|
406
402
|
static getCtx(uid, notify = true) {
|
|
407
|
-
return PubSub.globalStore.get(uid) || (notify &&
|
|
408
|
-
`[Symbiote] PubSub: context "${String(uid)}" not found.\n`
|
|
409
|
-
+ `Available contexts: [${[...PubSub.globalStore.keys()].map(String).join(', ')}]`
|
|
410
|
-
), null);
|
|
403
|
+
return PubSub.globalStore.get(uid) || (notify && warnMsg(4, String(uid), [...PubSub.globalStore.keys()].map(String).join(', ')), null);
|
|
411
404
|
}
|
|
412
405
|
}
|
|
413
406
|
|
package/core/Symbiote.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import PubSub from './PubSub.js';
|
|
2
|
+
import { warnMsg } from './warn.js';
|
|
2
3
|
import { DICT } from './dictionary.js';
|
|
3
4
|
import { animateOut } from './animateOut.js';
|
|
4
5
|
import { setNestedProp } from '../utils/setNestedProp.js';
|
|
@@ -94,7 +95,7 @@ export class Symbiote extends HTMLElement {
|
|
|
94
95
|
// @ts-expect-error
|
|
95
96
|
template = customTpl.content.cloneNode(true);
|
|
96
97
|
} else {
|
|
97
|
-
|
|
98
|
+
warnMsg(5, this.localName, customTplSelector);
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
}
|
|
@@ -279,7 +280,26 @@ export class Symbiote extends HTMLElement {
|
|
|
279
280
|
handler(val);
|
|
280
281
|
};
|
|
281
282
|
let parsed = Symbiote.#parseProp(/** @type {string} */ (prop), this);
|
|
282
|
-
if (!parsed)
|
|
283
|
+
if (!parsed) {
|
|
284
|
+
// Named context not found — defer subscription
|
|
285
|
+
let slashIdx = /** @type {string} */ (prop).indexOf('/');
|
|
286
|
+
if (slashIdx !== -1) {
|
|
287
|
+
let ctxName = /** @type {string} */ (prop).slice(0, slashIdx);
|
|
288
|
+
let propName = /** @type {string} */ (prop).slice(slashIdx + 1);
|
|
289
|
+
if (!PubSub.pendingDeps.has(ctxName)) {
|
|
290
|
+
PubSub.pendingDeps.set(ctxName, []);
|
|
291
|
+
}
|
|
292
|
+
PubSub.pendingDeps.get(ctxName).push(() => {
|
|
293
|
+
let ctx = PubSub.getCtx(ctxName, false);
|
|
294
|
+
if (!ctx) return;
|
|
295
|
+
let sub = ctx.sub(propName, subCb, init);
|
|
296
|
+
if (sub) {
|
|
297
|
+
this.allSubs.add(sub);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
283
303
|
if (!parsed.ctx.has(parsed.name)) {
|
|
284
304
|
// Avoid *prop binding race:
|
|
285
305
|
window.queueMicrotask(() => {
|
|
@@ -408,18 +428,13 @@ export class Symbiote extends HTMLElement {
|
|
|
408
428
|
let sharedVal = this.init$[prop];
|
|
409
429
|
if (!this.ctxName) {
|
|
410
430
|
if (Symbiote.devMode) {
|
|
411
|
-
|
|
412
|
-
`[Symbiote] "${this.localName}" uses *${sharedName} without ctx attribute or --ctx CSS variable. `
|
|
413
|
-
+ 'Set ctx="name" or --ctx to share state.'
|
|
414
|
-
);
|
|
431
|
+
warnMsg(6, this.localName, sharedName);
|
|
415
432
|
}
|
|
416
433
|
} else {
|
|
417
434
|
if (Symbiote.devMode && this.sharedCtx.has(sharedName)) {
|
|
418
435
|
let existing = this.sharedCtx.read(sharedName);
|
|
419
436
|
if (existing !== sharedVal && typeof sharedVal !== 'function') {
|
|
420
|
-
|
|
421
|
-
`[Symbiote] Shared prop "${sharedName}" already has value. Keeping existing.`
|
|
422
|
-
);
|
|
437
|
+
warnMsg(7, sharedName);
|
|
423
438
|
}
|
|
424
439
|
}
|
|
425
440
|
this.sharedCtx.add(sharedName, sharedVal);
|
|
@@ -558,10 +573,7 @@ export class Symbiote extends HTMLElement {
|
|
|
558
573
|
let registeredClass = window.customElements.get(tagName);
|
|
559
574
|
if (registeredClass) {
|
|
560
575
|
if (!isAlias && registeredClass !== this) {
|
|
561
|
-
|
|
562
|
-
`[Symbiote] <${tagName}> is already registered (class: ${registeredClass.name}).\n`
|
|
563
|
-
+ `Attempted re-registration with class "${this.name}" — skipped.`
|
|
564
|
-
);
|
|
576
|
+
warnMsg(8, tagName, registeredClass.name, this.name);
|
|
565
577
|
}
|
|
566
578
|
return this;
|
|
567
579
|
}
|
|
@@ -622,7 +634,7 @@ export class Symbiote extends HTMLElement {
|
|
|
622
634
|
try {
|
|
623
635
|
this.#cssDataCache[propName] = parseCssPropertyValue(val);
|
|
624
636
|
} catch (e) {
|
|
625
|
-
!silentCheck &&
|
|
637
|
+
!silentCheck && warnMsg(9, this.localName, propName);
|
|
626
638
|
this.#cssDataCache[propName] = null;
|
|
627
639
|
}
|
|
628
640
|
}
|
|
@@ -653,10 +665,7 @@ export class Symbiote extends HTMLElement {
|
|
|
653
665
|
*/
|
|
654
666
|
bindCssData(propName, initValue = '') {
|
|
655
667
|
if (Symbiote.#devMode && (this.ssrMode || this.isoMode)) {
|
|
656
|
-
|
|
657
|
-
`[Symbiote dev] <${this.localName}>: CSS data binding "${propName}" will not read computed styles during SSR. `
|
|
658
|
-
+ 'The init value will be used instead.'
|
|
659
|
-
);
|
|
668
|
+
warnMsg(10, this.localName, propName);
|
|
660
669
|
}
|
|
661
670
|
if (!this.#boundCssProps) {
|
|
662
671
|
this.#boundCssProps = new Set();
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { registerMessages } from './warn.js';
|
|
2
|
+
import Symbiote from './Symbiote.js';
|
|
3
|
+
|
|
4
|
+
Symbiote.devMode = true;
|
|
5
|
+
|
|
6
|
+
registerMessages(new Map([
|
|
7
|
+
// PubSub
|
|
8
|
+
[1, (uid, action, prop) =>
|
|
9
|
+
`[Symbiote] PubSub (${uid}): cannot ${action}. Property: "${prop}"`],
|
|
10
|
+
[2, (uid, prop, prevType, newType, prev, next) =>
|
|
11
|
+
`[Symbiote] PubSub (${uid}): type change for "${prop}" [${prevType} → ${newType}].\n`
|
|
12
|
+
+ `Previous: ${prev}\nNew: ${next}`],
|
|
13
|
+
[3, (uid) =>
|
|
14
|
+
`[Symbiote] PubSub: context "${uid}" is already registered. Returning existing instance.`],
|
|
15
|
+
[4, (uid, keys) =>
|
|
16
|
+
`[Symbiote] PubSub: context "${uid}" not found.\n`
|
|
17
|
+
+ `Available contexts: [${keys}]`],
|
|
18
|
+
|
|
19
|
+
// Symbiote
|
|
20
|
+
[5, (localName, selector) =>
|
|
21
|
+
`[Symbiote] <${localName}>: custom template "${selector}" not found.`],
|
|
22
|
+
[6, (localName, sharedName) =>
|
|
23
|
+
`[Symbiote] "${localName}" uses *${sharedName} without ctx attribute or --ctx CSS variable. `
|
|
24
|
+
+ 'Set ctx="name" or --ctx to share state.'],
|
|
25
|
+
[7, (sharedName) =>
|
|
26
|
+
`[Symbiote] Shared prop "${sharedName}" already has value. Keeping existing.`],
|
|
27
|
+
[8, (tagName, existingClass, newClass) =>
|
|
28
|
+
`[Symbiote] <${tagName}> is already registered (class: ${existingClass}).\n`
|
|
29
|
+
+ `Attempted re-registration with class "${newClass}" — skipped.`],
|
|
30
|
+
[9, (localName, propName) =>
|
|
31
|
+
`[Symbiote] <${localName}>: CSS data parse error for "${propName}". Check that the CSS custom property is defined.`],
|
|
32
|
+
[10, (localName, propName) =>
|
|
33
|
+
`[Symbiote dev] <${localName}>: CSS data binding "${propName}" will not read computed styles during SSR. `
|
|
34
|
+
+ 'The init value will be used instead.'],
|
|
35
|
+
|
|
36
|
+
// tpl-processors
|
|
37
|
+
[11, (localName, valKey, knownKeys) =>
|
|
38
|
+
`[Symbiote dev] <${localName}>: binding key "${valKey}" not found in init$ (auto-initialized to null).\n`
|
|
39
|
+
+ `Known keys: [${knownKeys}]`],
|
|
40
|
+
[12, (localName, prop) =>
|
|
41
|
+
`[Symbiote dev] <${localName}>: text-node binding "{{${prop}}}" has no hydration attribute. `
|
|
42
|
+
+ 'In ssrMode/isoMode it will be rendered by the server but won\'t update on the client. '
|
|
43
|
+
+ 'Use property binding (${{textContent: \'' + prop + '\'}}) for hydratable text.'],
|
|
44
|
+
|
|
45
|
+
// AppRouter
|
|
46
|
+
[13, (msg) =>
|
|
47
|
+
`[Symbiote > AppRouter] ${msg}`],
|
|
48
|
+
[14, () =>
|
|
49
|
+
'[Symbiote > AppRouter] History API is not available.'],
|
|
50
|
+
|
|
51
|
+
// html
|
|
52
|
+
[15, (val) =>
|
|
53
|
+
`[Symbiote > html] \`this\` used in template interpolation (value: ${val}).\n`
|
|
54
|
+
+ 'Templates are context-free — use ${{ prop: \'stateKey\' }} binding syntax instead.'],
|
|
55
|
+
|
|
56
|
+
// itemizeProcessor
|
|
57
|
+
[16, (localName, dataType, data) =>
|
|
58
|
+
`[Symbiote] <${localName}>: itemize data must be Array or Object, got ${dataType}: ${data}`],
|
|
59
|
+
]));
|
package/core/html.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DICT } from './dictionary.js';
|
|
2
|
+
import { errMsg } from './warn.js';
|
|
2
3
|
|
|
3
4
|
/** @type {String[]} */
|
|
4
5
|
export const RESERVED_ATTRIBUTES = [
|
|
@@ -24,10 +25,7 @@ export function html(parts, ...props) {
|
|
|
24
25
|
if (idx >= props.length) return;
|
|
25
26
|
let val = props[idx];
|
|
26
27
|
if (val === undefined || val === null) {
|
|
27
|
-
|
|
28
|
-
`[Symbiote > html] \`this\` used in template interpolation (value: ${val}).\n`
|
|
29
|
-
+ 'Templates are context-free — use ${{ prop: \'stateKey\' }} binding syntax instead.'
|
|
30
|
-
);
|
|
28
|
+
errMsg(15, val);
|
|
31
29
|
return;
|
|
32
30
|
}
|
|
33
31
|
if (val?.constructor === Object) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { animateOut } from './animateOut.js';
|
|
2
|
+
import { warnMsg } from './warn.js';
|
|
2
3
|
import { setupItemize } from './itemizeSetup.js';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -57,7 +58,7 @@ export function itemizeProcessor(fr, fnCtx) {
|
|
|
57
58
|
items.push(init);
|
|
58
59
|
}
|
|
59
60
|
} else {
|
|
60
|
-
|
|
61
|
+
warnMsg(16, fnCtx.localName, typeof data, data);
|
|
61
62
|
return;
|
|
62
63
|
}
|
|
63
64
|
|
package/core/itemizeProcessor.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { animateOut } from './animateOut.js';
|
|
2
|
+
import { warnMsg } from './warn.js';
|
|
2
3
|
import { setupItemize } from './itemizeSetup.js';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -57,7 +58,7 @@ export function itemizeProcessor(fr, fnCtx) {
|
|
|
57
58
|
}
|
|
58
59
|
fillItems(items);
|
|
59
60
|
} else {
|
|
60
|
-
|
|
61
|
+
warnMsg(16, fnCtx.localName, typeof data, data);
|
|
61
62
|
}
|
|
62
63
|
}, !clientSSR);
|
|
63
64
|
});
|
package/core/tpl-processors.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DICT } from './dictionary.js';
|
|
2
|
+
import { warnMsg } from './warn.js';
|
|
2
3
|
import { setNestedProp } from '../utils/setNestedProp.js';
|
|
3
4
|
import { ownElements, isOwnNode } from './ownElements.js';
|
|
4
5
|
import { initPropFallback } from './initPropFallback.js';
|
|
@@ -64,10 +65,7 @@ function domBindProcessor(fr, fnCtx) {
|
|
|
64
65
|
// Dev-only: warn about bindings that aren't in init$ (likely typos)
|
|
65
66
|
if (fnCtx.localCtx.read(valKey) === null && fnCtx.Symbiote?.devMode) {
|
|
66
67
|
let known = Object.keys(fnCtx.init$).filter((k) => !k.startsWith('+'));
|
|
67
|
-
|
|
68
|
-
`[Symbiote dev] <${fnCtx.localName}>: binding key "${valKey}" not found in init$ (auto-initialized to null).\n`
|
|
69
|
-
+ `Known keys: [${known.join(', ')}]`
|
|
70
|
-
);
|
|
68
|
+
warnMsg(11, fnCtx.localName, valKey, known.join(', '));
|
|
71
69
|
}
|
|
72
70
|
}
|
|
73
71
|
let initVal = fnCtx.$[valKey];
|
|
@@ -156,11 +154,7 @@ const txtNodesProcessor = function (fr, fnCtx) {
|
|
|
156
154
|
initPropFallback(fnCtx, prop);
|
|
157
155
|
}
|
|
158
156
|
if (fnCtx.Symbiote?.devMode && (fnCtx.ssrMode || fnCtx.isoMode)) {
|
|
159
|
-
|
|
160
|
-
`[Symbiote dev] <${fnCtx.localName}>: text-node binding "{{${prop}}}" has no hydration attribute. `
|
|
161
|
-
+ 'In ssrMode/isoMode it will be rendered by the server but won\'t update on the client. '
|
|
162
|
-
+ 'Use property binding (${{textContent: \'' + prop + '\'}}) for hydratable text.'
|
|
163
|
-
);
|
|
157
|
+
warnMsg(12, fnCtx.localName, prop);
|
|
164
158
|
}
|
|
165
159
|
fnCtx.sub(prop, (val) => {
|
|
166
160
|
tNode.textContent = val;
|
package/core/warn.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** @type {Map<number, (...args: any[]) => string>} */
|
|
2
|
+
let messages = globalThis.__SYMBIOTE_DEV_MESSAGES || (globalThis.__SYMBIOTE_DEV_MESSAGES = new Map());
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @param {number} code
|
|
6
|
+
* @param {...any} args
|
|
7
|
+
*/
|
|
8
|
+
export function warnMsg(code, ...args) {
|
|
9
|
+
let fmt = messages.get(code);
|
|
10
|
+
console.warn(fmt ? fmt(...args) : `[Symbiote W${code}]`);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {number} code
|
|
15
|
+
* @param {...any} args
|
|
16
|
+
*/
|
|
17
|
+
export function errMsg(code, ...args) {
|
|
18
|
+
let fmt = messages.get(code);
|
|
19
|
+
console.error(fmt ? fmt(...args) : `[Symbiote E${code}]`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** @param {Map<number, (...args: any[]) => string>} map */
|
|
23
|
+
export function registerMessages(map) {
|
|
24
|
+
for (let [code, fmt] of map) {
|
|
25
|
+
messages.set(code, fmt);
|
|
26
|
+
}
|
|
27
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@symbiotejs/symbiote",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.5.0",
|
|
5
5
|
"description": "Symbiote.js - zero-dependency close-to-platform frontend library to build super-powered web components",
|
|
6
6
|
"author": "team@rnd-pro.com",
|
|
7
7
|
"license": "MIT",
|
|
@@ -63,6 +63,10 @@
|
|
|
63
63
|
"types": "./types/core/css.d.ts",
|
|
64
64
|
"default": "./core/css.js"
|
|
65
65
|
},
|
|
66
|
+
"./core/devMessages.js": {
|
|
67
|
+
"types": "./types/core/devMessages.d.ts",
|
|
68
|
+
"default": "./core/devMessages.js"
|
|
69
|
+
},
|
|
66
70
|
"./core/dictionary.js": {
|
|
67
71
|
"types": "./types/core/dictionary.d.ts",
|
|
68
72
|
"default": "./core/dictionary.js"
|
|
@@ -103,6 +107,10 @@
|
|
|
103
107
|
"types": "./types/core/tpl-processors.d.ts",
|
|
104
108
|
"default": "./core/tpl-processors.js"
|
|
105
109
|
},
|
|
110
|
+
"./core/warn.js": {
|
|
111
|
+
"types": "./types/core/warn.d.ts",
|
|
112
|
+
"default": "./core/warn.js"
|
|
113
|
+
},
|
|
106
114
|
"./utils/UID.js": {
|
|
107
115
|
"types": "./types/utils/UID.d.ts",
|
|
108
116
|
"default": "./utils/UID.js"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export class AppRouter {
|
|
2
2
|
static appMap: {
|
|
3
3
|
[x: string]: {
|
|
4
|
-
title?: string;
|
|
4
|
+
title?: string | (() => string);
|
|
5
5
|
default?: boolean;
|
|
6
6
|
error?: boolean;
|
|
7
7
|
pattern?: string;
|
|
@@ -9,7 +9,7 @@ export class AppRouter {
|
|
|
9
9
|
__loaded?: boolean;
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
|
-
static setDefaultTitle(title: string): void;
|
|
12
|
+
static setDefaultTitle(title: string | (() => string)): void;
|
|
13
13
|
static setRoutingMap(map: {
|
|
14
14
|
[x: string]: {};
|
|
15
15
|
}): void;
|
|
@@ -41,7 +41,7 @@ export class AppRouter {
|
|
|
41
41
|
static get separator(): string;
|
|
42
42
|
static initRoutingCtx(ctxName: string, routingMap: {
|
|
43
43
|
[x: string]: {
|
|
44
|
-
title?: string;
|
|
44
|
+
title?: string | (() => string);
|
|
45
45
|
default?: boolean;
|
|
46
46
|
error?: boolean;
|
|
47
47
|
pattern?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppRouter.d.ts","sourceRoot":"","sources":["../../core/AppRouter.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppRouter.d.ts","sourceRoot":"","sources":["../../core/AppRouter.js"],"names":[],"mappings":"AAGA;IA4BE,iCADW,MAAM,IAAI,CACF;IAEnB,uCAAkB;IAElB,8CAAyB;IAEzB;;oBA9Ba,SAAS,CAAC,YAAY,CAAC;;;;mBAIxB,MAAM,OAAO,CAAC,GAAC,CAAC;;;MA0BQ;IAEpC,6BADW;;;;;aAZA;;;;;QAAa,IAAI,KACf,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAWhD,CACH;IAEpB,mCADW;;;;;QAAa,IAAI,CACA;IAE5B,kCADW,OAAO,CACU;IAE5B,uCADW,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAClC;IAE9B,8CAEC;IAED,2CAEC;IAGD,8BADY,SAAS,CAAC,YAAY,CAAC,QAGlC;IAGD,yCADY,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,UAG9C;IAGD;;aAgBC;IAMD,6CAuBC;IAGD,0CAGC;IAGD,sCAEC;IAED;;;MAKC;IAED;;;MAiBC;IAED;;;MAwBC;IAMD;;;;;QAFa,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAS5C;IAED,+BAuEC;IAMD;;aAwCC;IAMD;;aAGC;IAQD;;;;;aAzSW;;;;;QAAa,IAAI,KACf,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAsS1D,MAAM,IAAI,CAUtB;IAGD,wCAGC;IAGD,+BAEC;IAOD;;oBAtVa,SAAS,CAAC,YAAY,CAAC;;;;mBAIxB,MAAM,OAAO,CAAC,GAAC,CAAC;;;oBA+W3B;IAED,kDAQC;IAED,sCAIC;CACF;;mBA3YkB,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PubSub.d.ts","sourceRoot":"","sources":["../../core/PubSub.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PubSub.d.ts","sourceRoot":"","sources":["../../core/PubSub.js"],"names":[],"mappings":"AAiBA,oBADwC,CAAC,SAA1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAE;IA2DrC,oDAFW,GAAC,kBAIX;IAoSD,mBALuC,CAAC,SAA1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAE,UAC3B,CAAC,QACD,SAAS,MAAM,GACb,MAAM,CAAC,CAAC,CAAC,CAsBrB;IAGD,sBADY,SAAS,MAAM,QAG1B;IAOD,mBAJW,SAAS,MAAM,iCAMzB;IAxVD,oBADY,CAAC,EAWZ;IARG,WAA6B;IAO/B,aADW,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAChB;IAqIxC,WADY,MAAM,CAAC,OAqClB;IAzBK,sBAAuB;IA4B7B,uBAEC;IAOD,uBAHW,OAAO,2BASjB;IAMD,UAHW,MAAM,CAAC,OACP,OAAO,QAiBjB;IAGD,aADc,CAAC,CAed;IAGD,iBADY,CAAC,QAKZ;IAGD,aADY,MAAM,CAAC,kBAoBlB;IAOD,UAJW,MAAM,CAAC,YACP,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI;;wBAAhB,OAAO,KAAK,IAAI;MAwBhC;IAKD,aAFW,SAAS,MAAM,EAIzB;IAED,WANW,SAAS,MAAM,CAQzB;;CA2CF;;qBAEU,GAAG,CAAC,SAAS,MAAM,cAAS;qBAG5B,GAAG,CAAC,SAAS,MAAM,EAAE,KAAK,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Symbiote.d.ts","sourceRoot":"","sources":["../../core/Symbiote.js"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"Symbiote.d.ts","sourceRoot":"","sources":["../../core/Symbiote.js"],"names":[],"mappings":";;AAoBA,sBADc,CAAC;IAuBb,cADW,mBAAmB,CACjB;IAGb,sCAAwB;IAExB,iCAGC;IAED,8BAEC;IAkBD,wBAAgB;IA0JhB,+BAJwB,CAAC,SAAZ,aAAU,uBAEZ,CAAC;;;MA0CX;IAuQD,qCAA+B;IAoC/B,iDAFa,OAAO,QAAQ,CAkB3B;IAED,wBAKC;IAGD;;aAOC;IAmHD,6BADY,SAAS,aAAa,QAOjC;IAGD,+BADY,SAAS,aAAa,QAOjC;IAGD,8BADY,SAAS,aAAa,EAIjC;IAGD,gCADY,SAAS,aAAa,EAIjC;IApkBD,cA6BC;IArID,gCAEC;IAED,qBAAiB;IACjB,uBAAmB;IAiBnB,kBAHW,SAAS,gBAAgB,0BAmFnC;IApDG,aAAiD;IAyDnD,OADW,CAAC,CACoB;IAEhC;;MAAmC;IAEnC,oBADW,GAAG,CAAC,CAAC,EAAE,EAAE,gBAAgB,gBAAW,EAAE,KAAK,eAAU,KAAK,IAAI,CAAC,CACvC;IAEnC;;MAA8B;IAC9B,kBAAwB;IAExB,qBAAwB;IAExB,sBAAyB;IAEzB,wBAA0B;IAE1B,0BAA6B;IAI7B,iBAAoB;IAEpB,6BAAgC;IAEhC,mBAAsB;IAEtB,4BAA8B;IAIhC,yBAEC;IAGD,sBASC;IAGD,4BAKC;IAGD,6BAEC;IAuDD,IALuB,CAAC,SAAX,MAAO,CAAE,QACX,CAAC,WACD,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,wBAuC/B;IAGD,2BAIC;IAGD,uBAIC;IAQD,IALuB,CAAC,SAAX,MAAO,CAAE,qBAEX,CAAC,CAAC,CAAC,CAAC,2BAOd;IAMD,UAHW,OAAO,CAAC,CAAC,CAAC,2BAOpB;IAGD,SADc,CAAC,CA6Bd;IAMD,YAHW,OAAO,CAAC,CAAC,CAAC,mCAcpB;IAED,8BAgBC;IAdG,4CASE;IAmFF,0BAAwC;IAwB1C,uBAAyB;IAG3B,0BAEC;IAED,wBAAoB;IAUpB,yBAAuB;IACvB,6BA0BC;IA0CD,oEAeC;IAMD,yDAoBC;IAYD,0BAME;IAMF,0CAFW,GAAG,QAgBb;IAED,yBAGC;IAOD,8EAmBC;;CA+BF;;mBAruBkB,aAAa;qBAEX,iBAAiB;2BACX,iBAAiB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devMessages.d.ts","sourceRoot":"","sources":["../../core/devMessages.js"],"names":[],"mappings":""}
|
package/types/core/html.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../core/html.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../core/html.js"],"names":[],"mappings":"AAoBA,qBALa,CAAC,SACH,oBAAoB,YACpB,CAAC;QAAO,MAAM;CAAS,GAAG,cAAc,YAAY,CAAC,CAAC,EAAE,UA6BlE;AA1CD,kCADW,QAAQ,CAOjB;;6BAEY,MAAM,CAAC,MAAM,qCAAgC,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"itemizeProcessor-keyed.d.ts","sourceRoot":"","sources":["../../core/itemizeProcessor-keyed.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"itemizeProcessor-keyed.d.ts","sourceRoot":"","sources":["../../core/itemizeProcessor-keyed.js"],"names":[],"mappings":"AA+BA,iCAJgD,CAAC,SAApC,qCAAkC,MACpC,gBAAgB,SAChB,CAAC,QAkLX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"itemizeProcessor.d.ts","sourceRoot":"","sources":["../../core/itemizeProcessor.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"itemizeProcessor.d.ts","sourceRoot":"","sources":["../../core/itemizeProcessor.js"],"names":[],"mappings":"AASA,iCAJgD,CAAC,SAApC,qCAAkC,MACpC,gBAAgB,SAChB,CAAC,QAyDX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tpl-processors.d.ts","sourceRoot":"","sources":["../../core/tpl-processors.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"tpl-processors.d.ts","sourceRoot":"","sources":["../../core/tpl-processors.js"],"names":[],"mappings":";0BA2HgD,CAAC,SAApC,qCAAkC,MACpC,gBAAgB,SAChB,CAAC;;iCAzHqB,uBAAuB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warn.d.ts","sourceRoot":"","sources":["../../core/warn.js"],"names":[],"mappings":"AAOA,8BAHW,MAAM,WACF,GAAG,EAAA,QAKjB;AAMD,6BAHW,MAAM,WACF,GAAG,EAAA,QAKjB;AAGD,sCADY,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,QAKlD"}
|