@domql/element 3.7.5 → 3.8.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 CHANGED
@@ -55,6 +55,20 @@ variables, on, component, context
55
55
 
56
56
  Plus mixin handlers: `attr`, `style`, `text`, `html`, `data`, `classlist`, `state`, `scope`, `deps`.
57
57
 
58
+ ## Scope and globalScope
59
+
60
+ During `create()`, `createScope(element, parent)` establishes a prototype chain:
61
+
62
+ ```
63
+ el.scope → parent.scope → ... → root.scope → context.globalScope
64
+ ```
65
+
66
+ - Elements without a `scope` property inherit their parent's scope (same reference)
67
+ - Elements with `scope: { ... }` get their own scope with parent's scope as prototype
68
+ - `context.globalScope` is auto-initialized as `{}` and sits at the chain's root
69
+
70
+ This enables serialized functions to access module-scoped values (constants, helpers) via `el.scope.X` without closures or imports — the values are placed in `globalScope` by the serialization pipeline and are accessible through prototype lookup.
71
+
58
72
  > **v3 note:** `childExtend` (singular) is deprecated v2 syntax — use `childExtends` (plural) in new code. The singular forms remain in REGISTRY for backwards compatibility with older projects. If a key is missing from REGISTRY, it gets interpreted as a child element name, causing silent rendering failures.
59
73
 
60
74
  ## set.js — Content Setting
package/create.js CHANGED
@@ -91,7 +91,6 @@ export const create = (
91
91
  createScope(element, parent)
92
92
 
93
93
  createState(element, parent)
94
- if (element.scope === 'state') element.scope = element.state
95
94
 
96
95
  createIfConditionFlag(element, parent)
97
96
 
@@ -103,9 +102,6 @@ export const create = (
103
102
  if (!element.tag) element.tag = detectTag(element)
104
103
  // Populate element.attr from props matching the tag's HTML spec
105
104
  applyPropsAsAttrs(element)
106
- if (element.scope === 'props' || element.scope === true) {
107
- element.scope = element.props
108
- }
109
105
 
110
106
  // recatch if it passess props again
111
107
  createIfConditionFlag(element, parent)
@@ -240,7 +236,6 @@ const onlyResolveExtends = (element, parent, key, options) => {
240
236
  createScope(element, parent)
241
237
 
242
238
  createState(element, parent)
243
- if (element.scope === 'state') element.scope = element.state
244
239
 
245
240
  createIfConditionFlag(element, parent)
246
241
 
@@ -248,9 +243,6 @@ const onlyResolveExtends = (element, parent, key, options) => {
248
243
  initProps(element, parent, options)
249
244
  // Re-pickup component-named properties that entered props via childProps/inheritParentProps
250
245
  pickupElementFromProps.call(element, element, { cachedKeys: [] })
251
- if (element.scope === 'props' || element.scope === true) {
252
- element.scope = element.props
253
- }
254
246
 
255
247
  if (element.node && ref.__if) {
256
248
  parent[key || element.key] = element
@@ -72,15 +72,11 @@ const create = (props, parentEl, passedKey, options = import_utils.OPTIONS.creat
72
72
  (0, import_set.addMethods)(element, parent, options);
73
73
  (0, import_utils.createScope)(element, parent);
74
74
  (0, import_state.createState)(element, parent);
75
- if (element.scope === "state") element.scope = element.state;
76
75
  (0, import_utils.createIfConditionFlag)(element, parent);
77
76
  (0, import_utils.initProps)(element, parent, options);
78
77
  import_utils.pickupElementFromProps.call(element, element, { cachedKeys: [] });
79
78
  if (!element.tag) element.tag = (0, import_cache.detectTag)(element);
80
79
  applyPropsAsAttrs(element);
81
- if (element.scope === "props" || element.scope === true) {
82
- element.scope = element.props;
83
- }
84
80
  (0, import_utils.createIfConditionFlag)(element, parent);
85
81
  if (element.node) {
86
82
  if (ref.__if) return (0, import_render.assignNode)(element, parent, key, attachOptions);
@@ -176,13 +172,9 @@ const onlyResolveExtends = (element, parent, key, options) => {
176
172
  (0, import_set.addMethods)(element, parent, options);
177
173
  (0, import_utils.createScope)(element, parent);
178
174
  (0, import_state.createState)(element, parent);
179
- if (element.scope === "state") element.scope = element.state;
180
175
  (0, import_utils.createIfConditionFlag)(element, parent);
181
176
  (0, import_utils.initProps)(element, parent, options);
182
177
  import_utils.pickupElementFromProps.call(element, element, { cachedKeys: [] });
183
- if (element.scope === "props" || element.scope === true) {
184
- element.scope = element.props;
185
- }
186
178
  if (element.node && ref.__if) {
187
179
  parent[key || element.key] = element;
188
180
  }
@@ -26,6 +26,7 @@ var import_create = require("../create.js");
26
26
  var import_utils = require("@domql/utils");
27
27
  function text(param, element, node) {
28
28
  let prop = (0, import_utils.exec)(element.props.text || param, element);
29
+ if ((0, import_utils.isFunction)(prop)) prop = (0, import_utils.exec)(prop, element);
29
30
  if ((0, import_utils.isString)(prop) && prop.includes("{{")) {
30
31
  prop = element.call("replaceLiteralsWithObjectFields", prop, element.state);
31
32
  }
@@ -63,15 +63,11 @@ const create = (props, parentEl, passedKey, options = OPTIONS.create || {}, atta
63
63
  addMethods(element, parent, options);
64
64
  createScope(element, parent);
65
65
  createState(element, parent);
66
- if (element.scope === "state") element.scope = element.state;
67
66
  createIfConditionFlag(element, parent);
68
67
  initProps(element, parent, options);
69
68
  pickupElementFromProps.call(element, element, { cachedKeys: [] });
70
69
  if (!element.tag) element.tag = detectTag(element);
71
70
  applyPropsAsAttrs(element);
72
- if (element.scope === "props" || element.scope === true) {
73
- element.scope = element.props;
74
- }
75
71
  createIfConditionFlag(element, parent);
76
72
  if (element.node) {
77
73
  if (ref.__if) return assignNode(element, parent, key, attachOptions);
@@ -167,13 +163,9 @@ const onlyResolveExtends = (element, parent, key, options) => {
167
163
  addMethods(element, parent, options);
168
164
  createScope(element, parent);
169
165
  createState(element, parent);
170
- if (element.scope === "state") element.scope = element.state;
171
166
  createIfConditionFlag(element, parent);
172
167
  initProps(element, parent, options);
173
168
  pickupElementFromProps.call(element, element, { cachedKeys: [] });
174
- if (element.scope === "props" || element.scope === true) {
175
- element.scope = element.props;
176
- }
177
169
  if (element.node && ref.__if) {
178
170
  parent[key || element.key] = element;
179
171
  }
@@ -1,7 +1,8 @@
1
1
  import { create } from "../create.js";
2
- import { exec, isString, SVG_TAGS } from "@domql/utils";
2
+ import { exec, isFunction, isString, SVG_TAGS } from "@domql/utils";
3
3
  function text(param, element, node) {
4
4
  let prop = exec(element.props.text || param, element);
5
+ if (isFunction(prop)) prop = exec(prop, element);
5
6
  if (isString(prop) && prop.includes("{{")) {
6
7
  prop = element.call("replaceLiteralsWithObjectFields", prop, element.state);
7
8
  }
@@ -1813,7 +1813,24 @@ var DomqlElement = (() => {
1813
1813
  "../utils/dist/esm/scope.js"() {
1814
1814
  createScope = (element, parent) => {
1815
1815
  const { __ref: ref } = element;
1816
- if (!element.scope) element.scope = parent.scope || ref.root?.scope || {};
1816
+ const context = element.context || parent.context || ref.root?.context;
1817
+ if (context && !context.globalScope) context.globalScope = {};
1818
+ const parentScope = parent.scope || ref.root?.scope;
1819
+ const globalScope = context?.globalScope;
1820
+ if (!element.scope) {
1821
+ if (parentScope) {
1822
+ element.scope = parentScope;
1823
+ } else if (globalScope) {
1824
+ element.scope = Object.create(globalScope);
1825
+ } else {
1826
+ element.scope = {};
1827
+ }
1828
+ } else if (typeof element.scope === "object" && element.scope !== null) {
1829
+ if (Object.getPrototypeOf(element.scope) === Object.prototype) {
1830
+ const proto = parentScope || globalScope;
1831
+ if (proto) Object.setPrototypeOf(element.scope, proto);
1832
+ }
1833
+ }
1817
1834
  };
1818
1835
  }
1819
1836
  });
@@ -4408,6 +4425,7 @@ ${element}` : "";
4408
4425
  init_esm();
4409
4426
  function text(param, element, node) {
4410
4427
  let prop = exec(element.props.text || param, element);
4428
+ if (isFunction(prop)) prop = exec(prop, element);
4411
4429
  if (isString(prop) && prop.includes("{{")) {
4412
4430
  prop = element.call("replaceLiteralsWithObjectFields", prop, element.state);
4413
4431
  }
@@ -6514,15 +6532,11 @@ ${element}` : "";
6514
6532
  addMethods(element, parent, options);
6515
6533
  createScope(element, parent);
6516
6534
  createState(element, parent);
6517
- if (element.scope === "state") element.scope = element.state;
6518
6535
  createIfConditionFlag(element, parent);
6519
6536
  initProps(element, parent, options);
6520
6537
  pickupElementFromProps.call(element, element, { cachedKeys: [] });
6521
6538
  if (!element.tag) element.tag = detectTag(element);
6522
6539
  applyPropsAsAttrs(element);
6523
- if (element.scope === "props" || element.scope === true) {
6524
- element.scope = element.props;
6525
- }
6526
6540
  createIfConditionFlag(element, parent);
6527
6541
  if (element.node) {
6528
6542
  if (ref.__if) return assignNode(element, parent, key, attachOptions);
@@ -6618,13 +6632,9 @@ ${element}` : "";
6618
6632
  addMethods(element, parent, options);
6619
6633
  createScope(element, parent);
6620
6634
  createState(element, parent);
6621
- if (element.scope === "state") element.scope = element.state;
6622
6635
  createIfConditionFlag(element, parent);
6623
6636
  initProps(element, parent, options);
6624
6637
  pickupElementFromProps.call(element, element, { cachedKeys: [] });
6625
- if (element.scope === "props" || element.scope === true) {
6626
- element.scope = element.props;
6627
- }
6628
6638
  if (element.node && ref.__if) {
6629
6639
  parent[key || element.key] = element;
6630
6640
  }
package/mixins/text.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  import { create } from '../create.js'
4
- import { exec, isString, SVG_TAGS } from '@domql/utils'
4
+ import { exec, isFunction, isString, SVG_TAGS } from '@domql/utils'
5
5
 
6
6
  /**
7
7
  * Creates a text node and appends into
@@ -9,6 +9,7 @@ import { exec, isString, SVG_TAGS } from '@domql/utils'
9
9
  */
10
10
  export function text (param, element, node) {
11
11
  let prop = exec(element.props.text || param, element)
12
+ if (isFunction(prop)) prop = exec(prop, element)
12
13
  if (isString(prop) && prop.includes('{{')) {
13
14
  prop = element.call('replaceLiteralsWithObjectFields', prop, element.state)
14
15
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@domql/element",
3
- "version": "3.7.5",
3
+ "version": "3.8.0",
4
4
  "license": "CC-BY-NC-4.0",
5
5
  "type": "module",
6
6
  "module": "./dist/esm/index.js",
@@ -46,10 +46,10 @@
46
46
  "build:iife": "cross-env NODE_ENV=$NODE_ENV esbuild index.js --bundle --target=es2020 --format=iife --global-name=DomqlElement --outfile=dist/iife/index.js --define:process.env.NODE_ENV=process.env.NODE_ENV"
47
47
  },
48
48
  "dependencies": {
49
- "@domql/report": "^3.7.5",
50
- "@domql/state": "^3.7.5",
51
- "@domql/utils": "^3.7.5",
52
- "attrs-in-props": "^3.7.5"
49
+ "@domql/report": "^3.8.0",
50
+ "@domql/state": "^3.8.0",
51
+ "@domql/utils": "^3.8.0",
52
+ "attrs-in-props": "^3.8.0"
53
53
  },
54
54
  "gitHead": "9fc1b79b41cdc725ca6b24aec64920a599634681",
55
55
  "devDependencies": {