apprun 3.33.8 → 3.33.10

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 (72) hide show
  1. package/.clinerules +1 -0
  2. package/LICENSE +1 -1
  3. package/README.md +1 -1
  4. package/WHATSNEW.md +59 -0
  5. package/apprun-cli.js +5 -5
  6. package/apprun.d.ts +12 -0
  7. package/dist/apprun-dev-tools.js +1 -1
  8. package/dist/apprun-dev-tools.js.map +1 -1
  9. package/dist/apprun-html.esm.js +21 -4
  10. package/dist/apprun-html.esm.js.map +1 -1
  11. package/dist/apprun-html.js +1 -1
  12. package/dist/apprun-html.js.LICENSE.txt +6 -0
  13. package/dist/apprun-html.js.map +1 -1
  14. package/dist/apprun-play-html.esm.js +21 -4
  15. package/dist/apprun-play-html.esm.js.map +1 -1
  16. package/dist/apprun-play.js +1 -1
  17. package/dist/apprun-play.js.map +1 -1
  18. package/dist/apprun.esm.js +1 -1
  19. package/dist/apprun.esm.js.map +1 -1
  20. package/dist/apprun.js +1 -1
  21. package/dist/apprun.js.map +1 -1
  22. package/esm/app.js +37 -9
  23. package/esm/app.js.map +1 -1
  24. package/esm/apprun-code.js.map +1 -1
  25. package/esm/apprun-dev-tools-tests.js.map +1 -1
  26. package/esm/apprun-dev-tools.js.map +1 -1
  27. package/esm/apprun-html.js.map +1 -1
  28. package/esm/apprun-play.js.map +1 -1
  29. package/esm/apprun.js +55 -3
  30. package/esm/apprun.js.map +1 -1
  31. package/esm/component.js +59 -1
  32. package/esm/component.js.map +1 -1
  33. package/esm/decorator.js +33 -0
  34. package/esm/decorator.js.map +1 -1
  35. package/esm/directive.js +31 -0
  36. package/esm/directive.js.map +1 -1
  37. package/esm/router.js +24 -0
  38. package/esm/router.js.map +1 -1
  39. package/esm/types.js +28 -0
  40. package/esm/types.js.map +1 -1
  41. package/esm/vdom-lit-html.js +19 -17
  42. package/esm/vdom-lit-html.js.map +1 -1
  43. package/esm/vdom-my.js.map +1 -1
  44. package/esm/vdom-patch.js.map +1 -1
  45. package/esm/vdom-to-html.js.map +1 -1
  46. package/esm/vdom.js +25 -0
  47. package/esm/vdom.js.map +1 -1
  48. package/esm/web-component.js +32 -0
  49. package/esm/web-component.js.map +1 -1
  50. package/index.html +2 -2
  51. package/jest.config.js +63 -0
  52. package/jest.setup.js +47 -0
  53. package/jsx-runtime.js +2 -0
  54. package/jsx-runtime.js.map +1 -0
  55. package/package.json +16 -43
  56. package/react.js +0 -15
  57. package/rollup.config.js +27 -10
  58. package/src/app.ts +61 -28
  59. package/src/apprun.ts +82 -7
  60. package/src/component.ts +57 -1
  61. package/src/decorator.ts +34 -1
  62. package/src/directive.ts +33 -1
  63. package/src/global.d.ts +22 -0
  64. package/src/router.ts +26 -1
  65. package/src/types/apprun.d.ts +56 -0
  66. package/src/types.ts +30 -1
  67. package/src/vdom-lit-html.ts +21 -19
  68. package/src/vdom.ts +26 -2
  69. package/src/web-component.ts +33 -0
  70. package/tsconfig.jest.json +27 -3
  71. package/tsconfig.json +3 -3
  72. package/webpack.config.cjs +10 -2
@@ -1,3 +1,35 @@
1
+ /**
2
+ * Web Components Integration
3
+ *
4
+ * This file enables using AppRun components as Web Components:
5
+ * 1. Custom Element Creation
6
+ * - Converts AppRun components to custom elements
7
+ * - Handles lifecycle (connected, disconnected, etc)
8
+ * - Manages shadow DOM and light DOM rendering
9
+ *
10
+ * 2. Property/Attribute Sync
11
+ * - Observes attribute changes
12
+ * - Updates component state automatically
13
+ * - Handles camelCase/kebab-case conversion
14
+ * - Supports complex property types
15
+ *
16
+ * 3. Event Handling
17
+ * - Proxies events between component and element
18
+ * - Supports both global and local events
19
+ * - Maintains proper event bubbling
20
+ *
21
+ * Usage:
22
+ * ```ts
23
+ * // Register web component
24
+ * @customElement('my-element')
25
+ * class MyComponent extends Component {
26
+ * // Regular AppRun component code
27
+ * }
28
+ *
29
+ * // Use in HTML
30
+ * <my-element name="value"></my-element>
31
+ * ```
32
+ */
1
33
  export const customElement = (componentClass, options = {}) => class CustomElement extends HTMLElement {
2
34
  constructor() {
3
35
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"web-component.js","sourceRoot":"","sources":["../src/web-component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-component.js","sourceRoot":"","sources":["../src/web-component.ts"],"names":[],"mappings":"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"}
package/index.html CHANGED
@@ -1,8 +1,8 @@
1
1
  <!doctype html>
2
- <html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>AppRun</title>
7
7
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
8
8
  integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
package/jest.config.js ADDED
@@ -0,0 +1,63 @@
1
+ /** @type {import('jest').Config} */
2
+ module.exports = {
3
+ testEnvironment: "jsdom",
4
+ transformIgnorePatterns: [
5
+ "node_modules/(?!(lit|@lit|lit-html|@lit-labs))"
6
+ ],
7
+ transform: {
8
+ "^.+\\.(t|j)sx?$": ["ts-jest", {
9
+ useESM: true,
10
+ tsconfig: "tsconfig.jest.json",
11
+ diagnostics: {
12
+ warnOnly: true, // Convert type-check errors to warnings during tests
13
+ ignoreCodes: [
14
+ "TS7006", // Parameter implicitly has an 'any' type
15
+ "TS7015", // Element implicitly has an 'any' type because index expression is not of type 'number'
16
+ "TS7031", // Binding element implicitly has an 'any' type
17
+ "TS7053", // Element implicitly has an 'any' type because expression of type can't be used to index type
18
+ "TS2683", // 'this' implicitly has type 'any' because it does not have a type annotation
19
+ "TS2345", // Argument of type is not assignable to parameter of type
20
+ "TS2322", // Type is not assignable to type
21
+ "TS18047", // Object is possibly 'null'
22
+ "TS18048" // Property is possibly 'undefined'
23
+ ]
24
+ }
25
+ }]
26
+ },
27
+ testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
28
+ moduleFileExtensions: [
29
+ "ts",
30
+ "tsx",
31
+ "js",
32
+ "jsx",
33
+ "json",
34
+ "node"
35
+ ],
36
+ preset: "ts-jest/presets/default-esm",
37
+ extensionsToTreatAsEsm: [".ts", ".tsx"],
38
+ testEnvironmentOptions: {
39
+ url: "http://localhost"
40
+ },
41
+ setupFilesAfterEnv: ["<rootDir>/jest.setup.js"],
42
+ moduleNameMapper: {
43
+ "^lit$": "<rootDir>/node_modules/lit/development/index.js",
44
+ "^lit/directive$": "<rootDir>/node_modules/lit/development/directive.js",
45
+ "^lit/directives/(.*)$": "<rootDir>/node_modules/lit/development/directives/$1",
46
+ "^(\\.{1,2}/.*)\\.js$": "$1",
47
+ "^(\\.{1,2}/.*)\\.jsx?$": "$1",
48
+ "^(\\.{1,2}/.*)\\.tsx?$": "$1"
49
+ },
50
+ globals: {
51
+ 'ts-jest': {
52
+ tsconfig: 'tsconfig.jest.json',
53
+ useESM: true,
54
+ isolatedModules: true
55
+ }
56
+ },
57
+ testPathIgnorePatterns: [
58
+ "/node_modules/",
59
+ "/dist/",
60
+ "/coverage/",
61
+ "/esm/"
62
+ ]
63
+ };
package/jest.setup.js ADDED
@@ -0,0 +1,47 @@
1
+ // Add Jest-specific test setup
2
+ global.spyOn = (obj, method) => {
3
+ const spy = jest.spyOn(obj, method);
4
+ spy.calls = {
5
+ allArgs: () => spy.mock.calls,
6
+ all: () => spy.mock.calls.map(args => ({ args })),
7
+ count: () => spy.mock.calls.length,
8
+ first: () => spy.mock.calls[0],
9
+ mostRecent: () => spy.mock.calls[spy.mock.calls.length - 1]
10
+ };
11
+ return spy;
12
+ };
13
+
14
+ // Mock jasmine functionality with Jest equivalents
15
+ global.jasmine = {
16
+ createSpy: (name) => {
17
+ const spy = jest.fn();
18
+ spy.calls = {
19
+ allArgs: () => spy.mock.calls,
20
+ all: () => spy.mock.calls.map(args => ({ args })),
21
+ count: () => spy.mock.calls.length,
22
+ first: () => spy.mock.calls[0],
23
+ mostRecent: () => spy.mock.calls[spy.mock.calls.length - 1]
24
+ };
25
+ spy.and = {
26
+ callThrough: () => spy,
27
+ returnValue: (val) => spy.mockReturnValue(val),
28
+ callFake: (fn) => spy.mockImplementation(fn)
29
+ };
30
+ return spy;
31
+ }
32
+ };
33
+
34
+ // Setup document if it doesn't exist (for JSDOM)
35
+ if (typeof document === 'undefined') {
36
+ global.document = {
37
+ createElement: () => ({
38
+ setAttribute: () => {},
39
+ style: {},
40
+ appendChild: () => {}
41
+ }),
42
+ createComment: () => ({}),
43
+ body: {
44
+ appendChild: () => {}
45
+ }
46
+ };
47
+ }
package/jsx-runtime.js ADDED
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.apprun=t():e.apprun=t()}(this,(()=>(()=>{"use strict";var e={859:(e,t,n)=>{n.d(t,{A:()=>s});let r;const o="undefined"!=typeof window?window:void 0!==n.g?n.g:"undefined"!=typeof self?self:{};o.app&&o._AppRunVersions?r=o.app:(r=new class{constructor(){this._events={}}on(e,t,n={}){this._events[e]=this._events[e]||[],this._events[e].push({fn:t,options:n})}off(e,t){const n=this._events[e]||[];this._events[e]=n.filter((e=>e.fn!==t))}find(e){return this._events[e]}run(e,...t){const n=this.getSubscribers(e,this._events);return console.assert(n&&n.length>0,"No subscriber for event: "+e),n.forEach((n=>{const{fn:r,options:o}=n;return o.delay?this.delay(e,r,t,o):Object.keys(o).length>0?r.apply(this,[...t,o]):r.apply(this,t),!n.options.once})),n.length}once(e,t,n={}){this.on(e,t,Object.assign(Object.assign({},n),{once:!0}))}delay(e,t,n,r){r._t&&clearTimeout(r._t),r._t=setTimeout((()=>{clearTimeout(r._t),Object.keys(r).length>0?t.apply(this,[...n,r]):t.apply(this,n)}),r.delay)}runAsync(e,...t){const n=this.getSubscribers(e,this._events);console.assert(n&&n.length>0,"No subscriber for event: "+e);const r=n.map((e=>{const{fn:n,options:r}=e;return Object.keys(r).length>0?n.apply(this,[...t,r]):n.apply(this,t)}));return Promise.all(r)}query(e,...t){return this.runAsync(e,...t)}getSubscribers(e,t){const n=t[e]||[];return t[e]=n.filter((e=>!e.options.once)),Object.keys(t).filter((t=>t.endsWith("*")&&e.startsWith(t.replace("*","")))).sort(((e,t)=>t.length-e.length)).forEach((r=>n.push(...t[r].map((t=>Object.assign(Object.assign({},t),{options:Object.assign(Object.assign({},t.options),{event:e})})))))),n}},o.app=r,o._AppRunVersions="AppRun-3");const s=r},741:(e,t,n)=>{n.d(t,{A:()=>a});var r=n(859);const o=(e,t)=>(t?e.state[t]:e.state)||"",s=(e,t,n)=>{if(t){const r=e.state||{};r[t]=n,e.setState(r)}else e.setState(n)},i=(e,t)=>{if(Array.isArray(e))return e.map((e=>i(e,t)));{let{type:n,tag:a,props:c,children:l}=e;return a=a||n,l=l||(null==c?void 0:c.children),c&&Object.keys(c).forEach((e=>{e.startsWith("$")&&(((e,t,n,i)=>{if(e.startsWith("$on")){const n=t[e];if(e=e.substring(1),"boolean"==typeof n)t[e]=t=>i.run?i.run(e,t):r.A.run(e,t);else if("string"==typeof n)t[e]=e=>i.run?i.run(n,e):r.A.run(n,e);else if("function"==typeof n)t[e]=e=>i.setState(n(i.state,e));else if(Array.isArray(n)){const[o,...s]=n;"string"==typeof o?t[e]=e=>i.run?i.run(o,...s,e):r.A.run(o,...s,e):"function"==typeof o&&(t[e]=e=>i.setState(o(i.state,...s,e)))}}else if("$bind"===e){const r=t.type||"text",a="string"==typeof t[e]?t[e]:t.name;if("input"===n)switch(r){case"checkbox":t.checked=o(i,a),t.onclick=e=>s(i,a||e.target.name,e.target.checked);break;case"radio":t.checked=o(i,a)===t.value,t.onclick=e=>s(i,a||e.target.name,e.target.value);break;case"number":case"range":t.value=o(i,a),t.oninput=e=>s(i,a||e.target.name,Number(e.target.value));break;default:t.value=o(i,a),t.oninput=e=>s(i,a||e.target.name,e.target.value)}else"select"===n?(t.value=o(i,a),t.onchange=e=>{e.target.multiple||s(i,a||e.target.name,e.target.value)}):"option"===n?(t.selected=o(i,a),t.onclick=e=>s(i,a||e.target.name,e.target.selected)):"textarea"===n&&(t.innerHTML=o(i,a),t.oninput=e=>s(i,a||e.target.name,e.target.value))}else r.A.run("$",{key:e,tag:n,props:t,component:i})})(e,c,a,t),delete c[e])})),l&&i(l,t),e}},a=i},791:(e,t,n)=>{n.d(t,{FK:()=>o,cJ:()=>l,n:()=>a,t_:()=>f});var r=n(741);function o(e,...t){return i(t)}const s="_props";function i(e){const t=[],n=e=>{null!=e&&""!==e&&!1!==e&&t.push("function"==typeof e||"object"==typeof e?e:`${e}`)};return e&&e.forEach((e=>{Array.isArray(e)?e.forEach((e=>n(e))):n(e)})),t}function a(e,t,...n){const r=i(n);if("string"==typeof e)return{tag:e,props:t,children:r};if(Array.isArray(e))return e;if(void 0===e&&n)return r;if(Object.getPrototypeOf(e).__isAppRunComponent)return{tag:e,props:t,children:r};if("function"==typeof e)return e(t,r);throw new Error(`Unknown tag in vdom ${e}`)}const c=new WeakMap,l=(e,t,n={})=>{null!=t&&!1!==t&&function(e,t,n={}){if(null==t||!1===t)return;if(t=y(t,n),!e)return;const r="SVG"===e.nodeName;Array.isArray(t)?p(e,t,r):p(e,[t],r)}("string"==typeof e&&e?document.getElementById(e)||document.querySelector(e):e,t=(0,r.A)(t,n),n)};function u(e,t,n){3!==t._op&&(n=n||"svg"===t.tag,function(e,t){const n=e.nodeName,r=`${t.tag||""}`;return n.toUpperCase()===r.toUpperCase()}(e,t)?(!(2&t._op)&&p(e,t.children,n),!(1&t._op)&&g(e,t.props,n)):e.parentNode.replaceChild(h(t,n),e))}function p(e,t,n){var r,o;const s=(null===(r=e.childNodes)||void 0===r?void 0:r.length)||0,i=(null==t?void 0:t.length)||0,a=Math.min(s,i);for(let r=0;r<a;r++){const o=t[r];if(3===o._op)continue;const s=e.childNodes[r];if("string"==typeof o)s.textContent!==o&&(3===s.nodeType?s.nodeValue=o:e.replaceChild(d(o),s));else if(o instanceof HTMLElement||o instanceof SVGElement)e.insertBefore(o,s);else{const t=o.props&&o.props.key;if(t)if(s.key===t)u(e.childNodes[r],o,n);else{const i=c[t];if(i){const t=i.nextSibling;e.insertBefore(i,s),t?e.insertBefore(s,t):e.appendChild(s),u(e.childNodes[r],o,n)}else e.replaceChild(h(o,n),s)}else u(e.childNodes[r],o,n)}}let l=(null===(o=e.childNodes)||void 0===o?void 0:o.length)||0;for(;l>a;)e.removeChild(e.lastChild),l--;if(i>a){const r=document.createDocumentFragment();for(let e=a;e<t.length;e++)r.appendChild(h(t[e],n));e.appendChild(r)}}const f=e=>{const t=document.createElement("section");return t.insertAdjacentHTML("afterbegin",e),Array.from(t.children)};function d(e){if(0===(null==e?void 0:e.indexOf("_html:"))){const t=document.createElement("div");return t.insertAdjacentHTML("afterbegin",e.substring(6)),t}return document.createTextNode(null!=e?e:"")}function h(e,t){if(e instanceof HTMLElement||e instanceof SVGElement)return e;if("string"==typeof e)return d(e);if(!e.tag||"function"==typeof e.tag)return d(JSON.stringify(e));const n=(t=t||"svg"===e.tag)?document.createElementNS("http://www.w3.org/2000/svg",e.tag):document.createElement(e.tag);return g(n,e.props,t),e.children&&e.children.forEach((e=>n.appendChild(h(e,t)))),n}function g(e,t,n){const r=e[s]||{};t=function(e,t){t.class=t.class||t.className,delete t.className;const n={};return e&&Object.keys(e).forEach((e=>n[e]=null)),t&&Object.keys(t).forEach((e=>n[e]=t[e])),n}(r,t||{}),e[s]=t;for(const r in t){const o=t[r];if(r.startsWith("data-")){const t=r.substring(5).replace(/-(\w)/g,(e=>e[1].toUpperCase()));e.dataset[t]!==o&&(o||""===o?e.dataset[t]=o:delete e.dataset[t])}else if("style"===r)if(e.style.cssText&&(e.style.cssText=""),"string"==typeof o)e.style.cssText=o;else for(const t in o)e.style[t]!==o[t]&&(e.style[t]=o[t]);else if(r.startsWith("xlink")){const t=r.replace("xlink","").toLowerCase();null==o||!1===o?e.removeAttributeNS("http://www.w3.org/1999/xlink",t):e.setAttributeNS("http://www.w3.org/1999/xlink",t,o)}else r.startsWith("on")?o&&"function"!=typeof o?"string"==typeof o&&(o?e.setAttribute(r,o):e.removeAttribute(r)):e[r]=o:/^id$|^class$|^list$|^readonly$|^contenteditable$|^role|-|^for$/g.test(r)||n?e.getAttribute(r)!==o&&(o?e.setAttribute(r,o):e.removeAttribute(r)):e[r]!==o&&(e[r]=o);"key"===r&&o&&(c[o]=e)}t&&"function"==typeof t.ref&&window.requestAnimationFrame((()=>t.ref(e)))}function y(e,t,n=0){var r;if("string"==typeof e)return e;if(Array.isArray(e))return e.map((e=>y(e,t,n++)));let o=e;if(e&&"function"==typeof e.tag&&Object.getPrototypeOf(e.tag).__isAppRunComponent&&(o=function(e,t,n){const{tag:r,props:o,children:s}=e;let i=`_${n}`,a=o&&o.id;a?i=a:a=`_${n}${Date.now()}`;let c="section";o&&o.as&&(c=o.as,delete o.as),t.__componentCache||(t.__componentCache={});let l=t.__componentCache[i];if(l&&l instanceof r&&l.element)l.renderState(l.state);else{const e=document.createElement(c);l=t.__componentCache[i]=new r(Object.assign(Object.assign({},o),{children:s})).mount(e,{render:!0})}if(l.mounted){const e=l.mounted(o,s,l.state);void 0!==e&&l.setState(e)}return g(l.element,o,!1),l.element}(e,t,n)),o&&Array.isArray(o.children)){const e=null===(r=o.props)||void 0===r?void 0:r._component;if(e){let t=0;o.children=o.children.map((n=>y(n,e,t++)))}else o.children=o.children.map((e=>y(e,t,n++)))}return o}}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,n),s.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};n.r(r),n.d(r,{Fragment:()=>o.FK,createElement:()=>o.n,jsx:()=>o.n,jsxs:()=>o.n,render:()=>o.cJ,safeHTML:()=>o.t_});var o=n(791);return r})()));
2
+ //# sourceMappingURL=jsx-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"./jsx-runtime.js","mappings":"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","sources":["webpack://apprun/webpack/universalModuleDefinition","webpack://apprun/./src/app.ts","webpack://apprun/./src/directive.ts","webpack://apprun/./src/vdom-my.ts","webpack://apprun/webpack/bootstrap","webpack://apprun/webpack/runtime/define property getters","webpack://apprun/webpack/runtime/global","webpack://apprun/webpack/runtime/hasOwnProperty shorthand","webpack://apprun/webpack/runtime/make namespace object"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"apprun\"] = factory();\n\telse\n\t\troot[\"apprun\"] = factory();\n})(this, () => {\nreturn ","/**\n * Core AppRun application class and singleton instance\n *\n * This file provides:\n * 1. App class - The core event system implementation with pub/sub capabilities\n * - on(): Subscribe to events\n * - off(): Unsubscribe from events\n * - run(): Publish events synchronously\n * - runAsync(): Publish events asynchronously\n * - query(): Alias for runAsync\n *\n * 2. Default app singleton - Global event bus instance\n * - Created once and reused across the application\n * - Stored in global scope (window/global)\n * - Version tracked to prevent duplicate instances\n *\n * Usage:\n * ```ts\n * // Subscribe to events\n * app.on('event-name', (state, ...args) => {\n * // Handle event\n * });\n *\n * // Publish events\n * app.run('event-name', ...args);\n * ```\n */\n\nimport { EventOptions} from './types'\n\nexport class App {\n\n _events: { [key: string]: Array<{ fn: (...args: any[]) => any, options: EventOptions }> };\n\n public start: any;\n public h: any;\n public createElement: any;\n public render: any;\n public Fragment: any;\n public webComponent: any;\n public safeHTML: any;\n public use_render: any;\n public use_react: any;\n public route: any;\n public use_prettyLink: () => void;\n\n constructor() {\n this._events = {} as { [key: string]: Array<{ fn: (...args: any[]) => any, options: EventOptions }> };\n }\n\n on(name: string, fn: (...args: any[]) => any, options: EventOptions = {}): void {\n this._events[name] = this._events[name] || [];\n this._events[name].push({ fn, options });\n }\n\n off(name: string, fn: (...args: any[]) => any): void {\n const subscribers = this._events[name] || [];\n\n this._events[name] = subscribers.filter((sub) => sub.fn !== fn);\n }\n\n find(name: string): any {\n return this._events[name];\n }\n\n run(name: string, ...args: any[]): number {\n const subscribers = this.getSubscribers(name, this._events);\n console.assert(subscribers && subscribers.length > 0, 'No subscriber for event: ' + name);\n subscribers.forEach((sub) => {\n const { fn, options } = sub;\n if (options.delay) {\n this.delay(name, fn, args, options);\n } else {\n Object.keys(options).length > 0 ? fn.apply(this, [...args, options]) : fn.apply(this, args);\n }\n return !sub.options.once;\n });\n\n return subscribers.length;\n }\n\n once(name: string, fn: (...args: any[]) => any, options: EventOptions = {}): void {\n this.on(name, fn, { ...options, once: true });\n }\n\n private delay(name: string, fn: (...args: any[]) => any, args: any[], options: EventOptions): void {\n if (options._t) clearTimeout(options._t);\n options._t = setTimeout(() => {\n clearTimeout(options._t);\n Object.keys(options).length > 0 ? fn.apply(this, [...args, options]) : fn.apply(this, args);\n }, options.delay);\n }\n\n runAsync(name: string, ...args: any[]): Promise<any[]> {\n const subscribers = this.getSubscribers(name, this._events);\n console.assert(subscribers && subscribers.length > 0, 'No subscriber for event: ' + name);\n const promises = subscribers.map(sub => {\n const { fn, options } = sub;\n return Object.keys(options).length > 0 ? fn.apply(this, [...args, options]) : fn.apply(this, args);\n });\n return Promise.all(promises);\n }\n\n query(name: string, ...args: any[]): Promise<any[]> {\n return this.runAsync(name, ...args);\n }\n\n private getSubscribers(name: string, events: { [key: string]: Array<{ fn: (...args: any[]) => any, options: EventOptions }> }): Array<{ fn: (...args: any[]) => any, options: EventOptions }> {\n const subscribers = events[name] || [];\n\n // Update the list of subscribers by pulling out those which will run once.\n // We must do this update prior to running any of the events in case they\n // cause additional events to be turned off or on.\n events[name] = subscribers.filter((sub) => {\n return !sub.options.once;\n });\n Object.keys(events).filter(evt => evt.endsWith('*') && name.startsWith(evt.replace('*', '')))\n .sort((a, b) => b.length - a.length)\n .forEach(evt => subscribers.push(...events[evt].map(sub => ({\n ...sub,\n options: { ...sub.options, event: name }\n }))));\n return subscribers;\n }\n}\n\nconst AppRunVersions = 'AppRun-3';\nlet _app: App;\nconst root = (typeof window !== 'undefined' ? window :\n typeof global !== 'undefined' ? global :\n typeof self !== 'undefined' ? self : {}) as any;\n\nif (root.app && root._AppRunVersions) {\n _app = root.app;\n} else {\n _app = new App();\n root.app = _app;\n root._AppRunVersions = AppRunVersions;\n}\nexport default _app;\n","/**\n * Component Directives Implementation\n * \n * This file provides built-in directives for components:\n * 1. Event Binding\n * - $on: Bind DOM events to component events\n * - Supports event delegation and parameters\n * - Handles function, string, and array event handlers\n * \n * 2. Two-way Data Binding\n * - $bind: Sync form elements with component state\n * - Handles input types: text, checkbox, radio, select\n * - Automatic value type conversion\n * - Support for complex property paths\n * \n * 3. Custom Directives\n * - Extensible directive system\n * - Processes virtual DOM during rendering\n * - Supports custom attribute directives\n * \n * Usage:\n * ```tsx\n * // Event binding\n * <button $onclick=\"event-name\">Click</button>\n * <input $oninput={e => setState(e.target.value)} />\n * \n * // Two-way binding\n * <input $bind=\"state.property\" />\n * <select $bind=\"selected\">...</select>\n * ```\n */\n\nimport app from './app';\n\nconst getStateValue = (component, name) => {\n return (name ? component['state'][name] : component['state']) || '';\n}\n\nconst setStateValue = (component, name, value) => {\n if (name) {\n const state = component['state'] || {};\n state[name] = value;\n component.setState(state);\n } else {\n component.setState(value);\n }\n}\n\nconst apply_directive = (key: string, props: {}, tag, component) => {\n if (key.startsWith('$on')) {\n const event = props[key];\n key = key.substring(1)\n if (typeof event === 'boolean') {\n props[key] = e => component.run ? component.run(key, e) : app.run(key, e);\n } else if (typeof event === 'string') {\n props[key] = e => component.run ? component.run(event, e) : app.run(event, e);\n } else if (typeof event === 'function') {\n props[key] = e => component.setState(event(component.state, e));\n } else if (Array.isArray(event)) {\n const [handler, ...p] = event;\n if (typeof handler === 'string') {\n props[key] = e => component.run ? component.run(handler, ...p, e) : app.run(handler, ...p, e);\n } else if (typeof handler === 'function') {\n props[key] = e => component.setState(handler(component.state, ...p, e));\n }\n }\n\n } else if (key === '$bind') {\n const type = props['type'] || 'text';\n const name = typeof props[key] === 'string' ? props[key] : props['name'];\n if (tag === 'input') {\n switch (type) {\n case 'checkbox':\n props['checked'] = getStateValue(component, name);\n props['onclick'] = e => setStateValue(component, name || e.target.name, e.target.checked);\n break;\n case 'radio':\n props['checked'] = getStateValue(component, name) === props['value'];\n props['onclick'] = e => setStateValue(component, name || e.target.name, e.target.value);\n break;\n case 'number':\n case 'range':\n props['value'] = getStateValue(component, name);\n props['oninput'] = e => setStateValue(component, name || e.target.name, Number(e.target.value));\n break;\n default:\n props['value'] = getStateValue(component, name);\n props['oninput'] = e => setStateValue(component, name || e.target.name, e.target.value);\n }\n } else if (tag === 'select') {\n props['value'] = getStateValue(component, name);\n props['onchange'] = e => {\n if (!e.target.multiple) { // multiple selection use $bind on option\n setStateValue(component, name || e.target.name, e.target.value);\n }\n }\n } else if (tag === 'option') {\n props['selected'] = getStateValue(component, name);\n props['onclick'] = e => setStateValue(component, name || e.target.name, e.target.selected);\n } else if (tag === 'textarea') {\n props['innerHTML'] = getStateValue(component, name);\n props['oninput'] = e => setStateValue(component, name || e.target.name, e.target.value);\n }\n } else {\n app.run('$', { key, tag, props, component });\n }\n}\n\nconst directive = (vdom, component) => {\n if (Array.isArray(vdom)) {\n return vdom.map(element => directive(element, component));\n } else {\n let { type, tag, props, children } = vdom;\n tag = tag || type;\n children = children || props?.children;\n if (props) Object.keys(props).forEach(key => {\n if (key.startsWith('$')) {\n apply_directive(key, props, tag, component);\n delete props[key];\n }\n });\n if (children) directive(children, component);\n return vdom;\n }\n}\n\nexport default directive;\n","import { VDOM, VNode } from './types';\nimport directive from './directive';\nexport type Element = any; //HTMLElement | SVGSVGElement | SVGElement;\n\nexport function Fragment(props, ...children): any[] {\n return collect(children);\n}\n\nconst ATTR_PROPS = '_props';\n\nfunction collect(children) {\n const ch = [];\n const push = (c) => {\n if (c !== null && c !== undefined && c !== '' && c !== false) {\n ch.push((typeof c === 'function' || typeof c === 'object') ? c : `${c}`);\n }\n }\n children && children.forEach(c => {\n if (Array.isArray(c)) {\n c.forEach(i => push(i));\n } else {\n push(c);\n }\n });\n return ch;\n}\n\nexport function createElement(tag: string | Function | [], props?: {}, ...children) {\n const ch = collect(children);\n if (typeof tag === 'string') return { tag, props, children: ch };\n else if (Array.isArray(tag)) return tag; // JSX fragments - babel\n else if (tag === undefined && children) return ch; // JSX fragments - typescript\n else if (Object.getPrototypeOf(tag).__isAppRunComponent) return { tag, props, children: ch } // createComponent(tag, { ...props, children });\n else if (typeof tag === 'function') return tag(props, ch);\n else throw new Error(`Unknown tag in vdom ${tag}`);\n};\n\nconst keyCache = new WeakMap();\n\nexport const updateElement = (element: Element | string, nodes: VDOM, component = {}) => {\n // tslint:disable-next-line\n if (nodes == null || nodes === false) return;\n const el = (typeof element === 'string' && element) ?\n document.getElementById(element) || document.querySelector(element) : element;\n nodes = directive(nodes, component);\n render(el, nodes, component);\n}\n\nfunction render(element: Element, nodes: VDOM, parent = {}) {\n // tslint:disable-next-line\n if (nodes == null || nodes === false) return;\n nodes = createComponent(nodes, parent);\n if (!element) return;\n const isSvg = element.nodeName === \"SVG\";\n if (Array.isArray(nodes)) {\n updateChildren(element, nodes, isSvg);\n } else {\n updateChildren(element, [nodes], isSvg);\n }\n}\n\nfunction same(el: Element, node: VNode) {\n // if (!el || !node) return false;\n const key1 = el.nodeName;\n const key2 = `${node.tag || ''}`;\n return key1.toUpperCase() === key2.toUpperCase();\n}\n\nfunction update(element: Element, node: VNode, isSvg: boolean) {\n if (node['_op'] === 3) return;\n // console.assert(!!element);\n isSvg = isSvg || node.tag === \"svg\";\n if (!same(element, node)) {\n element.parentNode.replaceChild(create(node, isSvg), element);\n return;\n }\n !(node['_op'] & 2) && updateChildren(element, node.children, isSvg);\n !(node['_op'] & 1) && updateProps(element, node.props, isSvg);\n}\n\nfunction updateChildren(element, children, isSvg: boolean) {\n const old_len = element.childNodes?.length || 0;\n const new_len = children?.length || 0;\n const len = Math.min(old_len, new_len);\n for (let i = 0; i < len; i++) {\n const child = children[i];\n if (child['_op'] === 3) continue;\n const el = element.childNodes[i];\n if (typeof child === 'string') {\n if (el.textContent !== child) {\n if (el.nodeType === 3) {\n el.nodeValue = child\n } else {\n element.replaceChild(createText(child), el);\n }\n }\n } else if (child instanceof HTMLElement || child instanceof SVGElement) {\n element.insertBefore(child, el);\n } else {\n const key = child.props && child.props['key'];\n if (key) {\n if (el.key === key) {\n update(element.childNodes[i], child, isSvg);\n } else {\n // console.log(el.key, key);\n const old = keyCache[key];\n if (old) {\n const temp = old.nextSibling;\n element.insertBefore(old, el);\n temp ? element.insertBefore(el, temp) : element.appendChild(el);\n update(element.childNodes[i], child, isSvg);\n } else {\n element.replaceChild(create(child, isSvg), el);\n }\n }\n } else {\n update(element.childNodes[i], child, isSvg);\n }\n }\n }\n\n let n = element.childNodes?.length || 0;\n while (n > len) {\n element.removeChild(element.lastChild);\n n--;\n }\n\n if (new_len > len) {\n const d = document.createDocumentFragment();\n for (let i = len; i < children.length; i++) {\n d.appendChild(create(children[i], isSvg));\n }\n element.appendChild(d);\n }\n}\n\nexport const safeHTML = (html: string) => {\n const div = document.createElement('section');\n div.insertAdjacentHTML('afterbegin', html)\n return Array.from(div.children);\n}\n\nfunction createText(node) {\n if (node?.indexOf('_html:') === 0) { // ?\n const div = document.createElement('div');\n div.insertAdjacentHTML('afterbegin', node.substring(6))\n return div;\n } else {\n return document.createTextNode(node??'');\n }\n}\n\nfunction create(node: VNode | string | HTMLElement | SVGElement, isSvg: boolean): Element {\n // console.assert(node !== null && node !== undefined);\n if ((node instanceof HTMLElement) || (node instanceof SVGElement)) return node;\n if (typeof node === \"string\") return createText(node);\n if (!node.tag || (typeof node.tag === 'function')) return createText(JSON.stringify(node));\n isSvg = isSvg || node.tag === \"svg\";\n const element = isSvg\n ? document.createElementNS(\"http://www.w3.org/2000/svg\", node.tag)\n : document.createElement(node.tag);\n\n updateProps(element, node.props, isSvg);\n if (node.children) node.children.forEach(child => element.appendChild(create(child, isSvg)));\n return element\n}\n\nfunction mergeProps(oldProps: {}, newProps: {}): {} {\n newProps['class'] = newProps['class'] || newProps['className'];\n delete newProps['className'];\n const props = {};\n if (oldProps) Object.keys(oldProps).forEach(p => props[p] = null);\n if (newProps) Object.keys(newProps).forEach(p => props[p] = newProps[p]);\n return props;\n}\n\nexport function updateProps(element: Element, props: {}, isSvg) {\n // console.assert(!!element);\n const cached = element[ATTR_PROPS] || {};\n props = mergeProps(cached, props || {});\n element[ATTR_PROPS] = props;\n\n for (const name in props) {\n const value = props[name];\n // if (cached[name] === value) continue;\n // console.log('updateProps', name, value);\n if (name.startsWith('data-')) {\n const dname = name.substring(5);\n const cname = dname.replace(/-(\\w)/g, (match) => match[1].toUpperCase());\n if (element.dataset[cname] !== value) {\n if (value || value === \"\") element.dataset[cname] = value;\n else delete element.dataset[cname];\n }\n } else if (name === 'style') {\n if (element.style.cssText) element.style.cssText = '';\n if (typeof value === 'string') element.style.cssText = value;\n else {\n for (const s in value) {\n if (element.style[s] !== value[s]) element.style[s] = value[s];\n }\n }\n } else if (name.startsWith('xlink')) {\n const xname = name.replace('xlink', '').toLowerCase();\n if (value == null || value === false) {\n element.removeAttributeNS('http://www.w3.org/1999/xlink', xname);\n } else {\n element.setAttributeNS('http://www.w3.org/1999/xlink', xname, value);\n }\n } else if (name.startsWith('on')) {\n if (!value || typeof value === 'function') {\n element[name] = value;\n } else if (typeof value === 'string') {\n if (value) element.setAttribute(name, value);\n else element.removeAttribute(name);\n }\n } else if (/^id$|^class$|^list$|^readonly$|^contenteditable$|^role|-|^for$/g.test(name) || isSvg) {\n if (element.getAttribute(name) !== value) {\n if (value) element.setAttribute(name, value);\n else element.removeAttribute(name);\n }\n } else if (element[name] !== value) {\n element[name] = value;\n }\n if (name === 'key' && value) keyCache[value] = element;\n }\n if (props && typeof props['ref'] === 'function') {\n window.requestAnimationFrame(() => props['ref'](element));\n }\n}\n\nfunction render_component(node, parent, idx) {\n const { tag, props, children } = node;\n let key = `_${idx}`;\n let id = props && props['id'];\n if (!id) id = `_${idx}${Date.now()}`;\n else key = id;\n let asTag = 'section';\n if (props && props['as']) {\n asTag = props['as'];\n delete props['as'];\n }\n if (!parent.__componentCache) parent.__componentCache = {};\n let component = parent.__componentCache[key];\n if (!component || !(component instanceof tag) || !component.element) {\n const element = document.createElement(asTag);\n component = parent.__componentCache[key] = new tag({ ...props, children }).mount(element, { render: true });\n } else {\n component.renderState(component.state);\n }\n if (component.mounted) {\n const new_state = component.mounted(props, children, component.state);\n (typeof new_state !== 'undefined') && component.setState(new_state);\n }\n updateProps(component.element, props, false);\n return component.element;\n}\n\nfunction createComponent(node, parent, idx = 0) {\n if (typeof node === 'string') return node;\n if (Array.isArray(node)) return node.map(child => createComponent(child, parent, idx++));\n let vdom = node;\n if (node && typeof node.tag === 'function' && Object.getPrototypeOf(node.tag).__isAppRunComponent) {\n vdom = render_component(node, parent, idx);\n }\n if (vdom && Array.isArray(vdom.children)) {\n const new_parent = vdom.props?._component;\n if (new_parent) {\n let i = 0;\n vdom.children = vdom.children.map(child => createComponent(child, new_parent, i++));\n } else {\n vdom.children = vdom.children.map(child => createComponent(child, parent, idx++));\n }\n }\n return vdom;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["root","factory","exports","module","define","amd","this","_app","window","g","self","app","_AppRunVersions","constructor","_events","on","name","fn","options","push","off","subscribers","filter","sub","find","run","args","getSubscribers","console","assert","length","forEach","delay","Object","keys","apply","once","_t","clearTimeout","setTimeout","runAsync","promises","map","Promise","all","query","events","evt","endsWith","startsWith","replace","sort","a","b","event","getStateValue","component","setStateValue","value","state","setState","directive","vdom","Array","isArray","element","type","tag","props","children","key","substring","e","handler","p","target","checked","Number","multiple","selected","apply_directive","Fragment","collect","ATTR_PROPS","ch","c","i","createElement","undefined","getPrototypeOf","__isAppRunComponent","Error","keyCache","WeakMap","updateElement","nodes","parent","createComponent","isSvg","nodeName","updateChildren","render","document","getElementById","querySelector","update","node","el","key1","key2","toUpperCase","same","updateProps","parentNode","replaceChild","create","old_len","childNodes","new_len","len","Math","min","child","textContent","nodeType","nodeValue","createText","HTMLElement","SVGElement","insertBefore","old","temp","nextSibling","appendChild","n","removeChild","lastChild","d","createDocumentFragment","safeHTML","html","div","insertAdjacentHTML","from","indexOf","createTextNode","JSON","stringify","createElementNS","cached","oldProps","newProps","mergeProps","cname","match","dataset","style","cssText","s","xname","toLowerCase","removeAttributeNS","setAttributeNS","setAttribute","removeAttribute","test","getAttribute","requestAnimationFrame","idx","id","Date","now","asTag","__componentCache","renderState","mount","mounted","new_state","render_component","new_parent","_component","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","o","defineProperty","enumerable","get","globalThis","Function","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apprun",
3
- "version": "3.33.8",
3
+ "version": "3.33.10",
4
4
  "description": "JavaScript library that has Elm inspired architecture, event pub-sub and components",
5
5
  "main": "dist/apprun.js",
6
6
  "module": "esm/apprun.js",
@@ -38,52 +38,25 @@
38
38
  },
39
39
  "homepage": "https://github.com/yysun/apprun#readme",
40
40
  "devDependencies": {
41
- "@rollup/plugin-commonjs": "^21.0.3",
42
- "@rollup/plugin-node-resolve": "^13.1.3",
43
- "@types/jest": "^27.4.1",
44
- "jest": "^27.5.1",
41
+ "@rollup/plugin-commonjs": "^28.0.2",
42
+ "@rollup/plugin-node-resolve": "^16.0.0",
43
+ "@rollup/plugin-terser": "^0.4.4",
44
+ "@types/jest": "^29.5.14",
45
+ "jest": "^29.7.0",
46
+ "jest-environment-jsdom": "^29.7.0",
45
47
  "json-loader": "^0.5.7",
46
- "lit-html": "^2.8.0",
47
- "marked": "^11.0.1",
48
- "rollup": "^2.70.1",
49
- "rollup-plugin-filesize": "^10.0.0",
50
- "rollup-plugin-node-resolve": "^5.2.0",
51
- "rollup-plugin-sourcemaps": "^0.6.3",
52
- "rollup-plugin-terser": "^7.0.2",
53
- "ts-jest": "^27.1.4",
48
+ "lit": "^3.3.0",
49
+ "marked": "^16.0.0",
50
+ "rollup": "^4.29.2",
51
+ "ts-jest": "^29.2.5",
54
52
  "ts-loader": "^9.5.1",
55
- "typescript": "^4.6.3",
56
- "webpack": "^5.89.0",
57
- "webpack-cli": "^5.1.4",
58
- "webpack-dev-server": "^4.15.1"
59
- },
60
- "jest": {
61
- "testEnvironment": "jsdom",
62
- "transformIgnorePatterns": [
63
- "/node_modules/(?!lit-html).+\\.js"
64
- ],
65
- "transform": {
66
- "^.+\\.(t|j)sx?$": "ts-jest"
67
- },
68
- "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
69
- "moduleFileExtensions": [
70
- "ts",
71
- "tsx",
72
- "js",
73
- "jsx",
74
- "json",
75
- "node"
76
- ],
77
- "globals": {
78
- "ts-jest": {
79
- "diagnostics": true,
80
- "tsconfig": "tsconfig.jest.json"
81
- }
82
- },
83
- "testRunner": "jest-jasmine2"
53
+ "typescript": "^5.7.2",
54
+ "webpack": "^5.97.1",
55
+ "webpack-cli": "^6.0.1",
56
+ "webpack-dev-server": "^5.2.0"
84
57
  },
85
58
  "dependencies": {
86
- "commander": "^12.1.0",
59
+ "commander": "^14.0.0",
87
60
  "js-yaml": "^4.1.0"
88
61
  }
89
62
  }
package/react.js CHANGED
@@ -1,20 +1,5 @@
1
- import app from 'apprun';
2
- import React from 'react';
3
- import ReactDOM from 'react-dom/client'
4
1
  import { useState } from 'react';
5
2
 
6
- export const user_react = () => {
7
- app.h = app.createElement = React.createElement;
8
- app.Fragment = React.Fragment;
9
- app.render = (el, vdom) => ReactDOM.render(vdom, el);
10
- if (React.version && React.version.startsWith('18')) {
11
- app.render = (el, vdom) => {
12
- if (!el || !vdom) return;
13
- if (!el._root) el._root = ReactDOM.createRoot(el);
14
- el._root.render(vdom);
15
- }
16
- }
17
- }
18
3
  const toReact = (componentClass) => {
19
4
  const component = new componentClass().mount();
20
5
  const { state, view } = component;
package/rollup.config.js CHANGED
@@ -1,24 +1,41 @@
1
- import { terser } from 'rollup-plugin-terser';
2
- import sourcemaps from 'rollup-plugin-sourcemaps';
3
- import resolve from '@rollup/plugin-node-resolve';
4
- import commonjs from '@rollup/plugin-commonjs';
1
+ /**
2
+ * Rollup Configuration
3
+ *
4
+ * This configuration builds AppRun's ESM bundles with the following features:
5
+ * - Minification (controlled by MINIFY env var, defaults to true)
6
+ * - Sourcemaps (enabled by default)
7
+ * - Property mangling for properties starting with '__'
8
+ *
9
+ * Usage:
10
+ * - Default build (minified): rollup -c
11
+ * - Unminified build: MINIFY=false rollup -c
12
+ */
5
13
 
6
- const plugins = [
14
+ const terser = require('@rollup/plugin-terser');
15
+ const resolve = require('@rollup/plugin-node-resolve');
16
+ const commonjs = require('@rollup/plugin-commonjs');
17
+
18
+ // Control minification via environment variable
19
+ const minify = process.env.MINIFY !== 'false';
20
+
21
+ const plugins = minify ? [
7
22
  resolve(),
8
23
  commonjs(),
9
24
  terser({
10
- warnings: true,
11
25
  module: true,
26
+ sourceMap: true, // Enable sourcemap support in terser
12
27
  mangle: {
13
28
  properties: {
14
29
  regex: /^__/,
15
30
  },
16
31
  },
17
- }),
18
- sourcemaps()
32
+ })
33
+ ] : [
34
+ resolve(),
35
+ commonjs()
19
36
  ];
20
37
 
21
- export default [{
38
+ module.exports = [{
22
39
  input: 'esm/apprun.js',
23
40
  output: {
24
41
  file: 'dist/apprun.esm.js',
@@ -42,4 +59,4 @@ export default [{
42
59
  sourcemap: true
43
60
  },
44
61
  plugins
45
- }]
62
+ }]
package/src/app.ts CHANGED
@@ -1,28 +1,59 @@
1
+ /**
2
+ * Core AppRun application class and singleton instance
3
+ *
4
+ * This file provides:
5
+ * 1. App class - The core event system implementation with pub/sub capabilities
6
+ * - on(): Subscribe to events
7
+ * - off(): Unsubscribe from events
8
+ * - run(): Publish events synchronously
9
+ * - runAsync(): Publish events asynchronously
10
+ * - query(): Alias for runAsync
11
+ *
12
+ * 2. Default app singleton - Global event bus instance
13
+ * - Created once and reused across the application
14
+ * - Stored in global scope (window/global)
15
+ * - Version tracked to prevent duplicate instances
16
+ *
17
+ * Usage:
18
+ * ```ts
19
+ * // Subscribe to events
20
+ * app.on('event-name', (state, ...args) => {
21
+ * // Handle event
22
+ * });
23
+ *
24
+ * // Publish events
25
+ * app.run('event-name', ...args);
26
+ * ```
27
+ */
28
+
1
29
  import { EventOptions} from './types'
30
+
2
31
  export class App {
3
32
 
4
- _events: Object;
33
+ _events: { [key: string]: Array<{ fn: (...args: any[]) => any, options: EventOptions }> };
5
34
 
6
- public start;
7
- public h;
8
- public createElement;
9
- public render;
10
- public Fragment;
11
- public webComponent;
12
- public safeHTML;
13
- public use_render;
14
- public use_react;
35
+ public start: any;
36
+ public h: any;
37
+ public createElement: any;
38
+ public render: any;
39
+ public Fragment: any;
40
+ public webComponent: any;
41
+ public safeHTML: any;
42
+ public use_render: any;
43
+ public use_react: any;
44
+ public route: any;
45
+ public use_prettyLink: () => void;
15
46
 
16
47
  constructor() {
17
- this._events = {};
48
+ this._events = {} as { [key: string]: Array<{ fn: (...args: any[]) => any, options: EventOptions }> };
18
49
  }
19
50
 
20
- on(name: string, fn: (...args) => void, options: EventOptions = {}): void {
51
+ on(name: string, fn: (...args: any[]) => any, options: EventOptions = {}): void {
21
52
  this._events[name] = this._events[name] || [];
22
53
  this._events[name].push({ fn, options });
23
54
  }
24
55
 
25
- off(name: string, fn: (...args) => void): void {
56
+ off(name: string, fn: (...args: any[]) => any): void {
26
57
  const subscribers = this._events[name] || [];
27
58
 
28
59
  this._events[name] = subscribers.filter((sub) => sub.fn !== fn);
@@ -32,7 +63,7 @@ export class App {
32
63
  return this._events[name];
33
64
  }
34
65
 
35
- run(name: string, ...args): number {
66
+ run(name: string, ...args: any[]): number {
36
67
  const subscribers = this.getSubscribers(name, this._events);
37
68
  console.assert(subscribers && subscribers.length > 0, 'No subscriber for event: ' + name);
38
69
  subscribers.forEach((sub) => {
@@ -48,11 +79,11 @@ export class App {
48
79
  return subscribers.length;
49
80
  }
50
81
 
51
- once(name: string, fn, options: EventOptions = {}): void {
82
+ once(name: string, fn: (...args: any[]) => any, options: EventOptions = {}): void {
52
83
  this.on(name, fn, { ...options, once: true });
53
84
  }
54
85
 
55
- private delay(name, fn, args, options): void {
86
+ private delay(name: string, fn: (...args: any[]) => any, args: any[], options: EventOptions): void {
56
87
  if (options._t) clearTimeout(options._t);
57
88
  options._t = setTimeout(() => {
58
89
  clearTimeout(options._t);
@@ -60,7 +91,7 @@ export class App {
60
91
  }, options.delay);
61
92
  }
62
93
 
63
- runAsync(name: string, ...args): Promise<any[]> {
94
+ runAsync(name: string, ...args: any[]): Promise<any[]> {
64
95
  const subscribers = this.getSubscribers(name, this._events);
65
96
  console.assert(subscribers && subscribers.length > 0, 'No subscriber for event: ' + name);
66
97
  const promises = subscribers.map(sub => {
@@ -70,11 +101,11 @@ export class App {
70
101
  return Promise.all(promises);
71
102
  }
72
103
 
73
- query(name: string, ...args): Promise<any[]> {
104
+ query(name: string, ...args: any[]): Promise<any[]> {
74
105
  return this.runAsync(name, ...args);
75
106
  }
76
107
 
77
- private getSubscribers(name: string, events) {
108
+ private getSubscribers(name: string, events: { [key: string]: Array<{ fn: (...args: any[]) => any, options: EventOptions }> }): Array<{ fn: (...args: any[]) => any, options: EventOptions }> {
78
109
  const subscribers = events[name] || [];
79
110
 
80
111
  // Update the list of subscribers by pulling out those which will run once.
@@ -94,14 +125,16 @@ export class App {
94
125
  }
95
126
 
96
127
  const AppRunVersions = 'AppRun-3';
97
- let app: App;
98
- const root = (typeof self === 'object' && self.self === self && self) ||
99
- (typeof global === 'object' && global.global === global && global)
100
- if (root['app'] && root['_AppRunVersions']) {
101
- app = root['app'];
128
+ let _app: App;
129
+ const root = (typeof window !== 'undefined' ? window :
130
+ typeof global !== 'undefined' ? global :
131
+ typeof self !== 'undefined' ? self : {}) as any;
132
+
133
+ if (root.app && root._AppRunVersions) {
134
+ _app = root.app;
102
135
  } else {
103
- app = new App();
104
- root['app'] = app;
105
- root['_AppRunVersions'] = AppRunVersions;
136
+ _app = new App();
137
+ root.app = _app;
138
+ root._AppRunVersions = AppRunVersions;
106
139
  }
107
- export default app;
140
+ export default _app;