@symbiotejs/symbiote 3.1.2 → 3.2.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 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.1.0**. Zero dependencies. ~6 KB gzip.
4
+ > Current version: **3.2.0**. Zero dependencies. ~6 KB gzip.
5
5
 
6
6
  ---
7
7
 
@@ -22,8 +22,11 @@ import { html } from '@symbiotejs/symbiote/core/html.js';
22
22
  import { css } from '@symbiotejs/symbiote/core/css.js';
23
23
  ```
24
24
 
25
- ### Full export list (index.js)
26
- `Symbiote` (default), `html`, `css`, `PubSub`, `AppRouter`, `DICT`, `UID`, `setNestedProp`, `applyStyles`, `applyAttributes`, `create`, `kebabToCamel`, `reassignDictionary`
25
+ ### Core exports (index.js)
26
+ `Symbiote` (default), `html`, `css`, `PubSub`, `DICT`, `animateOut`
27
+
28
+ ### Utils exports (`@symbiotejs/symbiote/utils`)
29
+ `UID`, `setNestedProp`, `applyStyles`, `applyAttributes`, `create`, `kebabToCamel`, `reassignDictionary`
27
30
 
28
31
  ---
29
32
 
@@ -734,13 +737,13 @@ const tag = MyComponent.is; // 'my-component'
734
737
  ## Utilities
735
738
 
736
739
  ```js
737
- import { UID } from '@symbiotejs/symbiote';
740
+ import { UID } from '@symbiotejs/symbiote/utils';
738
741
  UID.generate('XXXXX-XXX'); // e.g. 'aB3kD-z9Q'
739
742
 
740
- import { create, applyStyles, applyAttributes } from '@symbiotejs/symbiote';
743
+ import { create, applyStyles, applyAttributes } from '@symbiotejs/symbiote/utils';
741
744
  let el = create({ tag: 'div', attributes: { id: 'x' }, styles: { color: 'red' }, children: [...] });
742
745
 
743
- import { reassignDictionary } from '@symbiotejs/symbiote';
746
+ import { reassignDictionary } from '@symbiotejs/symbiote/utils';
744
747
  reassignDictionary({ BIND_ATTR: 'data-bind' }); // customize internal attribute names
745
748
  ```
746
749
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.2.0
4
+
5
+ ### Added
6
+
7
+ - **Itemize class property fallback.**
8
+ The `itemize` data source property now supports class property fallback, consistent with `domBindProcessor` and `txtNodesProcessor`.
9
+
10
+ ### Changed
11
+
12
+ - **Utils moved to separate entry point.**
13
+ `UID`, `setNestedProp`, `applyStyles`, `applyAttributes`, `create`, `kebabToCamel`, `reassignDictionary` are no longer exported from the main `@symbiotejs/symbiote` entry point. Import from `@symbiotejs/symbiote/utils` instead:
14
+ ```js
15
+ import { UID, create } from '@symbiotejs/symbiote/utils';
16
+ ```
17
+ Individual deep imports (`@symbiotejs/symbiote/utils/UID.js`, etc.) continue to work.
18
+
19
+ - **`initPropFallback` extracted to shared module.**
20
+ Duplicated fallback initialization logic across template processors consolidated into `core/initPropFallback.js`.
21
+
3
22
  ## 3.1.0
4
23
 
5
24
  ### Changed
package/core/Symbiote.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import PubSub from './PubSub.js';
2
2
  import { DICT } from './dictionary.js';
3
3
  import { animateOut } from './animateOut.js';
4
- import { UID } from '../utils/UID.js';
5
4
  import { setNestedProp } from '../utils/setNestedProp.js';
6
5
  import { prepareStyleSheet } from '../utils/prepareStyleSheet.js';
7
6
 
@@ -10,7 +9,7 @@ import { parseCssPropertyValue } from '../utils/parseCssPropertyValue.js';
10
9
 
11
10
  export { html } from './html.js';
12
11
  export { css } from './css.js';
13
- export { UID, PubSub, DICT }
12
+ export { PubSub, DICT }
14
13
 
15
14
  let autoTagsCount = 0;
16
15
 
package/core/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import Symbiote from './Symbiote.js';
2
2
 
3
- // Core modules:
4
3
  export { Symbiote };
5
4
  export { html } from './html.js';
6
5
  export { css } from './css.js';
@@ -8,13 +7,4 @@ export { PubSub } from './PubSub.js';
8
7
  export { DICT } from './dictionary.js';
9
8
  export { animateOut } from './animateOut.js';
10
9
 
11
- // Utils:
12
- export { UID } from '../utils/UID.js';
13
- export { setNestedProp } from '../utils/setNestedProp.js';
14
- export { applyStyles } from '../utils/dom-helpers.js';
15
- export { applyAttributes } from '../utils/dom-helpers.js';
16
- export { create } from '../utils/dom-helpers.js';
17
- export { kebabToCamel } from '../utils/kebabToCamel.js';
18
- export { reassignDictionary } from '../utils/reassignDictionary.js';
19
-
20
10
  export default Symbiote;
@@ -0,0 +1,21 @@
1
+ import { DICT } from './dictionary.js';
2
+
3
+ /**
4
+ * Initialize a state property from a class property fallback when it's not
5
+ * already registered in the component's PubSub context.
6
+ * Shared across domBindProcessor, txtNodesProcessor, and itemizeProcessor.
7
+ * @param {import('./Symbiote.js').Symbiote} fnCtx
8
+ * @param {string} key
9
+ */
10
+ export function initPropFallback(fnCtx, key) {
11
+ if (key.startsWith(DICT.ATTR_BIND_PX)) {
12
+ fnCtx.add(key, fnCtx.getAttribute(key.replace(DICT.ATTR_BIND_PX, '')));
13
+ } else if (Object.hasOwn(fnCtx, key) && fnCtx[key] !== undefined) {
14
+ let ownVal = fnCtx[key];
15
+ fnCtx.add(key, typeof ownVal === 'function' ? ownVal.bind(fnCtx) : ownVal);
16
+ } else if (typeof fnCtx[key] === 'function') {
17
+ fnCtx.add(key, fnCtx[key].bind(fnCtx));
18
+ } else {
19
+ fnCtx.add(key, null);
20
+ }
21
+ }
@@ -1,6 +1,7 @@
1
1
  import { DICT } from './dictionary.js';
2
2
  import { animateOut } from './animateOut.js';
3
3
  import { ownElements } from './ownElements.js';
4
+ import { initPropFallback } from './initPropFallback.js';
4
5
 
5
6
  /**
6
7
  * @template {import('./Symbiote.js').Symbiote} T
@@ -33,9 +34,7 @@ export function itemizeProcessor(fr, fnCtx) {
33
34
  }
34
35
  let repeatDataKey = el.getAttribute(DICT.LIST_ATTR);
35
36
  if (!fnCtx.has(repeatDataKey) && fnCtx.allowTemplateInits) {
36
- if (Object.hasOwn(fnCtx, repeatDataKey) && fnCtx[repeatDataKey] !== undefined) {
37
- fnCtx.add(repeatDataKey, fnCtx[repeatDataKey]);
38
- }
37
+ initPropFallback(fnCtx, repeatDataKey);
39
38
  }
40
39
  fnCtx.sub(repeatDataKey, (data) => {
41
40
  if (!data) {
@@ -1,10 +1,12 @@
1
1
  import { DICT } from './dictionary.js';
2
2
  import { setNestedProp } from '../utils/setNestedProp.js';
3
3
  import { ownElements, isOwnNode } from './ownElements.js';
4
+ import { initPropFallback } from './initPropFallback.js';
4
5
 
5
6
  // Should go first among other processors:
6
7
  import { itemizeProcessor } from './itemizeProcessor.js';
7
8
 
9
+ export { initPropFallback };
8
10
 
9
11
 
10
12
  /**
@@ -58,23 +60,14 @@ function domBindProcessor(fr, fnCtx) {
58
60
  valKey = valKey.replace('!', '');
59
61
  }
60
62
  if (!fnCtx.has(valKey) && fnCtx.allowTemplateInits) {
61
- if (valKey.startsWith(DICT.ATTR_BIND_PX)) {
62
- fnCtx.add(valKey, fnCtx.getAttribute(valKey.replace(DICT.ATTR_BIND_PX, '')));
63
- } else if (Object.hasOwn(fnCtx, valKey) && fnCtx[valKey] !== undefined) {
64
- let ownVal = fnCtx[valKey];
65
- fnCtx.add(valKey, typeof ownVal === 'function' ? ownVal.bind(fnCtx) : ownVal);
66
- } else if (typeof fnCtx[valKey] === 'function') {
67
- fnCtx.add(valKey, fnCtx[valKey].bind(fnCtx));
68
- } else {
69
- fnCtx.add(valKey, null);
70
- // Dev-only: warn about bindings that aren't in init$ (likely typos)
71
- if (fnCtx.Symbiote?.devMode) {
72
- let known = Object.keys(fnCtx.init$).filter((k) => !k.startsWith('+'));
73
- console.warn(
74
- `[Symbiote dev] <${fnCtx.localName}>: binding key "${valKey}" not found in init$ (auto-initialized to null).\n`
75
- + `Known keys: [${known.join(', ')}]`
76
- );
77
- }
63
+ initPropFallback(fnCtx, valKey);
64
+ // Dev-only: warn about bindings that aren't in init$ (likely typos)
65
+ if (fnCtx.localCtx.read(valKey) === null && fnCtx.Symbiote?.devMode) {
66
+ let known = Object.keys(fnCtx.init$).filter((k) => !k.startsWith('+'));
67
+ console.warn(
68
+ `[Symbiote dev] <${fnCtx.localName}>: binding key "${valKey}" not found in init$ (auto-initialized to null).\n`
69
+ + `Known keys: [${known.join(', ')}]`
70
+ );
78
71
  }
79
72
  }
80
73
  fnCtx.sub(valKey, (val) => {
@@ -157,17 +150,7 @@ const txtNodesProcessor = function (fr, fnCtx) {
157
150
  let prop = tNode.textContent.replace(DICT.TEXT_NODE_OPEN_TOKEN, '').replace(DICT.TEXT_NODE_CLOSE_TOKEN, '');
158
151
  tNode.textContent = '';
159
152
  if (!fnCtx.has(prop) && fnCtx.allowTemplateInits) {
160
- if (prop.startsWith(DICT.ATTR_BIND_PX)) {
161
- fnCtx.add(prop, fnCtx.getAttribute(prop.replace(DICT.ATTR_BIND_PX, '')));
162
- fnCtx.initAttributeObserver();
163
- } else if (Object.hasOwn(fnCtx, prop) && fnCtx[prop] !== undefined) {
164
- let ownVal = fnCtx[prop];
165
- fnCtx.add(prop, typeof ownVal === 'function' ? ownVal.bind(fnCtx) : ownVal);
166
- } else if (typeof fnCtx[prop] === 'function') {
167
- fnCtx.add(prop, fnCtx[prop].bind(fnCtx));
168
- } else {
169
- fnCtx.add(prop, null);
170
- }
153
+ initPropFallback(fnCtx, prop);
171
154
  }
172
155
  fnCtx.sub(prop, (val) => {
173
156
  tNode.textContent = val;
@@ -177,3 +160,4 @@ const txtNodesProcessor = function (fr, fnCtx) {
177
160
  };
178
161
 
179
162
  export default [itemizeProcessor, refProcessor, domBindProcessor, txtNodesProcessor];
163
+
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@symbiotejs/symbiote",
4
- "version": "3.1.2",
4
+ "version": "3.2.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",
@@ -33,6 +33,9 @@
33
33
  "types": "./types/core/index.d.ts",
34
34
  "default": "./core/index.js"
35
35
  },
36
+ "./utils": {
37
+ "default": "./utils/index.js"
38
+ },
36
39
  "./core/AppRouter.js": {
37
40
  "types": "./types/core/AppRouter.d.ts",
38
41
  "default": "./core/AppRouter.js"
@@ -61,6 +64,10 @@
61
64
  "types": "./types/core/html.d.ts",
62
65
  "default": "./core/html.js"
63
66
  },
67
+ "./core/initPropFallback.js": {
68
+ "types": "./types/core/initPropFallback.d.ts",
69
+ "default": "./core/initPropFallback.js"
70
+ },
64
71
  "./core/itemizeProcessor-keyed.js": {
65
72
  "types": "./types/core/itemizeProcessor-keyed.d.ts",
66
73
  "default": "./core/itemizeProcessor-keyed.js"
@@ -26,12 +26,15 @@ async function run() {
26
26
  types: './types/core/index.d.ts',
27
27
  default: './core/index.js',
28
28
  },
29
+ './utils': {
30
+ default: './utils/index.js',
31
+ },
29
32
  };
30
33
 
31
34
  for (let dir of DIRS) {
32
35
  let modules = await getModules(dir);
33
36
  for (let mod of modules) {
34
- if (mod === './core/index.js') continue;
37
+ if (mod === './core/index.js' || mod === './utils/index.js') continue;
35
38
  let dtsPath = `./types/${dir}/${basename(mod, '.js')}.d.ts`;
36
39
  if (!existsSync(join(ROOT, dtsPath))) continue;
37
40
  exports[mod] = {
@@ -65,9 +65,8 @@ export class Symbiote<S> extends HTMLElement {
65
65
  #private;
66
66
  }
67
67
  export default Symbiote;
68
- import { UID } from '../utils/UID.js';
69
68
  import PubSub from './PubSub.js';
70
69
  import { DICT } from './dictionary.js';
71
70
  import { animateOut } from './animateOut.js';
72
- export { UID, PubSub, DICT };
71
+ export { PubSub, DICT };
73
72
  //# sourceMappingURL=Symbiote.d.ts.map
@@ -1 +1 @@
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;IA8IhB,+BAJwB,CAAC,SAAZ,aAAU,uBAEZ,CAAC;;;MAuCX;IA+OD,qCAA+B;IAoC/B,iDAFa,OAAO,QAAQ,CAqB3B;IAED,wBAKC;IAGD;;aAOC;IA6GD,6BADY,SAAS,aAAa,QAOjC;IAGD,+BADY,SAAS,aAAa,QAOjC;IAGD,8BADY,SAAS,aAAa,EAIjC;IAGD,gCADY,SAAS,aAAa,EAIjC;IApiBD,cA2BC;IAzHD,gCAEC;IAED,qBAAiB;IACjB,uBAAmB;IAiBnB,kBAHW,SAAS,gBAAgB,0BAyEnC;IAKC,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;IAE7B,iBAAoB;IAEpB,6BAAgC;IAEhC,mBAAsB;IAEtB,4BAA8B;IAIhC,yBAEC;IAGD,sBASC;IAGD,4BAKC;IAGD,6BAEC;IAoDD,IALuB,CAAC,SAAX,MAAO,CAAE,QACX,CAAC,WACD,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,wBAmB/B;IAGD,2BAGC;IAGD,uBAGC;IAQD,IALuB,CAAC,SAAX,MAAO,CAAE,qBAEX,CAAC,CAAC,CAAC,CAAC,2BAMd;IAMD,UAHW,OAAO,CAAC,CAAC,CAAC,2BAOpB;IAGD,SADc,CAAC,CA2Bd;IAMD,YAHW,OAAO,CAAC,CAAC,CAAC,mCAcpB;IAED,8BAgBC;IAdG,4CASE;IAwFF,0BAAwC;IAoB1C,uBAAyB;IAG3B,0BAEC;IAED,wBAAoB;IAUpB,yBAAuB;IACvB,6BA0BC;IA6CD,oEAeC;IAMD,yDAiBC;IAYD,0BAME;IAMF,0CAFW,GAAG,QAab;IAED,yBAGC;IAOD,8EAmBC;;CA+BF;;oBAxrBmB,iBAAiB;mBAHlB,aAAa;qBACX,iBAAiB;2BACX,iBAAiB"}
1
+ {"version":3,"file":"Symbiote.d.ts","sourceRoot":"","sources":["../../core/Symbiote.js"],"names":[],"mappings":";;AAmBA,sBADc,CAAC;IAuBb,cADW,mBAAmB,CACjB;IAGb,sCAAwB;IAExB,iCAGC;IAED,8BAEC;IAkBD,wBAAgB;IA8IhB,+BAJwB,CAAC,SAAZ,aAAU,uBAEZ,CAAC;;;MAuCX;IA+OD,qCAA+B;IAoC/B,iDAFa,OAAO,QAAQ,CAqB3B;IAED,wBAKC;IAGD;;aAOC;IA6GD,6BADY,SAAS,aAAa,QAOjC;IAGD,+BADY,SAAS,aAAa,QAOjC;IAGD,8BADY,SAAS,aAAa,EAIjC;IAGD,gCADY,SAAS,aAAa,EAIjC;IApiBD,cA2BC;IAzHD,gCAEC;IAED,qBAAiB;IACjB,uBAAmB;IAiBnB,kBAHW,SAAS,gBAAgB,0BAyEnC;IAKC,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;IAE7B,iBAAoB;IAEpB,6BAAgC;IAEhC,mBAAsB;IAEtB,4BAA8B;IAIhC,yBAEC;IAGD,sBASC;IAGD,4BAKC;IAGD,6BAEC;IAoDD,IALuB,CAAC,SAAX,MAAO,CAAE,QACX,CAAC,WACD,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,wBAmB/B;IAGD,2BAGC;IAGD,uBAGC;IAQD,IALuB,CAAC,SAAX,MAAO,CAAE,qBAEX,CAAC,CAAC,CAAC,CAAC,2BAMd;IAMD,UAHW,OAAO,CAAC,CAAC,CAAC,2BAOpB;IAGD,SADc,CAAC,CA2Bd;IAMD,YAHW,OAAO,CAAC,CAAC,CAAC,mCAcpB;IAED,8BAgBC;IAdG,4CASE;IAwFF,0BAAwC;IAoB1C,uBAAyB;IAG3B,0BAEC;IAED,wBAAoB;IAUpB,yBAAuB;IACvB,6BA0BC;IA6CD,oEAeC;IAMD,yDAiBC;IAYD,0BAME;IAMF,0CAFW,GAAG,QAab;IAED,yBAGC;IAOD,8EAmBC;;CA+BF;;mBA1rBkB,aAAa;qBACX,iBAAiB;2BACX,iBAAiB"}
@@ -4,11 +4,6 @@ export { css } from "./css.js";
4
4
  export { PubSub } from "./PubSub.js";
5
5
  export { DICT } from "./dictionary.js";
6
6
  export { animateOut } from "./animateOut.js";
7
- export { UID } from "../utils/UID.js";
8
- export { setNestedProp } from "../utils/setNestedProp.js";
9
- export { kebabToCamel } from "../utils/kebabToCamel.js";
10
- export { reassignDictionary } from "../utils/reassignDictionary.js";
11
7
  export default Symbiote;
12
8
  import Symbiote from './Symbiote.js';
13
- export { applyStyles, applyAttributes, create } from "../utils/dom-helpers.js";
14
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../core/index.js"],"names":[],"mappings":";;;;;;;;;;;qBAAqB,eAAe"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../core/index.js"],"names":[],"mappings":";;;;;;;qBAAqB,eAAe"}
@@ -0,0 +1,2 @@
1
+ export function initPropFallback(fnCtx: import("./Symbiote.js").Symbiote<any>, key: string): void;
2
+ //# sourceMappingURL=initPropFallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initPropFallback.d.ts","sourceRoot":"","sources":["../../core/initPropFallback.js"],"names":[],"mappings":"AASA,oFAFW,MAAM,QAahB"}
@@ -1 +1 @@
1
- {"version":3,"file":"itemizeProcessor.d.ts","sourceRoot":"","sources":["../../core/itemizeProcessor.js"],"names":[],"mappings":"AASA,iCAJgD,CAAC,SAApC,qCAAkC,MACpC,gBAAgB,SAChB,CAAC,QAyFX"}
1
+ {"version":3,"file":"itemizeProcessor.d.ts","sourceRoot":"","sources":["../../core/itemizeProcessor.js"],"names":[],"mappings":"AAUA,iCAJgD,CAAC,SAApC,qCAAkC,MACpC,gBAAgB,SAChB,CAAC,QAuFX"}
@@ -1,3 +1,5 @@
1
+ export { initPropFallback };
1
2
  declare const _default: (<T extends import("./Symbiote.js").Symbiote<any>>(fr: DocumentFragment, fnCtx: T) => void)[];
2
3
  export default _default;
4
+ import { initPropFallback } from './initPropFallback.js';
3
5
  //# sourceMappingURL=tpl-processors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tpl-processors.d.ts","sourceRoot":"","sources":["../../core/tpl-processors.js"],"names":[],"mappings":"0BAiIgD,CAAC,SAApC,qCAAkC,MACpC,gBAAgB,SAChB,CAAC"}
1
+ {"version":3,"file":"tpl-processors.d.ts","sourceRoot":"","sources":["../../core/tpl-processors.js"],"names":[],"mappings":";0BA0HgD,CAAC,SAApC,qCAAkC,MACpC,gBAAgB,SAChB,CAAC;;iCAzHqB,uBAAuB"}
@@ -0,0 +1,6 @@
1
+ export { UID } from "./UID.js";
2
+ export { setNestedProp } from "./setNestedProp.js";
3
+ export { kebabToCamel } from "./kebabToCamel.js";
4
+ export { reassignDictionary } from "./reassignDictionary.js";
5
+ export { applyStyles, applyAttributes, create } from "./dom-helpers.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../utils/index.js"],"names":[],"mappings":""}
package/utils/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { UID } from './UID.js';
2
+ export { setNestedProp } from './setNestedProp.js';
3
+ export { applyStyles, applyAttributes, create } from './dom-helpers.js';
4
+ export { kebabToCamel } from './kebabToCamel.js';
5
+ export { reassignDictionary } from './reassignDictionary.js';