apprun 4.0.0 → 6.0.0-rc.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.
Files changed (135) hide show
  1. package/CHANGELOG.md +235 -12
  2. package/LICENSE +1 -1
  3. package/README.md +225 -110
  4. package/apprun.d.ts +240 -34
  5. package/cli/app.js +29 -0
  6. package/cli/colors.js +69 -0
  7. package/cli/index.html +13 -0
  8. package/cli/index.js +96 -0
  9. package/dist/apprun-code.js +2 -0
  10. package/dist/apprun-code.js.map +1 -0
  11. package/dist/apprun-dev-tools.js +1 -1
  12. package/dist/apprun-dev-tools.js.map +1 -1
  13. package/dist/apprun-html.esm.js +34 -0
  14. package/dist/apprun-html.esm.js.map +1 -0
  15. package/dist/apprun-html.js +2 -1
  16. package/dist/apprun-html.js.LICENSE.txt +11 -0
  17. package/dist/apprun-html.js.map +1 -1
  18. package/dist/apprun-play.js +2 -0
  19. package/dist/apprun-play.js.map +1 -0
  20. package/dist/apprun.esm.js +2 -0
  21. package/dist/apprun.esm.js.map +1 -0
  22. package/dist/apprun.js +1 -1
  23. package/dist/apprun.js.map +1 -1
  24. package/dist/createState.js +2 -0
  25. package/dist/createState.js.map +1 -0
  26. package/esm/add-components.js +90 -0
  27. package/esm/add-components.js.map +1 -0
  28. package/esm/app.js +209 -0
  29. package/esm/app.js.map +1 -0
  30. package/esm/apprun-code.js +170 -0
  31. package/esm/apprun-code.js.map +1 -0
  32. package/esm/apprun-dev-tools-tests.js +95 -0
  33. package/esm/apprun-dev-tools-tests.js.map +1 -0
  34. package/esm/apprun-dev-tools.js +281 -0
  35. package/esm/apprun-dev-tools.js.map +1 -0
  36. package/esm/apprun-html.js +24 -0
  37. package/esm/apprun-html.js.map +1 -0
  38. package/esm/apprun-play.js +248 -0
  39. package/esm/apprun-play.js.map +1 -0
  40. package/esm/apprun.js +220 -0
  41. package/esm/apprun.js.map +1 -0
  42. package/esm/component.js +413 -0
  43. package/esm/component.js.map +1 -0
  44. package/esm/createState.js +9 -0
  45. package/esm/createState.js.map +1 -0
  46. package/esm/decorator.js +88 -0
  47. package/esm/decorator.js.map +1 -0
  48. package/esm/directive.js +306 -0
  49. package/esm/directive.js.map +1 -0
  50. package/esm/router.js +345 -0
  51. package/esm/router.js.map +1 -0
  52. package/esm/type-utils.js +90 -0
  53. package/esm/type-utils.js.map +1 -0
  54. package/esm/types.js +58 -0
  55. package/esm/types.js.map +1 -0
  56. package/esm/vdom-lit-html.js +65 -0
  57. package/esm/vdom-lit-html.js.map +1 -0
  58. package/esm/vdom-my-prop-attr.js +227 -0
  59. package/esm/vdom-my-prop-attr.js.map +1 -0
  60. package/esm/vdom-my.js +293 -0
  61. package/esm/vdom-my.js.map +1 -0
  62. package/esm/vdom-to-html.js +54 -0
  63. package/esm/vdom-to-html.js.map +1 -0
  64. package/esm/vdom.js +28 -0
  65. package/esm/vdom.js.map +1 -0
  66. package/esm/version.js +15 -0
  67. package/esm/version.js.map +1 -0
  68. package/esm/web-component.js +155 -0
  69. package/esm/web-component.js.map +1 -0
  70. package/jsx-runtime.js +2 -0
  71. package/jsx-runtime.js.map +1 -0
  72. package/package.json +90 -41
  73. package/.travis.yml +0 -10
  74. package/.vscode/launch.json +0 -19
  75. package/BACKERS.md +0 -3
  76. package/apprun-cli.js +0 -177
  77. package/cli-templates/_gitignore +0 -6
  78. package/cli-templates/component.ts_ +0 -16
  79. package/cli-templates/index.html +0 -11
  80. package/cli-templates/karma.conf.js +0 -24
  81. package/cli-templates/main.ts_ +0 -13
  82. package/cli-templates/readme.md +0 -7
  83. package/cli-templates/spa_index.html +0 -14
  84. package/cli-templates/spa_main.ts_ +0 -47
  85. package/cli-templates/spec.ts_ +0 -11
  86. package/cli-templates/tsconfig.json +0 -12
  87. package/cli-templates/webpack.config.js +0 -23
  88. package/demo-html/app.js +0 -2
  89. package/demo-html/app.js.map +0 -1
  90. package/demo-html/counter-c.html +0 -29
  91. package/demo-html/counter-wc-event.html +0 -29
  92. package/demo-html/counter-wc.html +0 -29
  93. package/demo-html/counter.html +0 -26
  94. package/demo-html/index.html +0 -14
  95. package/demo-html/main.tsx +0 -31
  96. package/docs/README.md +0 -326
  97. package/docs/index.html +0 -23
  98. package/index.html +0 -85
  99. package/logo.png +0 -0
  100. package/src/app.ts +0 -69
  101. package/src/apprun-dev-tools.tsx +0 -67
  102. package/src/apprun-html.ts +0 -13
  103. package/src/apprun.ts +0 -53
  104. package/src/component.ts +0 -189
  105. package/src/createComponent.tsx +0 -38
  106. package/src/decorator.ts +0 -36
  107. package/src/router.ts +0 -19
  108. package/src/types.ts +0 -9
  109. package/src/vdom-html.ts +0 -17
  110. package/src/vdom-my.ts +0 -191
  111. package/src/vdom-to-html.tsx +0 -45
  112. package/src/vdom.ts +0 -7
  113. package/src/web-component.ts +0 -29
  114. package/tests/app-rx.spec_ +0 -41
  115. package/tests/app.spec.ts +0 -122
  116. package/tests/application.spec.tsx +0 -23
  117. package/tests/component.spec.tsx +0 -296
  118. package/tests/custom-element.spec.tsx +0 -19
  119. package/tests/data-attr.spec.tsx +0 -42
  120. package/tests/decorator.spec.tsx +0 -104
  121. package/tests/fragment.spec.tsx +0 -79
  122. package/tests/hyperscript.spec.ts +0 -43
  123. package/tests/node-test.js +0 -7
  124. package/tests/router.spec.ts +0 -69
  125. package/tests/stateful-component.spec.tsx +0 -248
  126. package/tests/typed.spec.tsx +0 -63
  127. package/tests/vdom-html.spec.ts +0 -35
  128. package/tests/vdom-jsx.spec.tsx +0 -131
  129. package/tests/vdom-my.spec.tsx +0 -195
  130. package/tests/view-engine.spec.js +0 -59
  131. package/tsconfig.json +0 -11
  132. package/tslint.json +0 -124
  133. package/typescriptreact.json +0 -87
  134. package/viewEngine.js +0 -54
  135. package/webpack.config.js +0 -30
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Type Safety Utilities for AppRun
3
+ *
4
+ * This file provides utility functions and types to improve type safety
5
+ * across the AppRun framework, including:
6
+ * 1. Safe type assertions with null checks
7
+ * 2. Global object assignment helpers
8
+ * 3. Event target type guards
9
+ * 4. Function validation utilities
10
+ */
11
+ /**
12
+ * Safely cast event target to specific HTML element type with null check
13
+ */
14
+ export function safeEventTarget(event) {
15
+ return event?.target instanceof HTMLElement ? event.target : null;
16
+ }
17
+ /**
18
+ * Type guard to check if an object is a valid function
19
+ */
20
+ export function isFunction(obj) {
21
+ return typeof obj === 'function';
22
+ }
23
+ /**
24
+ * Type guard to check if an object is a valid HTML element
25
+ */
26
+ export function isHTMLElement(obj) {
27
+ return obj instanceof HTMLElement;
28
+ }
29
+ /**
30
+ * Safely assign properties to global object with type checking
31
+ */
32
+ export function safeGlobalAssign(globalObj, assignments) {
33
+ if (typeof globalObj === 'object' && globalObj !== null) {
34
+ Object.keys(assignments).forEach(key => {
35
+ globalObj[key] = assignments[key];
36
+ });
37
+ }
38
+ }
39
+ /**
40
+ * Safely get property from global object with fallback
41
+ */
42
+ export function safeGlobalGet(globalObj, property, fallback) {
43
+ if (typeof globalObj === 'object' && globalObj !== null) {
44
+ return globalObj[property] ?? fallback;
45
+ }
46
+ return fallback;
47
+ }
48
+ /**
49
+ * Type-safe wrapper for DOM element queries
50
+ */
51
+ export function safeQuerySelector(selector, context = document) {
52
+ try {
53
+ return context.querySelector(selector);
54
+ }
55
+ catch (error) {
56
+ console.warn(`Invalid selector: ${selector}`, error);
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Type-safe wrapper for DOM element by ID
62
+ */
63
+ export function safeGetElementById(id) {
64
+ try {
65
+ return document.getElementById(id);
66
+ }
67
+ catch (error) {
68
+ console.warn(`Error getting element by id: ${id}`, error);
69
+ return null;
70
+ }
71
+ }
72
+ /**
73
+ * Validate and safely execute a function with error handling
74
+ */
75
+ export function safeExecute(fn, args, context, errorMessage) {
76
+ if (!isFunction(fn)) {
77
+ if (errorMessage) {
78
+ console.warn(errorMessage, fn);
79
+ }
80
+ return undefined;
81
+ }
82
+ try {
83
+ return context ? fn.apply(context, args) : fn(...args);
84
+ }
85
+ catch (error) {
86
+ console.error(errorMessage || 'Error executing function:', error);
87
+ return undefined;
88
+ }
89
+ }
90
+ //# sourceMappingURL=type-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../src/type-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAsC,KAAY;IAC/E,OAAO,KAAK,EAAE,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAQ;IACjC,OAAO,OAAO,GAAG,KAAK,UAAU,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,OAAO,GAAG,YAAY,WAAW,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAc,EACd,WAAc;IAEd,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACrC,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAc,EACd,QAAgB,EAChB,QAAY;IAEZ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,UAA8B,QAAQ;IAEtC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,aAAa,CAAI,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,qBAAqB,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAU;IAEV,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAa,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,EAA0C,EAC1C,IAAO,EACP,OAAa,EACb,YAAqB;IAErB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACpB,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
package/esm/types.js ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Core TypeScript Type Definitions
3
+ *
4
+ * This file defines the fundamental types used across AppRun:
5
+ * 1. Component Types
6
+ * - View: Function that renders state to VDOM
7
+ * - Action: Function that updates state (sync/async/generator)
8
+ * - Update: Collection of actions (array or object format)
9
+ * - ActionDef: Tuple definition for action arrays
10
+ *
11
+ * 2. Virtual DOM Types
12
+ * - VNode: Virtual DOM node structure with tag/props/children
13
+ * - VDOM: Union of possible VDOM types (false, string, VNode, array)
14
+ * - Element: DOM element references (HTMLElement or string selector)
15
+ * - TemplateResult: Lit-html template support
16
+ *
17
+ * 3. Configuration Types
18
+ * - EventOptions: Event handler options (once, delay, transition, global)
19
+ * - ActionOptions: Action behavior options (render, history, global, callback)
20
+ * - MountOptions: Component mounting options (global events, routing, transitions)
21
+ * - AppStartOptions: Application startup configuration with lifecycle hooks
22
+ *
23
+ * Features:
24
+ * - Strong typing for component lifecycle
25
+ * - Flexible action definition formats
26
+ * - Comprehensive event options
27
+ * - Integration with external libraries (lit-html)
28
+ * - Type-safe component mounting
29
+ * - Lifecycle hook typing
30
+ *
31
+ * Type Safety Improvements (v3.35.1):
32
+ * - Enhanced generic constraints for better type inference
33
+ * - Improved union types for VDOM flexibility
34
+ * - Better callback typing in options
35
+ * - Stricter typing for lifecycle methods
36
+ * - Added support for async generator and generator functions in Action types
37
+ * - Phase 3 removed `any` escape hatches from public options and typed history.
38
+ *
39
+ * Usage:
40
+ * ```ts
41
+ * class MyComponent extends Component<State, Events> {
42
+ * view: View<State>;
43
+ * update: Update<State, Events>;
44
+ * }
45
+ *
46
+ * // Type-safe action definitions with async generators
47
+ * const update: Update<State> = {
48
+ * 'event': (state: State, ...args) => newState,
49
+ * 'stream-event': async function* (state: State, ...args) {
50
+ * yield { ...state, loading: true };
51
+ * const data = await fetchData();
52
+ * yield { ...state, data, loading: false };
53
+ * }
54
+ * };
55
+ * ```
56
+ */
57
+ export {};
58
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG"}
@@ -0,0 +1,65 @@
1
+ import { createElement, updateElement, Fragment } from './vdom-my';
2
+ import { render, svg, html, noChange } from 'lit';
3
+ import { directive, Directive, PartType } from 'lit/directive.js';
4
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
5
+ import app from './apprun';
6
+ function _render(element, vdom, parent) {
7
+ if (!vdom)
8
+ return;
9
+ if (typeof vdom === 'string') {
10
+ if (!element['_$litPart$'])
11
+ element.replaceChildren();
12
+ render(html `${unsafeHTML(vdom)}`, element);
13
+ }
14
+ else if (vdom['_$litType$']) {
15
+ if (!element['_$litPart$'])
16
+ element.replaceChildren();
17
+ render(vdom, element);
18
+ }
19
+ else {
20
+ updateElement(element, vdom, parent);
21
+ element['_$litPart$'] = undefined;
22
+ }
23
+ }
24
+ export class RunDirective extends Directive {
25
+ constructor(partInfo) {
26
+ super(partInfo);
27
+ // When necessary, validate part in constructor using `part.type`
28
+ if (partInfo.type !== PartType.EVENT) { // In lit v3, use PartType.EVENT
29
+ throw new Error('run() can only be used in event handlers');
30
+ }
31
+ }
32
+ // Override update to perform any direct DOM manipulation
33
+ update(part, props) {
34
+ /* Any imperative updates to DOM/parts would go here */
35
+ const element = part.element;
36
+ const name = part.name;
37
+ const [eventOrFn, ...args] = props;
38
+ const getComponent = () => {
39
+ let el = element;
40
+ let component = el['_component'];
41
+ while (!component && el) {
42
+ el = el.parentElement;
43
+ component = el && el['_component'];
44
+ }
45
+ console.assert(!!component, 'Component not found.');
46
+ return component;
47
+ };
48
+ if (typeof eventOrFn === 'string') {
49
+ element[`on${name}`] = e => {
50
+ const component = getComponent();
51
+ component ? component.run(eventOrFn, ...args, e) : app.run(eventOrFn, ...args, e);
52
+ };
53
+ }
54
+ else if (typeof eventOrFn === 'function') {
55
+ element[`on${name}`] = e => getComponent().setState(eventOrFn(getComponent().state, ...args, e));
56
+ }
57
+ return this.render();
58
+ }
59
+ render() {
60
+ return noChange;
61
+ }
62
+ }
63
+ const run = directive(RunDirective);
64
+ export { createElement, Fragment, html, svg, _render as render, run };
65
+ //# sourceMappingURL=vdom-lit-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vdom-lit-html.js","sourceRoot":"","sources":["../src/vdom-lit-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * VDOM Property and Attribute Handler
3
+ * Standards-compliant property/attribute handling with caching and special element support
4
+ * Features: Skip logic for preserving user interactions during VDOM reconciliation
5
+ * Exports: updateProps - Main function for DOM element property updates
6
+ * Updated: 2025-01-14 - Skip logic for focus-sensitive (selection), scroll, and media properties
7
+ */
8
+ import { find, html, svg } from 'property-information';
9
+ const ATTR_PROPS = '_props';
10
+ const propertyInfoCache = new Map();
11
+ // Merge old and new props, handling className -> class conversion and null cleanup
12
+ function mergeProps(oldProps, newProps) {
13
+ if (newProps) {
14
+ newProps['class'] = newProps['class'] || newProps['className'];
15
+ delete newProps['className'];
16
+ }
17
+ if (!oldProps || Object.keys(oldProps).length === 0)
18
+ return newProps || {};
19
+ if (!newProps || Object.keys(newProps).length === 0) {
20
+ const props = {};
21
+ Object.keys(oldProps).forEach(p => props[p] = null);
22
+ return props;
23
+ }
24
+ const props = {};
25
+ Object.keys(oldProps).forEach(p => {
26
+ if (!(p in newProps))
27
+ props[p] = null;
28
+ });
29
+ Object.keys(newProps).forEach(p => props[p] = newProps[p]);
30
+ return props;
31
+ }
32
+ // Convert kebab-case to camelCase for dataset keys
33
+ function convertKebabToCamelCase(str) {
34
+ if (str.length <= 1)
35
+ return str.toLowerCase();
36
+ return str.split('-').map((word, index) => index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join('');
37
+ }
38
+ // Cached property information lookup
39
+ function getPropertyInfo(name, isSvg) {
40
+ const cacheKey = `${name}:${isSvg}`;
41
+ let info = propertyInfoCache.get(cacheKey);
42
+ if (info === undefined) {
43
+ info = find(isSvg ? svg : html, name) || null;
44
+ propertyInfoCache.set(cacheKey, info);
45
+ }
46
+ return info;
47
+ }
48
+ // Specialized handlers for different attribute types
49
+ function setDatasetAttribute(element, attributeName, value) {
50
+ const camelKey = convertKebabToCamelCase(attributeName.slice(5));
51
+ if (value == null) {
52
+ delete element.dataset[camelKey];
53
+ }
54
+ else {
55
+ element.dataset[camelKey] = String(value);
56
+ }
57
+ }
58
+ function setEventHandler(element, name, value) {
59
+ if (!name.startsWith('on'))
60
+ return;
61
+ if (!value || typeof value === 'function') {
62
+ element[name] = value;
63
+ }
64
+ else if (typeof value === 'string') {
65
+ if (value)
66
+ element.setAttribute(name, value);
67
+ else
68
+ element.removeAttribute(name);
69
+ }
70
+ }
71
+ function setBooleanAttribute(element, attributeName, value) {
72
+ if (shouldSetBooleanAttribute(value)) {
73
+ element.setAttribute(attributeName, attributeName);
74
+ }
75
+ else {
76
+ element.removeAttribute(attributeName);
77
+ }
78
+ }
79
+ function setElementProperty(element, propertyName, value) {
80
+ try {
81
+ element[propertyName] = value;
82
+ }
83
+ catch (error) {
84
+ setElementAttribute(element, propertyName, value, false);
85
+ }
86
+ }
87
+ function setElementAttribute(element, attributeName, value, isSvg) {
88
+ if (value == null) {
89
+ element.removeAttribute(attributeName);
90
+ return;
91
+ }
92
+ const stringValue = String(value);
93
+ if (isSvg && attributeName.includes(':')) {
94
+ const [prefix] = attributeName.split(':');
95
+ if (prefix === 'xlink') {
96
+ element.setAttributeNS('http://www.w3.org/1999/xlink', attributeName, stringValue);
97
+ }
98
+ else {
99
+ element.setAttribute(attributeName, stringValue);
100
+ }
101
+ }
102
+ else {
103
+ element.setAttribute(attributeName, stringValue);
104
+ }
105
+ }
106
+ function shouldSetBooleanAttribute(value) {
107
+ if (value == null || value === false || value === '')
108
+ return false;
109
+ if (value === true)
110
+ return true;
111
+ if (typeof value === 'string') {
112
+ const lowerValue = value.toLowerCase();
113
+ return lowerValue !== 'false' && value !== '0';
114
+ }
115
+ return Boolean(value);
116
+ }
117
+ // Core property/attribute setting function - handles all property types with skip logic
118
+ function setAttributeOrProperty(element, name, value, isSvg) {
119
+ // Check if we should skip this property update to preserve user interaction
120
+ if (shouldSkipPatch(element, name)) {
121
+ return;
122
+ }
123
+ // Special cases with dedicated handling
124
+ if (name === 'style') {
125
+ if (element.style.cssText)
126
+ element.style.cssText = '';
127
+ if (typeof value === 'string')
128
+ element.style.cssText = value;
129
+ else if (value && typeof value === 'object') {
130
+ for (const s in value) {
131
+ if (element.style[s] !== value[s])
132
+ element.style[s] = value[s];
133
+ }
134
+ }
135
+ return;
136
+ }
137
+ if (name === 'key') {
138
+ if (value !== undefined && value !== null)
139
+ element.key = value;
140
+ return;
141
+ }
142
+ if (name.startsWith('data-')) {
143
+ setDatasetAttribute(element, name, value);
144
+ return;
145
+ }
146
+ if (name.startsWith('on')) {
147
+ setEventHandler(element, name, value);
148
+ return;
149
+ }
150
+ // Form elements with special property requirements
151
+ if ((element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') &&
152
+ (name === 'value' || name === 'selected' || name === 'selectedIndex')) {
153
+ setElementProperty(element, name, value);
154
+ return;
155
+ }
156
+ // Input checked needs both property and attribute
157
+ if (element.tagName === 'INPUT' && name === 'checked') {
158
+ setElementProperty(element, name, value);
159
+ setBooleanAttribute(element, name, value);
160
+ return;
161
+ }
162
+ // Use property information for standard attributes
163
+ const info = getPropertyInfo(name, isSvg);
164
+ if (info) {
165
+ if (info.boolean || info.overloadedBoolean) {
166
+ setBooleanAttribute(element, info.attribute, value);
167
+ }
168
+ else if (info.mustUseProperty && !isSvg) {
169
+ setElementProperty(element, info.property, value);
170
+ }
171
+ else {
172
+ setElementAttribute(element, info.attribute, value, isSvg);
173
+ }
174
+ }
175
+ else {
176
+ // Fallback handling for unknown attributes
177
+ if (name.startsWith('aria-') || name === 'role') {
178
+ setElementAttribute(element, name, value, isSvg);
179
+ }
180
+ else if (name in element || element[name] !== undefined) {
181
+ setElementProperty(element, name, value);
182
+ }
183
+ else {
184
+ setElementAttribute(element, name, value, isSvg);
185
+ }
186
+ }
187
+ }
188
+ // Skip logic for preventing user interaction disruption during VDOM reconciliation
189
+ function shouldSkipPatch(dom, prop) {
190
+ if (document.activeElement === dom) {
191
+ return ['selectionStart', 'selectionEnd', 'selectionDirection']
192
+ .includes(prop);
193
+ }
194
+ if (prop === 'scrollTop' || prop === 'scrollLeft') {
195
+ return true;
196
+ }
197
+ if (dom instanceof HTMLMediaElement &&
198
+ ['currentTime', 'paused', 'playbackRate', 'volume'].includes(prop)) {
199
+ return true;
200
+ }
201
+ return false; // default: allow normal diff logic
202
+ }
203
+ function isValidAttributeName(name) {
204
+ return /^[a-zA-Z_:][\w\-:.]*$/.test(name) &&
205
+ !name.includes('<') && !name.includes('>') && !name.includes('"') && !name.includes("'");
206
+ }
207
+ // Main exported function for updating element properties
208
+ export function updateProps(element, props, isSvg) {
209
+ // console.assert(!!element);
210
+ const cached = element[ATTR_PROPS] || {};
211
+ const merged = mergeProps(cached, props);
212
+ element[ATTR_PROPS] = props || {};
213
+ applyPropertiesToElement(element, merged, props, isSvg);
214
+ }
215
+ // Apply merged properties to element with ref handling
216
+ function applyPropertiesToElement(element, mergedProps, originalProps, isSvg) {
217
+ for (const name in mergedProps) {
218
+ if (isValidAttributeName(name)) {
219
+ setAttributeOrProperty(element, name, mergedProps[name], isSvg);
220
+ }
221
+ }
222
+ // Handle ref callback
223
+ if (mergedProps && typeof mergedProps['ref'] === 'function') {
224
+ window.requestAnimationFrame(() => mergedProps['ref'](element));
225
+ }
226
+ }
227
+ //# sourceMappingURL=vdom-my-prop-attr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vdom-my-prop-attr.js","sourceRoot":"","sources":["../src/vdom-my-prop-attr.ts"],"names":[],"mappings":"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"}