@openelement/core 0.41.0-alpha.1

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.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/package.json +124 -0
  4. package/src/binding-activation.d.ts +2 -0
  5. package/src/binding-activation.js +254 -0
  6. package/src/binding-descriptor.d.ts +79 -0
  7. package/src/binding-descriptor.js +9 -0
  8. package/src/context.d.ts +32 -0
  9. package/src/context.js +76 -0
  10. package/src/csr.d.ts +13 -0
  11. package/src/csr.js +14 -0
  12. package/src/dsd-hydration-events.d.ts +2 -0
  13. package/src/dsd-hydration-events.js +13 -0
  14. package/src/dsd-hydration.d.ts +40 -0
  15. package/src/dsd-hydration.js +48 -0
  16. package/src/errors.d.ts +54 -0
  17. package/src/errors.js +113 -0
  18. package/src/event-hydration.d.ts +12 -0
  19. package/src/event-hydration.js +118 -0
  20. package/src/event-marker.d.ts +7 -0
  21. package/src/event-marker.js +54 -0
  22. package/src/html-escape.d.ts +29 -0
  23. package/src/html-escape.js +126 -0
  24. package/src/hydrate.d.ts +15 -0
  25. package/src/hydrate.js +15 -0
  26. package/src/index.d.ts +58 -0
  27. package/src/index.js +46 -0
  28. package/src/island-transform.d.ts +14 -0
  29. package/src/island-transform.js +60 -0
  30. package/src/island.d.ts +59 -0
  31. package/src/island.js +342 -0
  32. package/src/isr-runtime.d.ts +28 -0
  33. package/src/isr-runtime.js +99 -0
  34. package/src/isr.d.ts +22 -0
  35. package/src/isr.js +41 -0
  36. package/src/jsx-render-dom.d.ts +22 -0
  37. package/src/jsx-render-dom.js +376 -0
  38. package/src/jsx-runtime.d.ts +58 -0
  39. package/src/jsx-runtime.js +99 -0
  40. package/src/jsx-types.d.ts +46 -0
  41. package/src/logger.d.ts +15 -0
  42. package/src/logger.js +24 -0
  43. package/src/prop.d.ts +24 -0
  44. package/src/prop.js +160 -0
  45. package/src/registry.d.ts +17 -0
  46. package/src/registry.js +219 -0
  47. package/src/render-dsd-stream.d.ts +46 -0
  48. package/src/render-dsd-stream.js +86 -0
  49. package/src/render-dsd.d.ts +27 -0
  50. package/src/render-dsd.js +315 -0
  51. package/src/render-ir.d.ts +32 -0
  52. package/src/render-ir.js +245 -0
  53. package/src/runtime.d.ts +9 -0
  54. package/src/runtime.js +16 -0
  55. package/src/security.d.ts +1 -0
  56. package/src/security.js +40 -0
  57. package/src/signal-context.d.ts +15 -0
  58. package/src/signal-context.js +59 -0
  59. package/src/static.d.ts +35 -0
  60. package/src/static.js +34 -0
  61. package/src/style-sheet.d.ts +9 -0
  62. package/src/style-sheet.js +56 -0
  63. package/src/tag-utils.d.ts +11 -0
  64. package/src/tag-utils.js +28 -0
  65. package/src/vnode.d.ts +15 -0
  66. package/src/vnode.js +31 -0
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @openelement/core — Tag name validation utility.
3
+ *
4
+ * Validates custom element tag names per HTML spec:
5
+ * - Must contain at least one hyphen
6
+ * - Must start with a lowercase letter
7
+ * - Only lowercase letters, digits, and hyphens allowed
8
+ * - Must not be a reserved name
9
+ *
10
+ * @module @openelement/core/tag-utils
11
+ */ /** Check if a tag name is a valid custom element name per HTML spec. */ export function isValidTagName(tagName) {
12
+ if (!tagName || typeof tagName !== 'string') return false;
13
+ const reserved = new Set([
14
+ 'annotation-xml',
15
+ 'color-profile',
16
+ 'font-face',
17
+ 'font-face-src',
18
+ 'font-face-uri',
19
+ 'font-face-format',
20
+ 'font-face-name',
21
+ 'missing-glyph'
22
+ ]);
23
+ if (reserved.has(tagName)) return false;
24
+ // Must start with a lowercase letter, contain at least one hyphen,
25
+ // and only contain [a-z], [0-9], and hyphens.
26
+ return /^[a-z][a-z0-9]*(-[a-z0-9]+)+$/.test(tagName);
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy90YWctdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvY29yZSDigJQgVGFnIG5hbWUgdmFsaWRhdGlvbiB1dGlsaXR5LlxuICpcbiAqIFZhbGlkYXRlcyBjdXN0b20gZWxlbWVudCB0YWcgbmFtZXMgcGVyIEhUTUwgc3BlYzpcbiAqIC0gTXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBoeXBoZW5cbiAqIC0gTXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlclxuICogLSBPbmx5IGxvd2VyY2FzZSBsZXR0ZXJzLCBkaWdpdHMsIGFuZCBoeXBoZW5zIGFsbG93ZWRcbiAqIC0gTXVzdCBub3QgYmUgYSByZXNlcnZlZCBuYW1lXG4gKlxuICogQG1vZHVsZSBAb3BlbmVsZW1lbnQvY29yZS90YWctdXRpbHNcbiAqL1xuXG4vKiogQ2hlY2sgaWYgYSB0YWcgbmFtZSBpcyBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUgcGVyIEhUTUwgc3BlYy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGFnTmFtZSh0YWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCF0YWdOYW1lIHx8IHR5cGVvZiB0YWdOYW1lICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHJlc2VydmVkID0gbmV3IFNldChbXG4gICAgJ2Fubm90YXRpb24teG1sJyxcbiAgICAnY29sb3ItcHJvZmlsZScsXG4gICAgJ2ZvbnQtZmFjZScsXG4gICAgJ2ZvbnQtZmFjZS1zcmMnLFxuICAgICdmb250LWZhY2UtdXJpJyxcbiAgICAnZm9udC1mYWNlLWZvcm1hdCcsXG4gICAgJ2ZvbnQtZmFjZS1uYW1lJyxcbiAgICAnbWlzc2luZy1nbHlwaCcsXG4gIF0pO1xuICBpZiAocmVzZXJ2ZWQuaGFzKHRhZ05hbWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gTXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciwgY29udGFpbiBhdCBsZWFzdCBvbmUgaHlwaGVuLFxuICAvLyBhbmQgb25seSBjb250YWluIFthLXpdLCBbMC05XSwgYW5kIGh5cGhlbnMuXG4gIHJldHVybiAvXlthLXpdW2EtejAtOV0qKC1bYS16MC05XSspKyQvLnRlc3QodGFnTmFtZSk7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Q0FVQyxHQUVELHNFQUFzRSxHQUN0RSxPQUFPLFNBQVMsZUFBZSxPQUFlO0VBQzVDLElBQUksQ0FBQyxXQUFXLE9BQU8sWUFBWSxVQUFVLE9BQU87RUFFcEQsTUFBTSxXQUFXLElBQUksSUFBSTtJQUN2QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0dBQ0Q7RUFDRCxJQUFJLFNBQVMsR0FBRyxDQUFDLFVBQVUsT0FBTztFQUVsQyxtRUFBbUU7RUFDbkUsOENBQThDO0VBQzlDLE9BQU8sZ0NBQWdDLElBQUksQ0FBQztBQUM5QyJ9
package/src/vnode.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @openelement/core - VNode interface definition.
3
+ *
4
+ * VNode is the intermediate representation of a component's declarative output.
5
+ * It is a pure JS object — zero DOM dependency, zero runtime binding.
6
+ *
7
+ * ⚠️ VNode 接口冻结条款 (ADR-0057 §1.1):
8
+ * v1.0 前只允许以下 5 个字段,不增加 hooks/memo/suspense/context/portal。
9
+ * 任何新字段提案必须走 ADR 流程,并证明它不引入 VDOM diff 语义。
10
+ *
11
+ * @module @openelement/core/vnode
12
+ */ import type { VNode } from '@openelement/protocol/vnode';
13
+ /**
14
+ * Returns true if the given value is a VNode object.
15
+ */ export declare function isVNode(v: unknown): v is VNode;
package/src/vnode.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @openelement/core - VNode interface definition.
3
+ *
4
+ * VNode is the intermediate representation of a component's declarative output.
5
+ * It is a pure JS object — zero DOM dependency, zero runtime binding.
6
+ *
7
+ * ⚠️ VNode 接口冻结条款 (ADR-0057 §1.1):
8
+ * v1.0 前只允许以下 5 个字段,不增加 hooks/memo/suspense/context/portal。
9
+ * 任何新字段提案必须走 ADR 流程,并证明它不引入 VDOM diff 语义。
10
+ *
11
+ * @module @openelement/core/vnode
12
+ */ // ─── Type guard ──────────────────────────────────────────────────────────────
13
+ /**
14
+ * Returns true if the given value is a VNode object.
15
+ */ export function isVNode(v) {
16
+ if (typeof v !== 'object' || v === null || Array.isArray(v)) return false;
17
+ const candidate = v;
18
+ const tagType = typeof candidate.tag;
19
+ return (tagType === 'string' || tagType === 'function' || tagType === 'symbol') && typeof candidate.props === 'object' && candidate.props !== null && !Array.isArray(candidate.props) && Array.isArray(candidate.children);
20
+ }
21
+ /**
22
+ * Returns true if the VNode tag is a class component constructor.
23
+ */ export function isComponentCtor(tag) {
24
+ return typeof tag === 'function' && tag.prototype !== undefined && typeof tag.prototype.render === 'function';
25
+ }
26
+ /**
27
+ * Returns true if the VNode tag is a function component.
28
+ */ export function isComponentFn(tag) {
29
+ return typeof tag === 'function' && !isComponentCtor(tag);
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9jb3JlL3NyYy92bm9kZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBvcGVuZWxlbWVudC9jb3JlIC0gVk5vZGUgaW50ZXJmYWNlIGRlZmluaXRpb24uXG4gKlxuICogVk5vZGUgaXMgdGhlIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbiBvZiBhIGNvbXBvbmVudCdzIGRlY2xhcmF0aXZlIG91dHB1dC5cbiAqIEl0IGlzIGEgcHVyZSBKUyBvYmplY3Qg4oCUIHplcm8gRE9NIGRlcGVuZGVuY3ksIHplcm8gcnVudGltZSBiaW5kaW5nLlxuICpcbiAqIOKaoO+4jyBWTm9kZSDmjqXlj6Plhrvnu5PmnaHmrL4gKEFEUi0wMDU3IMKnMS4xKTpcbiAqIHYxLjAg5YmN5Y+q5YWB6K645Lul5LiLIDUg5Liq5a2X5q6177yM5LiN5aKe5YqgIGhvb2tzL21lbW8vc3VzcGVuc2UvY29udGV4dC9wb3J0YWzjgIJcbiAqIOS7u+S9leaWsOWtl+auteaPkOahiOW/hemhu+i1sCBBRFIg5rWB56iL77yM5bm26K+B5piO5a6D5LiN5byV5YWlIFZET00gZGlmZiDor63kuYnjgIJcbiAqXG4gKiBAbW9kdWxlIEBvcGVuZWxlbWVudC9jb3JlL3Zub2RlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnRDdG9yLCBDb21wb25lbnRGbiwgUmVuZGVyRm4sIFZOb2RlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3Zub2RlJztcbmV4cG9ydCB0eXBlIHsgQ29tcG9uZW50Q3RvciwgQ29tcG9uZW50Rm4sIFJlbmRlckZuLCBWTm9kZSB9O1xuXG4vLyDilIDilIDilIAgVHlwZSBndWFyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgVk5vZGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWTm9kZSh2OiB1bmtub3duKTogdiBpcyBWTm9kZSB7XG4gIGlmICh0eXBlb2YgdiAhPT0gJ29iamVjdCcgfHwgdiA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHYpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY2FuZGlkYXRlID0gdiBhcyB7XG4gICAgdGFnPzogdW5rbm93bjtcbiAgICBwcm9wcz86IHVua25vd247XG4gICAgY2hpbGRyZW4/OiB1bmtub3duO1xuICB9O1xuICBjb25zdCB0YWdUeXBlID0gdHlwZW9mIGNhbmRpZGF0ZS50YWc7XG5cbiAgcmV0dXJuIChcbiAgICAodGFnVHlwZSA9PT0gJ3N0cmluZycgfHwgdGFnVHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0YWdUeXBlID09PSAnc3ltYm9sJykgJiZcbiAgICB0eXBlb2YgY2FuZGlkYXRlLnByb3BzID09PSAnb2JqZWN0JyAmJlxuICAgIGNhbmRpZGF0ZS5wcm9wcyAhPT0gbnVsbCAmJlxuICAgICFBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5wcm9wcykgJiZcbiAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbilcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIFZOb2RlIHRhZyBpcyBhIGNsYXNzIGNvbXBvbmVudCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50Q3Rvcih0YWc6IFZOb2RlWyd0YWcnXSk6IHRhZyBpcyBDb21wb25lbnRDdG9yIHtcbiAgcmV0dXJuIHR5cGVvZiB0YWcgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0YWcucHJvdG90eXBlICE9PSB1bmRlZmluZWQgJiZcbiAgICB0eXBlb2YgKHRhZyBhcyBDb21wb25lbnRDdG9yKS5wcm90b3R5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgVk5vZGUgdGFnIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wb25lbnRGbih0YWc6IFZOb2RlWyd0YWcnXSk6IHRhZyBpcyBDb21wb25lbnRGbiB7XG4gIHJldHVybiB0eXBlb2YgdGFnID09PSAnZnVuY3Rpb24nICYmICFpc0NvbXBvbmVudEN0b3IodGFnKTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Q0FXQyxHQUtELGdGQUFnRjtBQUVoRjs7Q0FFQyxHQUNELE9BQU8sU0FBUyxRQUFRLENBQVU7RUFDaEMsSUFBSSxPQUFPLE1BQU0sWUFBWSxNQUFNLFFBQVEsTUFBTSxPQUFPLENBQUMsSUFBSSxPQUFPO0VBRXBFLE1BQU0sWUFBWTtFQUtsQixNQUFNLFVBQVUsT0FBTyxVQUFVLEdBQUc7RUFFcEMsT0FDRSxDQUFDLFlBQVksWUFBWSxZQUFZLGNBQWMsWUFBWSxRQUFRLEtBQ3ZFLE9BQU8sVUFBVSxLQUFLLEtBQUssWUFDM0IsVUFBVSxLQUFLLEtBQUssUUFDcEIsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxVQUFVLEtBQUssS0FDOUIsTUFBTSxPQUFPLENBQUMsVUFBVSxRQUFRO0FBRXBDO0FBRUE7O0NBRUMsR0FDRCxPQUFPLFNBQVMsZ0JBQWdCLEdBQWlCO0VBQy9DLE9BQU8sT0FBTyxRQUFRLGNBQ3BCLElBQUksU0FBUyxLQUFLLGFBQ2xCLE9BQU8sQUFBQyxJQUFzQixTQUFTLENBQUMsTUFBTSxLQUFLO0FBQ3ZEO0FBRUE7O0NBRUMsR0FDRCxPQUFPLFNBQVMsY0FBYyxHQUFpQjtFQUM3QyxPQUFPLE9BQU8sUUFBUSxjQUFjLENBQUMsZ0JBQWdCO0FBQ3ZEIn0=