peryl 1.5.2 → 1.5.4
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 +31 -17
- package/demo/hsml-app-form-validation_demo.html +1 -0
- package/demo/hsml-app-form-validation_demo.ts +22 -23
- package/demo/hsml-app-form_demo.html +1 -0
- package/demo/hsml-app-form_demo.ts +24 -20
- package/demo/hsml-app-test_demo.ts +36 -41
- package/demo/hsml-app-tictactoe_demo.ts +17 -16
- package/demo/hsml-app_demo.html +1 -0
- package/demo/hsml-app_demo.ts +16 -16
- package/demo/hsml-appel_demo.html +7 -0
- package/demo/hsml-appel_demo.ts +47 -27
- package/demo/hsml-appi_demo.ts +15 -22
- package/demo/hsml_demo.ts +27 -22
- package/demo/js/hsml-app-js-happi_demo.html +28 -21
- package/demo/js/hsml-app-js_demo.html +15 -17
- package/dist/browser-esmodule/encode.js.map +1 -1
- package/dist/browser-esmodule/hsml-app.js +114 -123
- package/dist/browser-esmodule/hsml-app.js.map +1 -1
- package/dist/browser-esmodule/hsml-convert.js.map +1 -1
- package/dist/browser-esmodule/hsml-dom.js +3 -3
- package/dist/browser-esmodule/hsml-dom.js.map +1 -1
- package/dist/browser-esmodule/hsml-h.js.map +1 -1
- package/dist/browser-esmodule/hsml-html.js +2 -2
- package/dist/browser-esmodule/hsml-html.js.map +1 -1
- package/dist/browser-esmodule/hsml-idom.js +5 -5
- package/dist/browser-esmodule/hsml-idom.js.map +1 -1
- package/dist/browser-esmodule/hsml.js.map +1 -1
- package/dist/browser-esmodule/http.js.map +1 -1
- package/dist/browser-esmodule/index.js +118 -127
- package/dist/browser-esmodule/index.js.map +1 -1
- package/dist/browser-esmodule/router.js.map +1 -1
- package/dist/browser-umd/encode.js +1 -1
- package/dist/browser-umd/encode.js.map +1 -1
- package/dist/browser-umd/hsml-app.js +1 -1
- package/dist/browser-umd/hsml-app.js.map +1 -1
- package/dist/browser-umd/hsml-convert.js.map +1 -1
- package/dist/browser-umd/hsml-dom.js +1 -1
- package/dist/browser-umd/hsml-dom.js.map +1 -1
- package/dist/browser-umd/hsml-h.js.map +1 -1
- package/dist/browser-umd/hsml-html.js +1 -1
- package/dist/browser-umd/hsml-html.js.map +1 -1
- package/dist/browser-umd/hsml-idom.js +1 -1
- package/dist/browser-umd/hsml-idom.js.map +1 -1
- package/dist/browser-umd/hsml.js.map +1 -1
- package/dist/browser-umd/http.js +1 -1
- package/dist/browser-umd/http.js.map +1 -1
- package/dist/browser-umd/index.js +1 -1
- package/dist/browser-umd/index.js.map +1 -1
- package/dist/browser-umd/router.js +1 -1
- package/dist/browser-umd/router.js.map +1 -1
- package/dist/browser-umd/validators-moment.js +1 -1
- package/dist/browser-umd/validators-moment.js.map +1 -1
- package/dist/browser-umd/validators-numeral.js.map +1 -1
- package/dist/demo/encode_demo.ce182166.js.map +1 -1
- package/dist/demo/encode_demo.f40a44eb.js.map +1 -1
- package/dist/demo/hsml-app-form-validation_demo.8e406f15.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.8e406f15.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.9a95cff3.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.9a95cff3.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.c6856b02.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.c6856b02.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.html +1 -1
- package/dist/demo/hsml-app-form_demo.950b2a09.js +2 -0
- package/dist/demo/hsml-app-form_demo.950b2a09.js.map +1 -0
- package/dist/demo/hsml-app-form_demo.ea3af725.js +2 -0
- package/dist/demo/hsml-app-form_demo.ea3af725.js.map +1 -0
- package/dist/demo/hsml-app-form_demo.html +1 -1
- package/dist/demo/hsml-app-test_demo.36a210b8.js +2 -0
- package/dist/demo/hsml-app-test_demo.36a210b8.js.map +1 -0
- package/dist/demo/hsml-app-test_demo.6ab4ea94.js +2 -0
- package/dist/demo/hsml-app-test_demo.6ab4ea94.js.map +1 -0
- package/dist/demo/hsml-app-test_demo.html +1 -1
- package/dist/demo/hsml-app-tictactoe_demo.7a91c368.js +2 -0
- package/dist/demo/hsml-app-tictactoe_demo.7a91c368.js.map +1 -0
- package/dist/demo/hsml-app-tictactoe_demo.97905c2f.js +2 -0
- package/dist/demo/hsml-app-tictactoe_demo.97905c2f.js.map +1 -0
- package/dist/demo/hsml-app-tictactoe_demo.html +1 -1
- package/dist/demo/hsml-app_demo.b5c1d27d.js +2 -0
- package/dist/demo/hsml-app_demo.b5c1d27d.js.map +1 -0
- package/dist/demo/hsml-app_demo.bbebbbcf.js +2 -0
- package/dist/demo/hsml-app_demo.bbebbbcf.js.map +1 -0
- package/dist/demo/hsml-app_demo.html +1 -1
- package/dist/demo/hsml-appel_demo.4d9e135c.js +2 -0
- package/dist/demo/hsml-appel_demo.4d9e135c.js.map +1 -0
- package/dist/demo/hsml-appel_demo.7ddb6fb3.js +2 -0
- package/dist/demo/hsml-appel_demo.7ddb6fb3.js.map +1 -0
- package/dist/demo/hsml-appel_demo.html +1 -1
- package/dist/demo/hsml-appi_demo.e5e28a65.js +2 -0
- package/dist/demo/hsml-appi_demo.e5e28a65.js.map +1 -0
- package/dist/demo/hsml-appi_demo.fef950c1.js +2 -0
- package/dist/demo/hsml-appi_demo.fef950c1.js.map +1 -0
- package/dist/demo/hsml-appi_demo.html +1 -1
- package/dist/demo/hsml-convert_demo.0ea1fa3b.js.map +1 -1
- package/dist/demo/hsml-convert_demo.63e3e7b5.js.map +1 -1
- package/dist/demo/{hsml_demo.ff950ba1.js → hsml_demo.a248689a.js} +2 -2
- package/dist/demo/hsml_demo.a248689a.js.map +1 -0
- package/dist/demo/hsml_demo.eb3b08be.js +2 -0
- package/dist/demo/hsml_demo.eb3b08be.js.map +1 -0
- package/dist/demo/hsml_demo.html +1 -1
- package/dist/demo/http_demo.3e7da3d8.js.map +1 -1
- package/dist/demo/http_demo.8e435f23.js.map +1 -1
- package/dist/demo/i18n_demo.html +1 -1
- package/dist/demo/router_demo.3cfa03aa.js.map +1 -1
- package/dist/demo/router_demo.89ab1681.js.map +1 -1
- package/dist/demo/{validators_demo.252e13a6.js → validators_demo.90ff6001.js} +2 -2
- package/dist/demo/validators_demo.90ff6001.js.map +1 -0
- package/dist/demo/{validators_demo.66893723.js → validators_demo.ef5b2dea.js} +2 -2
- package/dist/demo/validators_demo.ef5b2dea.js.map +1 -0
- package/dist/demo/validators_demo.html +1 -1
- package/dist/encode.js +1 -1
- package/dist/encode.js.map +1 -1
- package/dist/hsml-app.d.ts +63 -42
- package/dist/hsml-app.js +110 -117
- package/dist/hsml-app.js.map +1 -1
- package/dist/hsml-convert.d.ts +3 -3
- package/dist/hsml-convert.js.map +1 -1
- package/dist/hsml-dom.d.ts +2 -2
- package/dist/hsml-dom.js +3 -3
- package/dist/hsml-dom.js.map +1 -1
- package/dist/hsml-h.d.ts +8 -8
- package/dist/hsml-h.js.map +1 -1
- package/dist/hsml-html.d.ts +4 -4
- package/dist/hsml-html.js +2 -2
- package/dist/hsml-html.js.map +1 -1
- package/dist/hsml-idom.d.ts +2 -2
- package/dist/hsml-idom.js +5 -5
- package/dist/hsml-idom.js.map +1 -1
- package/dist/hsml.d.ts +26 -27
- package/dist/hsml.js.map +1 -1
- package/dist/http.js +1 -1
- package/dist/http.js.map +1 -1
- package/dist/router.js +1 -1
- package/dist/router.js.map +1 -1
- package/package.json +8 -8
- package/src/hsml-app.ts +305 -197
- package/src/hsml-convert.ts +8 -8
- package/src/hsml-dom.ts +18 -18
- package/src/hsml-h.ts +10 -10
- package/src/hsml-html.ts +19 -19
- package/src/hsml-idom.ts +25 -25
- package/src/hsml.ts +46 -143
- package/demo/hsml-appc_demo.html +0 -16
- package/demo/hsml-appc_demo.ts +0 -49
- package/dist/demo/hsml-app-form-validation_demo.0b03b743.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.0b03b743.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.d3925067.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.d3925067.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.f757d763.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.f757d763.js.map +0 -1
- package/dist/demo/hsml-app-form_demo.007ffcaa.js +0 -2
- package/dist/demo/hsml-app-form_demo.007ffcaa.js.map +0 -1
- package/dist/demo/hsml-app-form_demo.a034239d.js +0 -2
- package/dist/demo/hsml-app-form_demo.a034239d.js.map +0 -1
- package/dist/demo/hsml-app-test_demo.35c14dc9.js +0 -2
- package/dist/demo/hsml-app-test_demo.35c14dc9.js.map +0 -1
- package/dist/demo/hsml-app-test_demo.3c7e16ae.js +0 -2
- package/dist/demo/hsml-app-test_demo.3c7e16ae.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js +0 -2
- package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js +0 -2
- package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js.map +0 -1
- package/dist/demo/hsml-app_demo.87d83c29.js +0 -2
- package/dist/demo/hsml-app_demo.87d83c29.js.map +0 -1
- package/dist/demo/hsml-app_demo.941a13a6.js +0 -2
- package/dist/demo/hsml-app_demo.941a13a6.js.map +0 -1
- package/dist/demo/hsml-appc_demo.0234ff15.js +0 -2
- package/dist/demo/hsml-appc_demo.0234ff15.js.map +0 -1
- package/dist/demo/hsml-appc_demo.f5783031.js +0 -2
- package/dist/demo/hsml-appc_demo.f5783031.js.map +0 -1
- package/dist/demo/hsml-appc_demo.html +0 -1
- package/dist/demo/hsml-appel_demo.0e8a4d4c.js +0 -2
- package/dist/demo/hsml-appel_demo.0e8a4d4c.js.map +0 -1
- package/dist/demo/hsml-appel_demo.1a5c2c26.js +0 -2
- package/dist/demo/hsml-appel_demo.1a5c2c26.js.map +0 -1
- package/dist/demo/hsml-appi_demo.2c3fb511.js +0 -2
- package/dist/demo/hsml-appi_demo.2c3fb511.js.map +0 -1
- package/dist/demo/hsml-appi_demo.427fdebd.js +0 -2
- package/dist/demo/hsml-appi_demo.427fdebd.js.map +0 -1
- package/dist/demo/hsml_demo.33f28c29.js +0 -2
- package/dist/demo/hsml_demo.33f28c29.js.map +0 -1
- package/dist/demo/hsml_demo.ff950ba1.js.map +0 -1
- package/dist/demo/validators_demo.252e13a6.js.map +0 -1
- package/dist/demo/validators_demo.66893723.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["src/hsml-app.ts","demo/hsml-app_demo.ts"],"sourcesContent":["import { HAttrOnData, HAttrOnDataFnc, HElement, HElements, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst error = console.error;\nconst warn = console.warn;\n\nexport type HState<State> = () => State;\n\nexport type HView<State, HActionType extends string> = (\n state: State\n) => HElements<HActionType>;\n\nexport type HView1<State, HActionType extends string> = (\n state: State\n) => HElement<HActionType>;\n\nexport type HAppActionType =\n | \"happ-init\"\n | \"happ-mount\"\n | \"happ-umount\"\n | \"happ-update\"\n | \"happ-action\"\n | \"happ-attribute\";\n\nexport enum HAppActions {\n init = \"happ-init\",\n mount = \"happ-mount\",\n umount = \"happ-umount\",\n update = \"happ-update\",\n action = \"happ-action\",\n attribute = \"happ-attribute\"\n}\n\nexport interface HAction<HActionType extends string> {\n type: HActionType | HAppActionType | HAppActions;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatchScope =\n | \"element\"\n | \"window\";\n\nexport enum HDispatchScopes {\n element = \"element\",\n window = \"window\"\n}\n\nexport type HDispatch<HActionType extends string> = (\n type: HAction<HActionType>[\"type\"],\n data?: HAction<HActionType>[\"data\"],\n scope?: HDispatchScope | HDispatchScopes\n) => Promise<void>;\n\nexport type HDispatcher<State, HActionType extends string> = (\n // this: HApp<State, HActionType>,\n action: HAction<HActionType>,\n state: State,\n dispatch: HDispatch<HActionType>\n) => Promise<void>;\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"action:\";\nconst msgDispatch = \"dispatch:\";\nconst msgRender = \"render:\";\nconst msgUpdate = \"update:\";\n\nconst HAPP = \"happ\";\n\nexport interface HAppI<State, HActionType extends string> {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element?: Element | string | null;\n debug?: boolean;\n name?: string;\n attributes?: string[];\n}\n\n/**\n * HApp definition\n *\n * @param hAppI HApp definition\n * @returns HApp instance\n */\nexport function happ<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element: Element | string | null;\n debug?: boolean;\n name?: string;\n // attributes?: string[];\n}) {\n return new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n hAppI.element,\n hAppI.debug,\n hAppI.name\n // hAppI!.attributes\n );\n}\n\n// export type Class<T = object> = new (...args: any[]) => T;\n\n// export function happi<State, HActionType extends string>(\n// hAppI: Class<HAppI<State, HActionType>>,\n// element?: Element | string | null,\n// debug? boolean,\n// name?: string,\n// attributes: string[]\n// ) {\n// const hapi = new hAppI();\n// return new HApp<State, HActionType>(\n// hapi.state,\n// hapi.view,\n// hapi.dispatcher,\n// element,\n// debug\n// );\n// }\n\n// HAppEl\n\n/**\n * HApp custom HTML element definition.\n *\n * @param hAppI HApp definition\n */\nexport function happel<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n /** Element suffix name, element name patern is `happ-${name}` */\n name: string;\n /** Element attribute list */\n attributes: string[];\n debug?: boolean;\n}): void {\n customElements.define(\n `${HAPP}-${hAppI.name}`,\n class HAppElement extends HTMLElement {\n static get observedAttributes() {\n return hAppI.attributes;\n }\n\n private _happel: HApp<State, HActionType>;\n\n constructor() {\n super();\n this._happel = new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n undefined,\n hAppI.debug,\n hAppI.name,\n hAppI.attributes\n );\n (this._happel as any).customElement = this;\n }\n\n connectedCallback() {\n // this._happel.mount(this);\n this.attachShadow({ mode: \"open\" });\n this._happel.mount(this.shadowRoot as any);\n }\n\n disconnectedCallback() {\n this._happel.umount();\n }\n\n adoptedCallback() {\n this._happel.update();\n }\n\n attributeChangedCallback(\n attrName: string,\n oldVal: string | null,\n newVal: string | null\n ) {\n this._happel.dispatch(HAppActions.attribute, {\n attrName,\n oldVal,\n newVal,\n });\n }\n }\n );\n}\n\n/**\n * HSML App\n */\nexport class HApp<State, HActionType extends string> implements HHandlerCtx<HActionType> {\n\n readonly state: State;\n readonly view: HView<State, HActionType>;\n readonly dispatcher: HDispatcher<State, HActionType>;\n\n debug: boolean;\n\n readonly name: string;\n readonly attributes: string[];\n\n readonly element?: HTMLElement;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n readonly customElement?: HTMLElement; // happ custom html element\n\n private _updateSched?: number;\n\n // private _onDispatch?: HDispatcher<State>;\n\n private _windowEventListener?: (event: Event) => void;\n\n constructor(\n state: HState<State>,\n view: HView<State, HActionType>,\n dispatcher?: HDispatcher<State, HActionType>,\n element?: Element | string | null,\n debug?: boolean ,\n name?: string,\n attributes?: string[]\n ) {\n this.debug = debug ?? false;\n this.name = name ?? HAPP;\n this.attributes = attributes ?? [];\n this.state = state();\n this.view = view;\n this.dispatcher = dispatcher ?? (async (a) => log(this.name, msgAction, a.type, a.data));\n this._dispatchAction(HAppActions.init, this).then(() => element && this.mount(element));\n }\n\n dispatch: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any,\n scope?: HDispatchScope\n ): Promise<void> => {\n return this._dispatchAction(type, data, undefined, scope);\n }\n\n // onDispatch = (dispatcher: HDispatcher<State>): this => {\n // this._onDispatch = dispatcher;\n // return this;\n // }\n\n private async _dispatchAction(\n type: HActionType | HAppActionType,\n data?: any,\n event?: Event,\n scope?: HDispatchScope\n ): Promise<void> {\n if (this.debug) {\n log(this.name, msgAction, { type, data, event });\n const t0 = performance.now();\n await this._dispatch(type, data, event, scope);\n const t1 = performance.now();\n log(this.name, msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n await this._dispatch(type, data, event, scope);\n }\n }\n\n private async _dispatch(\n type: HActionType | HAppActionType,\n data: any,\n event?: Event,\n scope?: HDispatchScope\n ) {\n try {\n await this.dispatcher(\n { type: type as HActionType, data, event },\n this.state,\n this.dispatch\n );\n this.update();\n scope === \"element\" && this._dispatchElement(type, data);\n scope === \"window\" && this._dispatchWindow(type, data);\n } catch (e) {\n error(this.name, msgDispatch, e);\n }\n }\n\n private _dispatchElement: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any\n ): Promise<void> => {\n this.customElement && elementDispatchCustomEvent(this.customElement, HAppActions.action, { type, data });\n !this.customElement && this.element && elementDispatchCustomEvent(this.element, HAppActions.action, { type, data });\n // this.customElement && elementDispatchCustomEvent(this.customElement, type, data);\n // !this.customElement && this.element && elementDispatchCustomEvent(this.element, type, data);\n // this._onDispatch?.({ type, data, event }, this.state, this.dispatch);\n }\n\n private _dispatchWindow: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any): Promise<void> => {\n window.dispatchEvent(new CustomEvent(HAppActions.action, { detail: { type, data } }));\n }\n\n windowDispatchOn() {\n if (!this._windowEventListener) {\n this._windowEventListener = (event: Event) => {\n const action = (event as CustomEvent).detail as HAction<HActionType>;\n this._dispatchAction(action.type, action.data);\n };\n window.addEventListener(HAppActions.action, this._windowEventListener);\n } else {\n warn(\"windowEventListener olready setted\");\n }\n }\n\n windowDispatchOff() {\n if (this._windowEventListener) {\n window.removeEventListener(HAppActions.action, this._windowEventListener);\n }\n }\n\n render = (): HElements<HActionType> => {\n if (this.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n const t1 = performance.now();\n log(this.name, msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls ?? [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n return hsmls ?? [];\n }\n }\n\n actionCb = (actionType: HActionType, data: HAttrOnData, event: Event): void => {\n data = (data?.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n if (event instanceof CustomEvent) {\n data = event.detail;\n } else {\n data = formData(event);\n }\n }\n this._dispatchAction(actionType, data, event);\n }\n\n private _updateDom<HActionType extends string>(\n el: Element,\n hsml: HElements<HActionType>,\n ctx: HHandlerCtx<HActionType>\n ): void {\n if (this.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(this.name, msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n }\n\n mount = (e: Element | string | null): this => {\n const el = (typeof e === \"string\") ? document.getElementById(e) : e;\n if (el && (el as any)[HAPP]) {\n const a = (el as any)[HAPP] as HApp<State, HActionType>;\n a.umount();\n }\n if (el && !this.element) {\n (this as any).element = el;\n (el as any)[HAPP] = this;\n const hsmls = (this as any).render();\n this._updateDom<HActionType>(el, hsmls, this);\n this._dispatchAction(HAppActions.mount, this.element);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.element) {\n this._dispatchAction(HAppActions.umount, this.element);\n if (this.element.hasAttribute(HAPP)) {\n this.element.removeAttribute(HAPP);\n }\n const aNodes = this.element.querySelectorAll(`[${HAPP}]`);\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).happ as HApp<State, HActionType>;\n a?.umount();\n }\n while (this.element.firstChild /*.hasChildNodes()*/) {\n this.element.removeChild(this.element.firstChild);\n }\n delete (this.element as any).happ;\n (this as any).element = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.element && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.element) {\n const hsmls = this.render();\n this._updateDom<HActionType>(this.element, hsmls, this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement<HActionType> => {\n if (this.element) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.element) {\n (this as any).element = e;\n (e as any).happ = this;\n this._dispatchAction(HAppActions.mount, this.element);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.element ? this.element.outerHTML : \"\";\n }\n\n}\n\nfunction elementDispatchCustomEvent<HActionType extends string>(\n el: HTMLElement,\n type: HActionType,\n data: any\n) {\n el?.dispatchEvent(new CustomEvent(type, { detail: data }));\n (el as any)[`on${type}`]?.(new CustomEvent(type, { detail: data }));\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n let data: { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: iel.checked };\n } else {\n data = iel.checked;\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n","import { HApp, HDispatcher, HState, HView } from \"../src/hsml-app\";\n\n// Actions definition\n// enum Actions {\n// say = \"say\",\n// fetch = \"fetch\"\n// }\n\ntype Actions = \"say\" | \"fetch\";\n\ninterface State {\n message: string;\n json: string;\n}\n\n// App state definition and initialization\nconst state: HState<State> = function () {\n return {\n message: \"\",\n json: \"\"\n };\n};\n\n// Template function, returns HSML markup generated from app state\nconst view: HView<State, Actions> = function (state) {\n return [\n [\"p\", [\n \"Greeting: \", state.message\n ]],\n [\"p\", [\n // On button event \"click\" dispatch Action.say type with data \"Hello\"\n [\"button\", { on: [\"click\", \"say\", \"Hello\"] }, \"Say Hello\"],\n \" \",\n [\"button\", { on: [\"click\", \"say\", \"Hi\"] }, \"Say Hi\"],\n ]],\n [\"p\", [\n [\"button\", { on: [\"click\", \"fetch\"] }, \"Server fetch time\"],\n [\"pre\", state.json]\n ]]\n ];\n};\n\n// Action dispatcher, app logic\nconst dispatcher: HDispatcher<State, Actions> = async function (action, state, dispatch) {\n switch (action.type) {\n\n case \"say\":\n // Change app state message by action data (3. parameter of on click action)\n state.message = action.data;\n break;\n\n case \"fetch\":\n // Server async call\n try {\n const res = await fetch(\"http://date.jsontest.com\");\n const data = await res.json();\n state.json = JSON.stringify(data, null, 4);\n } catch (error) {\n state.json = String(error);\n }\n break;\n }\n};\n\n// Run application\n(window as any).app = new HApp<State, Actions>(state, view, dispatcher, \"app\", true);\n"],"names":["$a85519cc1b20a4af$var$log","console","log","$a85519cc1b20a4af$var$error","error","$a85519cc1b20a4af$var$warn","warn","$a85519cc1b20a4af$export$3dcd9fad60135c2c","HAppActions","$a85519cc1b20a4af$export$3d736e925369e0e4","HDispatchScopes","$a85519cc1b20a4af$var$schedule","window","requestAnimationFrame","callback","setTimeout","$a85519cc1b20a4af$var$unschedule","cancelAnimationFrame","handle","clearTimeout","$a85519cc1b20a4af$var$msgAction","$a85519cc1b20a4af$var$msgDispatch","$a85519cc1b20a4af$var$msgRender","$a85519cc1b20a4af$var$HAPP","$a85519cc1b20a4af$export$eb8950696418f795","hAppI","$a85519cc1b20a4af$export$8cfef5dc37c46888","state","view","dispatcher","element","debug","name","$a85519cc1b20a4af$export$1cfc54b3834d3c50","customElements","define","HTMLElement","observedAttributes","attributes","connectedCallback","this","attachShadow","mode","_happel","mount","shadowRoot","disconnectedCallback","umount","adoptedCallback","update","attributeChangedCallback","attrName","oldVal","newVal","dispatch","attribute","constructor","super","undefined","customElement","_dispatchAction","type","data","event","scope","t0","performance","now","_dispatch","t1","_dispatchElement","_dispatchWindow","e","windowDispatchOn","_windowEventListener","action","detail","addEventListener","windowDispatchOff","removeEventListener","_updateDom","el","hsml","ctx","$8IJ2T","hsmls2idomPatch","refs","$a85519cc1b20a4af$var$__awaiter","$a85519cc1b20a4af$var$elementDispatchCustomEvent","dispatchEvent","CustomEvent","render","hsmls","actionCb","actionType","Function","target","nodeName","preventDefault","els","elements","i","length","d","$a85519cc1b20a4af$var$formInputData","names","Object","keys","value","String","Array","concat","push","filter","$a85519cc1b20a4af$var$formData","document","getElementById","hasAttribute","removeAttribute","aNodes","querySelectorAll","a","happ","firstChild","removeChild","_updateSched","toHsml","skip","toHtml","outerHTML","init","then","_b","_a","call","iel","checked","sel","multiple","values","from","selectedOptions","map","o","tel","bel","app","$a85519cc1b20a4af$exports","HApp","message","json","on","res","fetch","JSON","stringify"],"version":3,"file":"hsml-app_demo.b5c1d27d.js.map"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function t(t,e,n,i){Object.defineProperty(t,e,{get:n,set:i,enumerable:!0,configurable:!0})}var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},i={},s=e.parcelRequirede31;null==s&&((s=function(t){if(t in n)return n[t].exports;if(t in i){var e=i[t];delete i[t];var s={id:t,exports:{}};return n[t]=s,e.call(s.exports,s,s.exports),s.exports}var a=new Error("Cannot find module '"+t+"'");throw a.code="MODULE_NOT_FOUND",a}).register=function(t,e){i[t]=e},e.parcelRequirede31=s);var a={};t(a,"HAppActions",(function(){return l}),(function(t){return l=t})),t(a,"HDispatchScopes",(function(){return p}),(function(t){return p=t})),t(a,"happ",(function(){return g}),(function(t){return g=t})),t(a,"HApp",(function(){return A}),(function(t){return A=t})),t(a,"happel",(function(){return E}),(function(t){return E=t}));var o=s("hrCkK"),c=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{r(i.next(t))}catch(t){a(t)}}function c(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,c)}r((i=i.apply(t,e||[])).next())}))};const r=console.log,h=console.error,u=console.warn;var l,d,p,m;(d=l||(l={})).init="happ-init",d.mount="happ-mount",d.umount="happ-umount",d.update="happ-update",d.action="happ-action",d.attribute="happ-attribute",(m=p||(p={})).element="element",m.window="window";const f=window.requestAnimationFrame||function(t){window.setTimeout(t,1e3/60)},v=window.cancelAnimationFrame||function(t){window.clearTimeout(t)},w="action:",y="dispatch:",b="render:",_="happ";function g(t){return new A(t.state,t.view,t.dispatcher,t.element,t.debug,t.name)}function E(t){customElements.define(`${_}-${t.name}`,class extends HTMLElement{static get observedAttributes(){return t.attributes}connectedCallback(){this.attachShadow({mode:"open"}),this._happel.mount(this.shadowRoot)}disconnectedCallback(){this._happel.umount()}adoptedCallback(){this._happel.update()}attributeChangedCallback(t,e,n){this._happel.dispatch(l.attribute,{attrName:t,oldVal:e,newVal:n})}constructor(){super(),this._happel=new A(t.state,t.view,t.dispatcher,void 0,t.debug,t.name,t.attributes),this._happel.customElement=this}})}class A{_dispatchAction(t,e,n,i){return c(this,void 0,void 0,(function*(){if(this.debug){r(this.name,w,{type:t,data:e,event:n});const s=performance.now();yield this._dispatch(t,e,n,i);const a=performance.now();r(this.name,y,a-s+" ms",this.state)}else yield this._dispatch(t,e,n,i)}))}_dispatch(t,e,n,i){return c(this,void 0,void 0,(function*(){try{yield this.dispatcher({type:t,data:e,event:n},this.state,this.dispatch),this.update(),"element"===i&&this._dispatchElement(t,e),"window"===i&&this._dispatchWindow(t,e)}catch(t){h(this.name,y,t)}}))}windowDispatchOn(){this._windowEventListener?u("windowEventListener olready setted"):(this._windowEventListener=t=>{const e=t.detail;this._dispatchAction(e.type,e.data)},window.addEventListener(l.action,this._windowEventListener))}windowDispatchOff(){this._windowEventListener&&window.removeEventListener(l.action,this._windowEventListener)}_updateDom(t,e,n){if(this.debug){const i=performance.now();(0,o.hsmls2idomPatch)(t,e,n);const s=performance.now();r(this.name,"update:",s-i+" ms",t)}else(0,o.hsmls2idomPatch)(t,e,n)}constructor(t,e,n,i,s,a,o){this.refs={},this.dispatch=(t,e,n)=>c(this,void 0,void 0,(function*(){return this._dispatchAction(t,e,void 0,n)})),this._dispatchElement=(t,e)=>c(this,void 0,void 0,(function*(){this.customElement&&k(this.customElement,l.action,{type:t,data:e}),!this.customElement&&this.element&&k(this.element,l.action,{type:t,data:e})})),this._dispatchWindow=(t,e)=>c(this,void 0,void 0,(function*(){window.dispatchEvent(new CustomEvent(l.action,{detail:{type:t,data:e}}))})),this.render=()=>{if(this.debug){const t=performance.now();let e;try{e=this.view(this.state)}catch(t){h(this.name,b,t)}const n=performance.now();return r(this.name,b,n-t+" ms",e),null!=e?e:[]}{let t;try{t=this.view(this.state)}catch(t){h(this.name,b,t)}return null!=t?t:[]}},this.actionCb=(t,e,n)=>{void 0===(e=(null==e?void 0:e.constructor)===Function?e(n):e)&&n&&(e=n instanceof CustomEvent?n.detail:function(t){const e=t.target;if("FORM"===e.nodeName){t.preventDefault();const n=e.elements,i={};for(let t=0;t<n.length;t++){const e=S(n[t]);if("object"==typeof e){const s=Object.keys(e);if(s.length){const a=s[0],o=e[a];void 0===i[a]?i[a]=o:"string"==typeof i[a]||i[a]instanceof String?i[a]=o instanceof Array?[i[a],...o]:[i[a],o]:i[a]instanceof Array?o instanceof Array?i[a]=i[a].concat(o):i[a].push(o):i[a]=o instanceof Array?[i[a],...o]:[i[a],o],i[a]instanceof Array&&(i[a]=i[a].filter((t=>null!==t)),"radio"===n[t].type&&(i[a]=i[a].length?i[a][0]:null))}}}return i}return S(e)}(n)),this._dispatchAction(t,e,n)},this.mount=t=>{const e="string"==typeof t?document.getElementById(t):t;if(e&&e[_]){e[_].umount()}if(e&&!this.element){this.element=e,e[_]=this;const t=this.render();this._updateDom(e,t,this),this._dispatchAction(l.mount,this.element)}return this},this.umount=()=>{if(this.element){this._dispatchAction(l.umount,this.element),this.element.hasAttribute(_)&&this.element.removeAttribute(_);const t=this.element.querySelectorAll(`[${_}]`);for(let e=0;e<t.length;e++){const n=t[e].happ;null==n||n.umount()}for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);delete this.element.happ,this.element=void 0}return this},this.update=()=>(this.element&&!this._updateSched&&(this._updateSched=f((()=>{if(this.element){const t=this.render();this._updateDom(this.element,t,this)}this._updateSched=void 0}))),this),this.toHsml=()=>{if(this.element){if(!this._updateSched)return["div",{skip:!0}];v(this._updateSched),this._updateSched=void 0}const t=this.render();return t.push((t=>{this.element||(this.element=t,t.happ=this,this._dispatchAction(l.mount,this.element))})),["div",t]},this.toHtml=()=>this.element?this.element.outerHTML:"",this.debug=null!=s&&s,this.name=null!=a?a:_,this.attributes=null!=o?o:[],this.state=t(),this.view=e,this.dispatcher=null!=n?n:t=>c(this,void 0,void 0,(function*(){return r(this.name,w,t.type,t.data)})),this._dispatchAction(l.init,this).then((()=>i&&this.mount(i)))}}function k(t,e,n){var i,s;null==t||t.dispatchEvent(new CustomEvent(e,{detail:n})),null===(s=(i=t)[`on${e}`])||void 0===s||s.call(i,new CustomEvent(e,{detail:n}))}function S(t){let e=null;switch(t.nodeName){case"INPUT":const n=t;switch(n.type){case"text":case"hidden":case"password":case"email":case"number":case"search":case"url":case"tel":case"color":case"date":case"datetime-local":case"month":case"range":case"time":case"week":case"submit":case"button":e=n.name?{[n.name]:n.value}:n.value;break;case"radio":e=n.name?{[n.name]:n.checked?n.value:null}:n.checked?n.value:null;break;case"checkbox":e="on"===n.value?n.name?{[n.name]:n.checked}:n.checked:n.name?{[n.name]:n.checked?String(n.value):null}:n.checked?String(n.value):null}break;case"SELECT":const i=t;if(i.multiple){const t=Array.from(i.selectedOptions).map((t=>t.value));e=i.name?{[i.name]:t}:t}else e=i.name?{[i.name]:i.value}:i.value;break;case"TEXTAREA":const s=t;e=s.name?{[s.name]:s.value}:s.value;break;case"BUTTON":const a=t;e=a.name?{[a.name]:a.value}:a.value}return e}var C=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{r(i.next(t))}catch(t){a(t)}}function c(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,c)}r((i=i.apply(t,e||[])).next())}))};window.app=new(0,a.HApp)((function(){return{message:"",json:""}}),(function(t){return[["p",["Greeting: ",t.message]],["p",[["button",{on:["click","say","Hello"]},"Say Hello"]," ",["button",{on:["click","say","Hi"]},"Say Hi"]]],["p",[["button",{on:["click","fetch"]},"Server fetch time"],["pre",t.json]]]]}),(function(t,e,n){return C(this,void 0,void 0,(function*(){switch(t.type){case"say":e.message=t.data;break;case"fetch":try{const t=yield fetch("http://date.jsontest.com"),n=yield t.json();e.json=JSON.stringify(n,null,4)}catch(t){e.json=String(t)}}}))}),"app",!0);
|
|
2
|
+
//# sourceMappingURL=hsml-app_demo.bbebbbcf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["src/hsml-app.ts","demo/hsml-app_demo.ts"],"sourcesContent":["import { HAttrOnData, HAttrOnDataFnc, HElement, HElements, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst error = console.error;\nconst warn = console.warn;\n\nexport type HState<State> = () => State;\n\nexport type HView<State, HActionType extends string> = (\n state: State\n) => HElements<HActionType>;\n\nexport type HView1<State, HActionType extends string> = (\n state: State\n) => HElement<HActionType>;\n\nexport type HAppActionType =\n | \"happ-init\"\n | \"happ-mount\"\n | \"happ-umount\"\n | \"happ-update\"\n | \"happ-action\"\n | \"happ-attribute\";\n\nexport enum HAppActions {\n init = \"happ-init\",\n mount = \"happ-mount\",\n umount = \"happ-umount\",\n update = \"happ-update\",\n action = \"happ-action\",\n attribute = \"happ-attribute\"\n}\n\nexport interface HAction<HActionType extends string> {\n type: HActionType | HAppActionType | HAppActions;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatchScope =\n | \"element\"\n | \"window\";\n\nexport enum HDispatchScopes {\n element = \"element\",\n window = \"window\"\n}\n\nexport type HDispatch<HActionType extends string> = (\n type: HAction<HActionType>[\"type\"],\n data?: HAction<HActionType>[\"data\"],\n scope?: HDispatchScope | HDispatchScopes\n) => Promise<void>;\n\nexport type HDispatcher<State, HActionType extends string> = (\n // this: HApp<State, HActionType>,\n action: HAction<HActionType>,\n state: State,\n dispatch: HDispatch<HActionType>\n) => Promise<void>;\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"action:\";\nconst msgDispatch = \"dispatch:\";\nconst msgRender = \"render:\";\nconst msgUpdate = \"update:\";\n\nconst HAPP = \"happ\";\n\nexport interface HAppI<State, HActionType extends string> {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element?: Element | string | null;\n debug?: boolean;\n name?: string;\n attributes?: string[];\n}\n\n/**\n * HApp definition\n *\n * @param hAppI HApp definition\n * @returns HApp instance\n */\nexport function happ<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element: Element | string | null;\n debug?: boolean;\n name?: string;\n // attributes?: string[];\n}) {\n return new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n hAppI.element,\n hAppI.debug,\n hAppI.name\n // hAppI!.attributes\n );\n}\n\n// export type Class<T = object> = new (...args: any[]) => T;\n\n// export function happi<State, HActionType extends string>(\n// hAppI: Class<HAppI<State, HActionType>>,\n// element?: Element | string | null,\n// debug? boolean,\n// name?: string,\n// attributes: string[]\n// ) {\n// const hapi = new hAppI();\n// return new HApp<State, HActionType>(\n// hapi.state,\n// hapi.view,\n// hapi.dispatcher,\n// element,\n// debug\n// );\n// }\n\n// HAppEl\n\n/**\n * HApp custom HTML element definition.\n *\n * @param hAppI HApp definition\n */\nexport function happel<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n /** Element suffix name, element name patern is `happ-${name}` */\n name: string;\n /** Element attribute list */\n attributes: string[];\n debug?: boolean;\n}): void {\n customElements.define(\n `${HAPP}-${hAppI.name}`,\n class HAppElement extends HTMLElement {\n static get observedAttributes() {\n return hAppI.attributes;\n }\n\n private _happel: HApp<State, HActionType>;\n\n constructor() {\n super();\n this._happel = new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n undefined,\n hAppI.debug,\n hAppI.name,\n hAppI.attributes\n );\n (this._happel as any).customElement = this;\n }\n\n connectedCallback() {\n // this._happel.mount(this);\n this.attachShadow({ mode: \"open\" });\n this._happel.mount(this.shadowRoot as any);\n }\n\n disconnectedCallback() {\n this._happel.umount();\n }\n\n adoptedCallback() {\n this._happel.update();\n }\n\n attributeChangedCallback(\n attrName: string,\n oldVal: string | null,\n newVal: string | null\n ) {\n this._happel.dispatch(HAppActions.attribute, {\n attrName,\n oldVal,\n newVal,\n });\n }\n }\n );\n}\n\n/**\n * HSML App\n */\nexport class HApp<State, HActionType extends string> implements HHandlerCtx<HActionType> {\n\n readonly state: State;\n readonly view: HView<State, HActionType>;\n readonly dispatcher: HDispatcher<State, HActionType>;\n\n debug: boolean;\n\n readonly name: string;\n readonly attributes: string[];\n\n readonly element?: HTMLElement;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n readonly customElement?: HTMLElement; // happ custom html element\n\n private _updateSched?: number;\n\n // private _onDispatch?: HDispatcher<State>;\n\n private _windowEventListener?: (event: Event) => void;\n\n constructor(\n state: HState<State>,\n view: HView<State, HActionType>,\n dispatcher?: HDispatcher<State, HActionType>,\n element?: Element | string | null,\n debug?: boolean ,\n name?: string,\n attributes?: string[]\n ) {\n this.debug = debug ?? false;\n this.name = name ?? HAPP;\n this.attributes = attributes ?? [];\n this.state = state();\n this.view = view;\n this.dispatcher = dispatcher ?? (async (a) => log(this.name, msgAction, a.type, a.data));\n this._dispatchAction(HAppActions.init, this).then(() => element && this.mount(element));\n }\n\n dispatch: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any,\n scope?: HDispatchScope\n ): Promise<void> => {\n return this._dispatchAction(type, data, undefined, scope);\n }\n\n // onDispatch = (dispatcher: HDispatcher<State>): this => {\n // this._onDispatch = dispatcher;\n // return this;\n // }\n\n private async _dispatchAction(\n type: HActionType | HAppActionType,\n data?: any,\n event?: Event,\n scope?: HDispatchScope\n ): Promise<void> {\n if (this.debug) {\n log(this.name, msgAction, { type, data, event });\n const t0 = performance.now();\n await this._dispatch(type, data, event, scope);\n const t1 = performance.now();\n log(this.name, msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n await this._dispatch(type, data, event, scope);\n }\n }\n\n private async _dispatch(\n type: HActionType | HAppActionType,\n data: any,\n event?: Event,\n scope?: HDispatchScope\n ) {\n try {\n await this.dispatcher(\n { type: type as HActionType, data, event },\n this.state,\n this.dispatch\n );\n this.update();\n scope === \"element\" && this._dispatchElement(type, data);\n scope === \"window\" && this._dispatchWindow(type, data);\n } catch (e) {\n error(this.name, msgDispatch, e);\n }\n }\n\n private _dispatchElement: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any\n ): Promise<void> => {\n this.customElement && elementDispatchCustomEvent(this.customElement, HAppActions.action, { type, data });\n !this.customElement && this.element && elementDispatchCustomEvent(this.element, HAppActions.action, { type, data });\n // this.customElement && elementDispatchCustomEvent(this.customElement, type, data);\n // !this.customElement && this.element && elementDispatchCustomEvent(this.element, type, data);\n // this._onDispatch?.({ type, data, event }, this.state, this.dispatch);\n }\n\n private _dispatchWindow: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any): Promise<void> => {\n window.dispatchEvent(new CustomEvent(HAppActions.action, { detail: { type, data } }));\n }\n\n windowDispatchOn() {\n if (!this._windowEventListener) {\n this._windowEventListener = (event: Event) => {\n const action = (event as CustomEvent).detail as HAction<HActionType>;\n this._dispatchAction(action.type, action.data);\n };\n window.addEventListener(HAppActions.action, this._windowEventListener);\n } else {\n warn(\"windowEventListener olready setted\");\n }\n }\n\n windowDispatchOff() {\n if (this._windowEventListener) {\n window.removeEventListener(HAppActions.action, this._windowEventListener);\n }\n }\n\n render = (): HElements<HActionType> => {\n if (this.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n const t1 = performance.now();\n log(this.name, msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls ?? [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n return hsmls ?? [];\n }\n }\n\n actionCb = (actionType: HActionType, data: HAttrOnData, event: Event): void => {\n data = (data?.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n if (event instanceof CustomEvent) {\n data = event.detail;\n } else {\n data = formData(event);\n }\n }\n this._dispatchAction(actionType, data, event);\n }\n\n private _updateDom<HActionType extends string>(\n el: Element,\n hsml: HElements<HActionType>,\n ctx: HHandlerCtx<HActionType>\n ): void {\n if (this.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(this.name, msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n }\n\n mount = (e: Element | string | null): this => {\n const el = (typeof e === \"string\") ? document.getElementById(e) : e;\n if (el && (el as any)[HAPP]) {\n const a = (el as any)[HAPP] as HApp<State, HActionType>;\n a.umount();\n }\n if (el && !this.element) {\n (this as any).element = el;\n (el as any)[HAPP] = this;\n const hsmls = (this as any).render();\n this._updateDom<HActionType>(el, hsmls, this);\n this._dispatchAction(HAppActions.mount, this.element);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.element) {\n this._dispatchAction(HAppActions.umount, this.element);\n if (this.element.hasAttribute(HAPP)) {\n this.element.removeAttribute(HAPP);\n }\n const aNodes = this.element.querySelectorAll(`[${HAPP}]`);\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).happ as HApp<State, HActionType>;\n a?.umount();\n }\n while (this.element.firstChild /*.hasChildNodes()*/) {\n this.element.removeChild(this.element.firstChild);\n }\n delete (this.element as any).happ;\n (this as any).element = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.element && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.element) {\n const hsmls = this.render();\n this._updateDom<HActionType>(this.element, hsmls, this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement<HActionType> => {\n if (this.element) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.element) {\n (this as any).element = e;\n (e as any).happ = this;\n this._dispatchAction(HAppActions.mount, this.element);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.element ? this.element.outerHTML : \"\";\n }\n\n}\n\nfunction elementDispatchCustomEvent<HActionType extends string>(\n el: HTMLElement,\n type: HActionType,\n data: any\n) {\n el?.dispatchEvent(new CustomEvent(type, { detail: data }));\n (el as any)[`on${type}`]?.(new CustomEvent(type, { detail: data }));\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n let data: { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: iel.checked };\n } else {\n data = iel.checked;\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n","import { HApp, HDispatcher, HState, HView } from \"../src/hsml-app\";\n\n// Actions definition\n// enum Actions {\n// say = \"say\",\n// fetch = \"fetch\"\n// }\n\ntype Actions = \"say\" | \"fetch\";\n\ninterface State {\n message: string;\n json: string;\n}\n\n// App state definition and initialization\nconst state: HState<State> = function () {\n return {\n message: \"\",\n json: \"\"\n };\n};\n\n// Template function, returns HSML markup generated from app state\nconst view: HView<State, Actions> = function (state) {\n return [\n [\"p\", [\n \"Greeting: \", state.message\n ]],\n [\"p\", [\n // On button event \"click\" dispatch Action.say type with data \"Hello\"\n [\"button\", { on: [\"click\", \"say\", \"Hello\"] }, \"Say Hello\"],\n \" \",\n [\"button\", { on: [\"click\", \"say\", \"Hi\"] }, \"Say Hi\"],\n ]],\n [\"p\", [\n [\"button\", { on: [\"click\", \"fetch\"] }, \"Server fetch time\"],\n [\"pre\", state.json]\n ]]\n ];\n};\n\n// Action dispatcher, app logic\nconst dispatcher: HDispatcher<State, Actions> = async function (action, state, dispatch) {\n switch (action.type) {\n\n case \"say\":\n // Change app state message by action data (3. parameter of on click action)\n state.message = action.data;\n break;\n\n case \"fetch\":\n // Server async call\n try {\n const res = await fetch(\"http://date.jsontest.com\");\n const data = await res.json();\n state.json = JSON.stringify(data, null, 4);\n } catch (error) {\n state.json = String(error);\n }\n break;\n }\n};\n\n// Run application\n(window as any).app = new HApp<State, Actions>(state, view, dispatcher, \"app\", true);\n"],"names":["$fe5fa9c04fc86188$var$log","console","log","$fe5fa9c04fc86188$var$error","error","$fe5fa9c04fc86188$var$warn","warn","$fe5fa9c04fc86188$export$3dcd9fad60135c2c","HAppActions","$fe5fa9c04fc86188$export$3d736e925369e0e4","HDispatchScopes","$fe5fa9c04fc86188$var$schedule","window","requestAnimationFrame","callback","setTimeout","$fe5fa9c04fc86188$var$unschedule","cancelAnimationFrame","handle","clearTimeout","$fe5fa9c04fc86188$var$msgAction","$fe5fa9c04fc86188$var$msgDispatch","$fe5fa9c04fc86188$var$msgRender","$fe5fa9c04fc86188$var$HAPP","$fe5fa9c04fc86188$export$eb8950696418f795","hAppI","$fe5fa9c04fc86188$export$8cfef5dc37c46888","state","view","dispatcher","element","debug","name","$fe5fa9c04fc86188$export$1cfc54b3834d3c50","customElements","define","HTMLElement","observedAttributes","attributes","connectedCallback","this","attachShadow","mode","_happel","mount","shadowRoot","disconnectedCallback","umount","adoptedCallback","update","attributeChangedCallback","attrName","oldVal","newVal","dispatch","attribute","constructor","super","undefined","customElement","_dispatchAction","type","data","event","scope","t0","performance","now","_dispatch","t1","_dispatchElement","_dispatchWindow","e","windowDispatchOn","_windowEventListener","action","detail","addEventListener","windowDispatchOff","removeEventListener","_updateDom","el","hsml","ctx","$hrCkK","hsmls2idomPatch","refs","$fe5fa9c04fc86188$var$__awaiter","$fe5fa9c04fc86188$var$elementDispatchCustomEvent","dispatchEvent","CustomEvent","render","hsmls","actionCb","actionType","Function","target","nodeName","preventDefault","els","elements","i","length","d","$fe5fa9c04fc86188$var$formInputData","names","Object","keys","value","String","Array","concat","push","filter","$fe5fa9c04fc86188$var$formData","document","getElementById","hasAttribute","removeAttribute","aNodes","querySelectorAll","a","happ","firstChild","removeChild","_updateSched","toHsml","skip","toHtml","outerHTML","init","then","_b","_a","call","iel","checked","sel","multiple","values","from","selectedOptions","map","o","tel","bel","app","$fe5fa9c04fc86188$exports","HApp","message","json","on","res","fetch","JSON","stringify"],"version":3,"file":"hsml-app_demo.bbebbbcf.js.map"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><script nomodule defer src="hsml-app-form-validation_demo.
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><script nomodule defer src="hsml-app-form-validation_demo.fdcc0b2d.js"></script><script type="module" src="hsml-app-form-validation_demo.c6856b02.js"></script><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>PeRyL HSML App</title></head><body> <div id="app"></div> <script type="module" src="hsml-app_demo.bbebbbcf.js"></script><script src="hsml-app_demo.b5c1d27d.js" nomodule defer></script> </body></html>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(){function t(t,e,n,i){Object.defineProperty(t,e,{get:n,set:i,enumerable:!0,configurable:!0})}var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},i={},o=e.parcelRequirede31;null==o&&((o=function(t){if(t in n)return n[t].exports;if(t in i){var e=i[t];delete i[t];var o={id:t,exports:{}};return n[t]=o,e.call(o.exports,o,o.exports),o.exports}var a=new Error("Cannot find module '"+t+"'");throw a.code="MODULE_NOT_FOUND",a}).register=function(t,e){i[t]=e},e.parcelRequirede31=o);var a={};t(a,"HAppActions",(function(){return l}),(function(t){return l=t})),t(a,"HDispatchScopes",(function(){return p}),(function(t){return p=t})),t(a,"happ",(function(){return A}),(function(t){return A=t})),t(a,"HApp",(function(){return E}),(function(t){return E=t})),t(a,"happel",(function(){return g}),(function(t){return g=t}));var s=o("8IJ2T"),c=function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{u(i.next(t))}catch(t){a(t)}}function c(t){try{u(i.throw(t))}catch(t){a(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,c)}u((i=i.apply(t,e||[])).next())}))};const u=console.log,r=console.error,h=console.warn;var l,d,p,m;(d=l||(l={})).init="happ-init",d.mount="happ-mount",d.umount="happ-umount",d.update="happ-update",d.action="happ-action",d.attribute="happ-attribute",(m=p||(p={})).element="element",m.window="window";const f=window.requestAnimationFrame||function(t){window.setTimeout(t,1e3/60)},v=window.cancelAnimationFrame||function(t){window.clearTimeout(t)},w="action:",b="dispatch:",y="render:",_="happ";function A(t){return new E(t.state,t.view,t.dispatcher,t.element,t.debug,t.name)}function g(t){customElements.define(`${_}-${t.name}`,class extends HTMLElement{static get observedAttributes(){return t.attributes}connectedCallback(){this.attachShadow({mode:"open"}),this._happel.mount(this.shadowRoot)}disconnectedCallback(){this._happel.umount()}adoptedCallback(){this._happel.update()}attributeChangedCallback(t,e,n){this._happel.dispatch(l.attribute,{attrName:t,oldVal:e,newVal:n})}constructor(){super(),this._happel=new E(t.state,t.view,t.dispatcher,void 0,t.debug,t.name,t.attributes),this._happel.customElement=this}})}class E{_dispatchAction(t,e,n,i){return c(this,void 0,void 0,(function*(){if(this.debug){u(this.name,w,{type:t,data:e,event:n});const o=performance.now();yield this._dispatch(t,e,n,i);const a=performance.now();u(this.name,b,a-o+" ms",this.state)}else yield this._dispatch(t,e,n,i)}))}_dispatch(t,e,n,i){return c(this,void 0,void 0,(function*(){try{yield this.dispatcher({type:t,data:e,event:n},this.state,this.dispatch),this.update(),"element"===i&&this._dispatchElement(t,e),"window"===i&&this._dispatchWindow(t,e)}catch(t){r(this.name,b,t)}}))}windowDispatchOn(){this._windowEventListener?h("windowEventListener olready setted"):(this._windowEventListener=t=>{const e=t.detail;this._dispatchAction(e.type,e.data)},window.addEventListener(l.action,this._windowEventListener))}windowDispatchOff(){this._windowEventListener&&window.removeEventListener(l.action,this._windowEventListener)}_updateDom(t,e,n){if(this.debug){const i=performance.now();(0,s.hsmls2idomPatch)(t,e,n);const o=performance.now();u(this.name,"update:",o-i+" ms",t)}else(0,s.hsmls2idomPatch)(t,e,n)}constructor(t,e,n,i,o,a,s){this.refs={},this.dispatch=(t,e,n)=>c(this,void 0,void 0,(function*(){return this._dispatchAction(t,e,void 0,n)})),this._dispatchElement=(t,e)=>c(this,void 0,void 0,(function*(){this.customElement&&k(this.customElement,l.action,{type:t,data:e}),!this.customElement&&this.element&&k(this.element,l.action,{type:t,data:e})})),this._dispatchWindow=(t,e)=>c(this,void 0,void 0,(function*(){window.dispatchEvent(new CustomEvent(l.action,{detail:{type:t,data:e}}))})),this.render=()=>{if(this.debug){const t=performance.now();let e;try{e=this.view(this.state)}catch(t){r(this.name,y,t)}const n=performance.now();return u(this.name,y,n-t+" ms",e),null!=e?e:[]}{let t;try{t=this.view(this.state)}catch(t){r(this.name,y,t)}return null!=t?t:[]}},this.actionCb=(t,e,n)=>{void 0===(e=(null==e?void 0:e.constructor)===Function?e(n):e)&&n&&(e=n instanceof CustomEvent?n.detail:function(t){const e=t.target;if("FORM"===e.nodeName){t.preventDefault();const n=e.elements,i={};for(let t=0;t<n.length;t++){const e=C(n[t]);if("object"==typeof e){const o=Object.keys(e);if(o.length){const a=o[0],s=e[a];void 0===i[a]?i[a]=s:"string"==typeof i[a]||i[a]instanceof String?i[a]=s instanceof Array?[i[a],...s]:[i[a],s]:i[a]instanceof Array?s instanceof Array?i[a]=i[a].concat(s):i[a].push(s):i[a]=s instanceof Array?[i[a],...s]:[i[a],s],i[a]instanceof Array&&(i[a]=i[a].filter((t=>null!==t)),"radio"===n[t].type&&(i[a]=i[a].length?i[a][0]:null))}}}return i}return C(e)}(n)),this._dispatchAction(t,e,n)},this.mount=t=>{const e="string"==typeof t?document.getElementById(t):t;if(e&&e[_]){e[_].umount()}if(e&&!this.element){this.element=e,e[_]=this;const t=this.render();this._updateDom(e,t,this),this._dispatchAction(l.mount,this.element)}return this},this.umount=()=>{if(this.element){this._dispatchAction(l.umount,this.element),this.element.hasAttribute(_)&&this.element.removeAttribute(_);const t=this.element.querySelectorAll(`[${_}]`);for(let e=0;e<t.length;e++){const n=t[e].happ;null==n||n.umount()}for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);delete this.element.happ,this.element=void 0}return this},this.update=()=>(this.element&&!this._updateSched&&(this._updateSched=f((()=>{if(this.element){const t=this.render();this._updateDom(this.element,t,this)}this._updateSched=void 0}))),this),this.toHsml=()=>{if(this.element){if(!this._updateSched)return["div",{skip:!0}];v(this._updateSched),this._updateSched=void 0}const t=this.render();return t.push((t=>{this.element||(this.element=t,t.happ=this,this._dispatchAction(l.mount,this.element))})),["div",t]},this.toHtml=()=>this.element?this.element.outerHTML:"",this.debug=null!=o&&o,this.name=null!=a?a:_,this.attributes=null!=s?s:[],this.state=t(),this.view=e,this.dispatcher=null!=n?n:t=>c(this,void 0,void 0,(function*(){return u(this.name,w,t.type,t.data)})),this._dispatchAction(l.init,this).then((()=>i&&this.mount(i)))}}function k(t,e,n){var i,o;null==t||t.dispatchEvent(new CustomEvent(e,{detail:n})),null===(o=(i=t)[`on${e}`])||void 0===o||o.call(i,new CustomEvent(e,{detail:n}))}function C(t){let e=null;switch(t.nodeName){case"INPUT":const n=t;switch(n.type){case"text":case"hidden":case"password":case"email":case"number":case"search":case"url":case"tel":case"color":case"date":case"datetime-local":case"month":case"range":case"time":case"week":case"submit":case"button":e=n.name?{[n.name]:n.value}:n.value;break;case"radio":e=n.name?{[n.name]:n.checked?n.value:null}:n.checked?n.value:null;break;case"checkbox":e="on"===n.value?n.name?{[n.name]:n.checked}:n.checked:n.name?{[n.name]:n.checked?String(n.value):null}:n.checked?String(n.value):null}break;case"SELECT":const i=t;if(i.multiple){const t=Array.from(i.selectedOptions).map((t=>t.value));e=i.name?{[i.name]:t}:t}else e=i.name?{[i.name]:i.value}:i.value;break;case"TEXTAREA":const o=t;e=o.name?{[o.name]:o.value}:o.value;break;case"BUTTON":const a=t;e=a.name?{[a.name]:a.value}:a.value}return e}var S,H,T=function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{u(i.next(t))}catch(t){a(t)}}function c(t){try{u(i.throw(t))}catch(t){a(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,c)}u((i=i.apply(t,e||[])).next())}))};(H=S||(S={})).dec="counter-dec",H.inc="counter-inc",H.count="counter-count";var x;(0,a.happel)({state:function(){return{count:77}},view:function(t){return[["h3",["Counter"]],["p",[["em",["Count"]],": ",t.count," ",["button",{on:["click",S.dec,1]},["-"]],["button",{on:["click",S.inc,2]},["+"]]]]]},dispatcher:function(t,e,n){return T(this,void 0,void 0,(function*(){switch(console.log("action counter:",t),t.type){case a.HAppActions.init:case a.HAppActions.mount:case a.HAppActions.umount:break;case a.HAppActions.attribute:"count"===t.data.attrName&&(e.count=Number(t.data.newVal));break;case S.inc:e.count=e.count+t.data,setTimeout((()=>n(S.dec,1)),1e3),n(S.count,e.count,a.HDispatchScopes.element);break;case S.dec:e.count=e.count-t.data,n(S.count,e.count,a.HDispatchScopes.element)}}))},name:"counter",attributes:["count"],debug:!0}),(x||(x={})).action="app-action";(0,a.happel)({state:function(){return{count:0}},view:function(t){return[["h2",["App count: ",t.count]],["happ-counter",{count:33,on:[a.HAppActions.action,x.action]}]]},dispatcher:function(t,e,n){return T(this,void 0,void 0,(function*(){if(console.log("action:",t),t.type===x.action){const i=t.data;if(i.type===S.count)e.count=i.data,n(S.count,e.count,a.HDispatchScopes.element);else console.log(i)}}))},name:"app",attributes:[],debug:!0})}();
|
|
2
|
+
//# sourceMappingURL=hsml-appel_demo.4d9e135c.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["src/hsml-app.ts","demo/hsml-appel_demo.ts"],"sourcesContent":["import { HAttrOnData, HAttrOnDataFnc, HElement, HElements, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst error = console.error;\nconst warn = console.warn;\n\nexport type HState<State> = () => State;\n\nexport type HView<State, HActionType extends string> = (\n state: State\n) => HElements<HActionType>;\n\nexport type HView1<State, HActionType extends string> = (\n state: State\n) => HElement<HActionType>;\n\nexport type HAppActionType =\n | \"happ-init\"\n | \"happ-mount\"\n | \"happ-umount\"\n | \"happ-update\"\n | \"happ-action\"\n | \"happ-attribute\";\n\nexport enum HAppActions {\n init = \"happ-init\",\n mount = \"happ-mount\",\n umount = \"happ-umount\",\n update = \"happ-update\",\n action = \"happ-action\",\n attribute = \"happ-attribute\"\n}\n\nexport interface HAction<HActionType extends string> {\n type: HActionType | HAppActionType | HAppActions;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatchScope =\n | \"element\"\n | \"window\";\n\nexport enum HDispatchScopes {\n element = \"element\",\n window = \"window\"\n}\n\nexport type HDispatch<HActionType extends string> = (\n type: HAction<HActionType>[\"type\"],\n data?: HAction<HActionType>[\"data\"],\n scope?: HDispatchScope | HDispatchScopes\n) => Promise<void>;\n\nexport type HDispatcher<State, HActionType extends string> = (\n // this: HApp<State, HActionType>,\n action: HAction<HActionType>,\n state: State,\n dispatch: HDispatch<HActionType>\n) => Promise<void>;\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"action:\";\nconst msgDispatch = \"dispatch:\";\nconst msgRender = \"render:\";\nconst msgUpdate = \"update:\";\n\nconst HAPP = \"happ\";\n\nexport interface HAppI<State, HActionType extends string> {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element?: Element | string | null;\n debug?: boolean;\n name?: string;\n attributes?: string[];\n}\n\n/**\n * HApp definition\n *\n * @param hAppI HApp definition\n * @returns HApp instance\n */\nexport function happ<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element: Element | string | null;\n debug?: boolean;\n name?: string;\n // attributes?: string[];\n}) {\n return new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n hAppI.element,\n hAppI.debug,\n hAppI.name\n // hAppI!.attributes\n );\n}\n\n// export type Class<T = object> = new (...args: any[]) => T;\n\n// export function happi<State, HActionType extends string>(\n// hAppI: Class<HAppI<State, HActionType>>,\n// element?: Element | string | null,\n// debug? boolean,\n// name?: string,\n// attributes: string[]\n// ) {\n// const hapi = new hAppI();\n// return new HApp<State, HActionType>(\n// hapi.state,\n// hapi.view,\n// hapi.dispatcher,\n// element,\n// debug\n// );\n// }\n\n// HAppEl\n\n/**\n * HApp custom HTML element definition.\n *\n * @param hAppI HApp definition\n */\nexport function happel<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n /** Element suffix name, element name patern is `happ-${name}` */\n name: string;\n /** Element attribute list */\n attributes: string[];\n debug?: boolean;\n}): void {\n customElements.define(\n `${HAPP}-${hAppI.name}`,\n class HAppElement extends HTMLElement {\n static get observedAttributes() {\n return hAppI.attributes;\n }\n\n private _happel: HApp<State, HActionType>;\n\n constructor() {\n super();\n this._happel = new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n undefined,\n hAppI.debug,\n hAppI.name,\n hAppI.attributes\n );\n (this._happel as any).customElement = this;\n }\n\n connectedCallback() {\n // this._happel.mount(this);\n this.attachShadow({ mode: \"open\" });\n this._happel.mount(this.shadowRoot as any);\n }\n\n disconnectedCallback() {\n this._happel.umount();\n }\n\n adoptedCallback() {\n this._happel.update();\n }\n\n attributeChangedCallback(\n attrName: string,\n oldVal: string | null,\n newVal: string | null\n ) {\n this._happel.dispatch(HAppActions.attribute, {\n attrName,\n oldVal,\n newVal,\n });\n }\n }\n );\n}\n\n/**\n * HSML App\n */\nexport class HApp<State, HActionType extends string> implements HHandlerCtx<HActionType> {\n\n readonly state: State;\n readonly view: HView<State, HActionType>;\n readonly dispatcher: HDispatcher<State, HActionType>;\n\n debug: boolean;\n\n readonly name: string;\n readonly attributes: string[];\n\n readonly element?: HTMLElement;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n readonly customElement?: HTMLElement; // happ custom html element\n\n private _updateSched?: number;\n\n // private _onDispatch?: HDispatcher<State>;\n\n private _windowEventListener?: (event: Event) => void;\n\n constructor(\n state: HState<State>,\n view: HView<State, HActionType>,\n dispatcher?: HDispatcher<State, HActionType>,\n element?: Element | string | null,\n debug?: boolean ,\n name?: string,\n attributes?: string[]\n ) {\n this.debug = debug ?? false;\n this.name = name ?? HAPP;\n this.attributes = attributes ?? [];\n this.state = state();\n this.view = view;\n this.dispatcher = dispatcher ?? (async (a) => log(this.name, msgAction, a.type, a.data));\n this._dispatchAction(HAppActions.init, this).then(() => element && this.mount(element));\n }\n\n dispatch: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any,\n scope?: HDispatchScope\n ): Promise<void> => {\n return this._dispatchAction(type, data, undefined, scope);\n }\n\n // onDispatch = (dispatcher: HDispatcher<State>): this => {\n // this._onDispatch = dispatcher;\n // return this;\n // }\n\n private async _dispatchAction(\n type: HActionType | HAppActionType,\n data?: any,\n event?: Event,\n scope?: HDispatchScope\n ): Promise<void> {\n if (this.debug) {\n log(this.name, msgAction, { type, data, event });\n const t0 = performance.now();\n await this._dispatch(type, data, event, scope);\n const t1 = performance.now();\n log(this.name, msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n await this._dispatch(type, data, event, scope);\n }\n }\n\n private async _dispatch(\n type: HActionType | HAppActionType,\n data: any,\n event?: Event,\n scope?: HDispatchScope\n ) {\n try {\n await this.dispatcher(\n { type: type as HActionType, data, event },\n this.state,\n this.dispatch\n );\n this.update();\n scope === \"element\" && this._dispatchElement(type, data);\n scope === \"window\" && this._dispatchWindow(type, data);\n } catch (e) {\n error(this.name, msgDispatch, e);\n }\n }\n\n private _dispatchElement: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any\n ): Promise<void> => {\n this.customElement && elementDispatchCustomEvent(this.customElement, HAppActions.action, { type, data });\n !this.customElement && this.element && elementDispatchCustomEvent(this.element, HAppActions.action, { type, data });\n // this.customElement && elementDispatchCustomEvent(this.customElement, type, data);\n // !this.customElement && this.element && elementDispatchCustomEvent(this.element, type, data);\n // this._onDispatch?.({ type, data, event }, this.state, this.dispatch);\n }\n\n private _dispatchWindow: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any): Promise<void> => {\n window.dispatchEvent(new CustomEvent(HAppActions.action, { detail: { type, data } }));\n }\n\n windowDispatchOn() {\n if (!this._windowEventListener) {\n this._windowEventListener = (event: Event) => {\n const action = (event as CustomEvent).detail as HAction<HActionType>;\n this._dispatchAction(action.type, action.data);\n };\n window.addEventListener(HAppActions.action, this._windowEventListener);\n } else {\n warn(\"windowEventListener olready setted\");\n }\n }\n\n windowDispatchOff() {\n if (this._windowEventListener) {\n window.removeEventListener(HAppActions.action, this._windowEventListener);\n }\n }\n\n render = (): HElements<HActionType> => {\n if (this.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n const t1 = performance.now();\n log(this.name, msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls ?? [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n return hsmls ?? [];\n }\n }\n\n actionCb = (actionType: HActionType, data: HAttrOnData, event: Event): void => {\n data = (data?.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n if (event instanceof CustomEvent) {\n data = event.detail;\n } else {\n data = formData(event);\n }\n }\n this._dispatchAction(actionType, data, event);\n }\n\n private _updateDom<HActionType extends string>(\n el: Element,\n hsml: HElements<HActionType>,\n ctx: HHandlerCtx<HActionType>\n ): void {\n if (this.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(this.name, msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n }\n\n mount = (e: Element | string | null): this => {\n const el = (typeof e === \"string\") ? document.getElementById(e) : e;\n if (el && (el as any)[HAPP]) {\n const a = (el as any)[HAPP] as HApp<State, HActionType>;\n a.umount();\n }\n if (el && !this.element) {\n (this as any).element = el;\n (el as any)[HAPP] = this;\n const hsmls = (this as any).render();\n this._updateDom<HActionType>(el, hsmls, this);\n this._dispatchAction(HAppActions.mount, this.element);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.element) {\n this._dispatchAction(HAppActions.umount, this.element);\n if (this.element.hasAttribute(HAPP)) {\n this.element.removeAttribute(HAPP);\n }\n const aNodes = this.element.querySelectorAll(`[${HAPP}]`);\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).happ as HApp<State, HActionType>;\n a?.umount();\n }\n while (this.element.firstChild /*.hasChildNodes()*/) {\n this.element.removeChild(this.element.firstChild);\n }\n delete (this.element as any).happ;\n (this as any).element = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.element && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.element) {\n const hsmls = this.render();\n this._updateDom<HActionType>(this.element, hsmls, this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement<HActionType> => {\n if (this.element) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.element) {\n (this as any).element = e;\n (e as any).happ = this;\n this._dispatchAction(HAppActions.mount, this.element);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.element ? this.element.outerHTML : \"\";\n }\n\n}\n\nfunction elementDispatchCustomEvent<HActionType extends string>(\n el: HTMLElement,\n type: HActionType,\n data: any\n) {\n el?.dispatchEvent(new CustomEvent(type, { detail: data }));\n (el as any)[`on${type}`]?.(new CustomEvent(type, { detail: data }));\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n let data: { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: iel.checked };\n } else {\n data = iel.checked;\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n","import { HElements } from \"../src/hsml\";\nimport { HAction, HAppActions, happel, HDispatch, HDispatcher, HDispatchScopes, HState, HView } from \"../src/hsml-app\";\n\ninterface CounterState {\n count: number;\n}\n\nenum CounterActions {\n dec = \"counter-dec\",\n inc = \"counter-inc\",\n count = \"counter-count\"\n}\n\nconst counterState: HState<CounterState> = function () {\n return {\n count: 77\n }\n};\n\nconst counterView: HView<CounterState, CounterActions> = function (state) {\n return [\n [\"h3\", [\"Counter\"]],\n [\"p\", [\n [\"em\", [\"Count\"]], \": \", state.count,\n \" \",\n [\"button\", { on: [\"click\", CounterActions.dec, 1] }, [\"-\"]],\n [\"button\", { on: [\"click\", CounterActions.inc, 2] }, [\"+\"]]\n ]]\n ];\n};\n\nconst counterDispatcher: HDispatcher<CounterState, CounterActions> = async function (action, state, dispatch) {\n console.log(\"action counter:\", action);\n // console.log(\"state counter:\", state);\n // console.log(\"happ counter:\", this);\n\n switch (action.type) {\n case HAppActions.init:\n case HAppActions.mount:\n case HAppActions.umount:\n break;\n\n case HAppActions.attribute:\n if (action.data.attrName === \"count\") {\n state.count = Number(action.data.newVal);\n }\n break;\n\n case CounterActions.inc:\n state.count = state.count + action.data as number;\n setTimeout(() => dispatch(CounterActions.dec, 1), 1e3); // async call\n dispatch(CounterActions.count, state.count, HDispatchScopes.element);\n break;\n\n case CounterActions.dec:\n state.count = state.count - action.data as number;\n dispatch(CounterActions.count, state.count, HDispatchScopes.element);\n break;\n }\n};\n\nhappel<CounterState, CounterActions>({\n state: counterState,\n view: counterView,\n dispatcher: counterDispatcher,\n name: \"counter\",\n attributes: [\"count\"],\n debug: true\n});\n\n\ninterface AppState {\n count: number;\n}\n\nenum AppActions {\n action = \"app-action\"\n}\n\nconst appState: HState<AppState> = function () {\n return {\n count: 0\n }\n};\n\nconst appView: HView<AppState, AppActions> = function (state) {\n return [\n [\"h2\", [\"App count: \", state.count]],\n [\"happ-counter\", {\n count: 33,\n on: [HAppActions.action, AppActions.action]\n }]\n ];\n};\n\nconst appDispatcher: HDispatcher<AppState, AppActions | CounterActions> = async function (action, state, dispatch) {\n console.log(\"action:\", action);\n // console.log(\"state:\", state);\n // console.log(\"happ:\", this);\n\n switch (action.type) {\n case AppActions.action:\n const a = action.data as HAction<AppActions | CounterActions>;\n switch (a.type) {\n case CounterActions.count:\n state.count = a.data as number;\n dispatch(CounterActions.count, state.count, HDispatchScopes.element);\n break;\n default:\n console.log(a);\n break;\n }\n break;\n }\n};\n\nhappel<AppState, AppActions | CounterActions>({\n state: appState,\n view: appView,\n dispatcher: appDispatcher,\n name: \"app\",\n attributes: [],\n debug: true\n});\n"],"names":["$a85519cc1b20a4af$var$log","console","log","$a85519cc1b20a4af$var$error","error","$a85519cc1b20a4af$var$warn","warn","$a85519cc1b20a4af$export$3dcd9fad60135c2c","HAppActions","$a85519cc1b20a4af$export$3d736e925369e0e4","HDispatchScopes","$a85519cc1b20a4af$var$schedule","window","requestAnimationFrame","callback","setTimeout","$a85519cc1b20a4af$var$unschedule","cancelAnimationFrame","handle","clearTimeout","$a85519cc1b20a4af$var$msgAction","$a85519cc1b20a4af$var$msgDispatch","$a85519cc1b20a4af$var$msgRender","$a85519cc1b20a4af$var$HAPP","$a85519cc1b20a4af$export$eb8950696418f795","hAppI","$a85519cc1b20a4af$export$8cfef5dc37c46888","state","view","dispatcher","element","debug","name","$a85519cc1b20a4af$export$1cfc54b3834d3c50","customElements","define","HTMLElement","observedAttributes","attributes","connectedCallback","this","attachShadow","mode","_happel","mount","shadowRoot","disconnectedCallback","umount","adoptedCallback","update","attributeChangedCallback","attrName","oldVal","newVal","dispatch","attribute","constructor","super","undefined","customElement","_dispatchAction","type","data","event","scope","t0","performance","now","_dispatch","t1","_dispatchElement","_dispatchWindow","e","windowDispatchOn","_windowEventListener","action","detail","addEventListener","windowDispatchOff","removeEventListener","_updateDom","el","hsml","ctx","$8IJ2T","hsmls2idomPatch","refs","$a85519cc1b20a4af$var$__awaiter","$a85519cc1b20a4af$var$elementDispatchCustomEvent","dispatchEvent","CustomEvent","render","hsmls","actionCb","actionType","Function","target","nodeName","preventDefault","els","elements","i","length","d","$a85519cc1b20a4af$var$formInputData","names","Object","keys","value","String","Array","concat","push","filter","$a85519cc1b20a4af$var$formData","document","getElementById","hasAttribute","removeAttribute","aNodes","querySelectorAll","a","happ","firstChild","removeChild","_updateSched","toHsml","skip","toHtml","outerHTML","init","then","_b","_a","call","iel","checked","sel","multiple","values","from","selectedOptions","map","o","tel","bel","$1adacf07b647a858$var$CounterActions","CounterActions","$1adacf07b647a858$var$AppActions","$a85519cc1b20a4af$exports","happel","count","on","dec","inc","Number"],"version":3,"file":"hsml-appel_demo.4d9e135c.js.map"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function t(t,e,n,i){Object.defineProperty(t,e,{get:n,set:i,enumerable:!0,configurable:!0})}var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},i={},o=e.parcelRequirede31;null==o&&((o=function(t){if(t in n)return n[t].exports;if(t in i){var e=i[t];delete i[t];var o={id:t,exports:{}};return n[t]=o,e.call(o.exports,o,o.exports),o.exports}var a=new Error("Cannot find module '"+t+"'");throw a.code="MODULE_NOT_FOUND",a}).register=function(t,e){i[t]=e},e.parcelRequirede31=o);var a={};t(a,"HAppActions",(function(){return l}),(function(t){return l=t})),t(a,"HDispatchScopes",(function(){return p}),(function(t){return p=t})),t(a,"happ",(function(){return A}),(function(t){return A=t})),t(a,"HApp",(function(){return E}),(function(t){return E=t})),t(a,"happel",(function(){return g}),(function(t){return g=t}));var s=o("hrCkK"),c=function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{u(i.next(t))}catch(t){a(t)}}function c(t){try{u(i.throw(t))}catch(t){a(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,c)}u((i=i.apply(t,e||[])).next())}))};const u=console.log,r=console.error,h=console.warn;var l,d,p,m;(d=l||(l={})).init="happ-init",d.mount="happ-mount",d.umount="happ-umount",d.update="happ-update",d.action="happ-action",d.attribute="happ-attribute",(m=p||(p={})).element="element",m.window="window";const f=window.requestAnimationFrame||function(t){window.setTimeout(t,1e3/60)},v=window.cancelAnimationFrame||function(t){window.clearTimeout(t)},w="action:",b="dispatch:",y="render:",_="happ";function A(t){return new E(t.state,t.view,t.dispatcher,t.element,t.debug,t.name)}function g(t){customElements.define(`${_}-${t.name}`,class extends HTMLElement{static get observedAttributes(){return t.attributes}connectedCallback(){this.attachShadow({mode:"open"}),this._happel.mount(this.shadowRoot)}disconnectedCallback(){this._happel.umount()}adoptedCallback(){this._happel.update()}attributeChangedCallback(t,e,n){this._happel.dispatch(l.attribute,{attrName:t,oldVal:e,newVal:n})}constructor(){super(),this._happel=new E(t.state,t.view,t.dispatcher,void 0,t.debug,t.name,t.attributes),this._happel.customElement=this}})}class E{_dispatchAction(t,e,n,i){return c(this,void 0,void 0,(function*(){if(this.debug){u(this.name,w,{type:t,data:e,event:n});const o=performance.now();yield this._dispatch(t,e,n,i);const a=performance.now();u(this.name,b,a-o+" ms",this.state)}else yield this._dispatch(t,e,n,i)}))}_dispatch(t,e,n,i){return c(this,void 0,void 0,(function*(){try{yield this.dispatcher({type:t,data:e,event:n},this.state,this.dispatch),this.update(),"element"===i&&this._dispatchElement(t,e),"window"===i&&this._dispatchWindow(t,e)}catch(t){r(this.name,b,t)}}))}windowDispatchOn(){this._windowEventListener?h("windowEventListener olready setted"):(this._windowEventListener=t=>{const e=t.detail;this._dispatchAction(e.type,e.data)},window.addEventListener(l.action,this._windowEventListener))}windowDispatchOff(){this._windowEventListener&&window.removeEventListener(l.action,this._windowEventListener)}_updateDom(t,e,n){if(this.debug){const i=performance.now();(0,s.hsmls2idomPatch)(t,e,n);const o=performance.now();u(this.name,"update:",o-i+" ms",t)}else(0,s.hsmls2idomPatch)(t,e,n)}constructor(t,e,n,i,o,a,s){this.refs={},this.dispatch=(t,e,n)=>c(this,void 0,void 0,(function*(){return this._dispatchAction(t,e,void 0,n)})),this._dispatchElement=(t,e)=>c(this,void 0,void 0,(function*(){this.customElement&&k(this.customElement,l.action,{type:t,data:e}),!this.customElement&&this.element&&k(this.element,l.action,{type:t,data:e})})),this._dispatchWindow=(t,e)=>c(this,void 0,void 0,(function*(){window.dispatchEvent(new CustomEvent(l.action,{detail:{type:t,data:e}}))})),this.render=()=>{if(this.debug){const t=performance.now();let e;try{e=this.view(this.state)}catch(t){r(this.name,y,t)}const n=performance.now();return u(this.name,y,n-t+" ms",e),null!=e?e:[]}{let t;try{t=this.view(this.state)}catch(t){r(this.name,y,t)}return null!=t?t:[]}},this.actionCb=(t,e,n)=>{void 0===(e=(null==e?void 0:e.constructor)===Function?e(n):e)&&n&&(e=n instanceof CustomEvent?n.detail:function(t){const e=t.target;if("FORM"===e.nodeName){t.preventDefault();const n=e.elements,i={};for(let t=0;t<n.length;t++){const e=C(n[t]);if("object"==typeof e){const o=Object.keys(e);if(o.length){const a=o[0],s=e[a];void 0===i[a]?i[a]=s:"string"==typeof i[a]||i[a]instanceof String?i[a]=s instanceof Array?[i[a],...s]:[i[a],s]:i[a]instanceof Array?s instanceof Array?i[a]=i[a].concat(s):i[a].push(s):i[a]=s instanceof Array?[i[a],...s]:[i[a],s],i[a]instanceof Array&&(i[a]=i[a].filter((t=>null!==t)),"radio"===n[t].type&&(i[a]=i[a].length?i[a][0]:null))}}}return i}return C(e)}(n)),this._dispatchAction(t,e,n)},this.mount=t=>{const e="string"==typeof t?document.getElementById(t):t;if(e&&e[_]){e[_].umount()}if(e&&!this.element){this.element=e,e[_]=this;const t=this.render();this._updateDom(e,t,this),this._dispatchAction(l.mount,this.element)}return this},this.umount=()=>{if(this.element){this._dispatchAction(l.umount,this.element),this.element.hasAttribute(_)&&this.element.removeAttribute(_);const t=this.element.querySelectorAll(`[${_}]`);for(let e=0;e<t.length;e++){const n=t[e].happ;null==n||n.umount()}for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);delete this.element.happ,this.element=void 0}return this},this.update=()=>(this.element&&!this._updateSched&&(this._updateSched=f((()=>{if(this.element){const t=this.render();this._updateDom(this.element,t,this)}this._updateSched=void 0}))),this),this.toHsml=()=>{if(this.element){if(!this._updateSched)return["div",{skip:!0}];v(this._updateSched),this._updateSched=void 0}const t=this.render();return t.push((t=>{this.element||(this.element=t,t.happ=this,this._dispatchAction(l.mount,this.element))})),["div",t]},this.toHtml=()=>this.element?this.element.outerHTML:"",this.debug=null!=o&&o,this.name=null!=a?a:_,this.attributes=null!=s?s:[],this.state=t(),this.view=e,this.dispatcher=null!=n?n:t=>c(this,void 0,void 0,(function*(){return u(this.name,w,t.type,t.data)})),this._dispatchAction(l.init,this).then((()=>i&&this.mount(i)))}}function k(t,e,n){var i,o;null==t||t.dispatchEvent(new CustomEvent(e,{detail:n})),null===(o=(i=t)[`on${e}`])||void 0===o||o.call(i,new CustomEvent(e,{detail:n}))}function C(t){let e=null;switch(t.nodeName){case"INPUT":const n=t;switch(n.type){case"text":case"hidden":case"password":case"email":case"number":case"search":case"url":case"tel":case"color":case"date":case"datetime-local":case"month":case"range":case"time":case"week":case"submit":case"button":e=n.name?{[n.name]:n.value}:n.value;break;case"radio":e=n.name?{[n.name]:n.checked?n.value:null}:n.checked?n.value:null;break;case"checkbox":e="on"===n.value?n.name?{[n.name]:n.checked}:n.checked:n.name?{[n.name]:n.checked?String(n.value):null}:n.checked?String(n.value):null}break;case"SELECT":const i=t;if(i.multiple){const t=Array.from(i.selectedOptions).map((t=>t.value));e=i.name?{[i.name]:t}:t}else e=i.name?{[i.name]:i.value}:i.value;break;case"TEXTAREA":const o=t;e=o.name?{[o.name]:o.value}:o.value;break;case"BUTTON":const a=t;e=a.name?{[a.name]:a.value}:a.value}return e}var S,H,T=function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{u(i.next(t))}catch(t){a(t)}}function c(t){try{u(i.throw(t))}catch(t){a(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,c)}u((i=i.apply(t,e||[])).next())}))};(H=S||(S={})).dec="counter-dec",H.inc="counter-inc",H.count="counter-count";var x;(0,a.happel)({state:function(){return{count:77}},view:function(t){return[["h3",["Counter"]],["p",[["em",["Count"]],": ",t.count," ",["button",{on:["click",S.dec,1]},["-"]],["button",{on:["click",S.inc,2]},["+"]]]]]},dispatcher:function(t,e,n){return T(this,void 0,void 0,(function*(){switch(console.log("action counter:",t),t.type){case a.HAppActions.init:case a.HAppActions.mount:case a.HAppActions.umount:break;case a.HAppActions.attribute:"count"===t.data.attrName&&(e.count=Number(t.data.newVal));break;case S.inc:e.count=e.count+t.data,setTimeout((()=>n(S.dec,1)),1e3),n(S.count,e.count,a.HDispatchScopes.element);break;case S.dec:e.count=e.count-t.data,n(S.count,e.count,a.HDispatchScopes.element)}}))},name:"counter",attributes:["count"],debug:!0}),(x||(x={})).action="app-action";(0,a.happel)({state:function(){return{count:0}},view:function(t){return[["h2",["App count: ",t.count]],["happ-counter",{count:33,on:[a.HAppActions.action,x.action]}]]},dispatcher:function(t,e,n){return T(this,void 0,void 0,(function*(){if(console.log("action:",t),t.type===x.action){const i=t.data;if(i.type===S.count)e.count=i.data,n(S.count,e.count,a.HDispatchScopes.element);else console.log(i)}}))},name:"app",attributes:[],debug:!0});
|
|
2
|
+
//# sourceMappingURL=hsml-appel_demo.7ddb6fb3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["src/hsml-app.ts","demo/hsml-appel_demo.ts"],"sourcesContent":["import { HAttrOnData, HAttrOnDataFnc, HElement, HElements, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst error = console.error;\nconst warn = console.warn;\n\nexport type HState<State> = () => State;\n\nexport type HView<State, HActionType extends string> = (\n state: State\n) => HElements<HActionType>;\n\nexport type HView1<State, HActionType extends string> = (\n state: State\n) => HElement<HActionType>;\n\nexport type HAppActionType =\n | \"happ-init\"\n | \"happ-mount\"\n | \"happ-umount\"\n | \"happ-update\"\n | \"happ-action\"\n | \"happ-attribute\";\n\nexport enum HAppActions {\n init = \"happ-init\",\n mount = \"happ-mount\",\n umount = \"happ-umount\",\n update = \"happ-update\",\n action = \"happ-action\",\n attribute = \"happ-attribute\"\n}\n\nexport interface HAction<HActionType extends string> {\n type: HActionType | HAppActionType | HAppActions;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatchScope =\n | \"element\"\n | \"window\";\n\nexport enum HDispatchScopes {\n element = \"element\",\n window = \"window\"\n}\n\nexport type HDispatch<HActionType extends string> = (\n type: HAction<HActionType>[\"type\"],\n data?: HAction<HActionType>[\"data\"],\n scope?: HDispatchScope | HDispatchScopes\n) => Promise<void>;\n\nexport type HDispatcher<State, HActionType extends string> = (\n // this: HApp<State, HActionType>,\n action: HAction<HActionType>,\n state: State,\n dispatch: HDispatch<HActionType>\n) => Promise<void>;\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"action:\";\nconst msgDispatch = \"dispatch:\";\nconst msgRender = \"render:\";\nconst msgUpdate = \"update:\";\n\nconst HAPP = \"happ\";\n\nexport interface HAppI<State, HActionType extends string> {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element?: Element | string | null;\n debug?: boolean;\n name?: string;\n attributes?: string[];\n}\n\n/**\n * HApp definition\n *\n * @param hAppI HApp definition\n * @returns HApp instance\n */\nexport function happ<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element: Element | string | null;\n debug?: boolean;\n name?: string;\n // attributes?: string[];\n}) {\n return new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n hAppI.element,\n hAppI.debug,\n hAppI.name\n // hAppI!.attributes\n );\n}\n\n// export type Class<T = object> = new (...args: any[]) => T;\n\n// export function happi<State, HActionType extends string>(\n// hAppI: Class<HAppI<State, HActionType>>,\n// element?: Element | string | null,\n// debug? boolean,\n// name?: string,\n// attributes: string[]\n// ) {\n// const hapi = new hAppI();\n// return new HApp<State, HActionType>(\n// hapi.state,\n// hapi.view,\n// hapi.dispatcher,\n// element,\n// debug\n// );\n// }\n\n// HAppEl\n\n/**\n * HApp custom HTML element definition.\n *\n * @param hAppI HApp definition\n */\nexport function happel<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n /** Element suffix name, element name patern is `happ-${name}` */\n name: string;\n /** Element attribute list */\n attributes: string[];\n debug?: boolean;\n}): void {\n customElements.define(\n `${HAPP}-${hAppI.name}`,\n class HAppElement extends HTMLElement {\n static get observedAttributes() {\n return hAppI.attributes;\n }\n\n private _happel: HApp<State, HActionType>;\n\n constructor() {\n super();\n this._happel = new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n undefined,\n hAppI.debug,\n hAppI.name,\n hAppI.attributes\n );\n (this._happel as any).customElement = this;\n }\n\n connectedCallback() {\n // this._happel.mount(this);\n this.attachShadow({ mode: \"open\" });\n this._happel.mount(this.shadowRoot as any);\n }\n\n disconnectedCallback() {\n this._happel.umount();\n }\n\n adoptedCallback() {\n this._happel.update();\n }\n\n attributeChangedCallback(\n attrName: string,\n oldVal: string | null,\n newVal: string | null\n ) {\n this._happel.dispatch(HAppActions.attribute, {\n attrName,\n oldVal,\n newVal,\n });\n }\n }\n );\n}\n\n/**\n * HSML App\n */\nexport class HApp<State, HActionType extends string> implements HHandlerCtx<HActionType> {\n\n readonly state: State;\n readonly view: HView<State, HActionType>;\n readonly dispatcher: HDispatcher<State, HActionType>;\n\n debug: boolean;\n\n readonly name: string;\n readonly attributes: string[];\n\n readonly element?: HTMLElement;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n readonly customElement?: HTMLElement; // happ custom html element\n\n private _updateSched?: number;\n\n // private _onDispatch?: HDispatcher<State>;\n\n private _windowEventListener?: (event: Event) => void;\n\n constructor(\n state: HState<State>,\n view: HView<State, HActionType>,\n dispatcher?: HDispatcher<State, HActionType>,\n element?: Element | string | null,\n debug?: boolean ,\n name?: string,\n attributes?: string[]\n ) {\n this.debug = debug ?? false;\n this.name = name ?? HAPP;\n this.attributes = attributes ?? [];\n this.state = state();\n this.view = view;\n this.dispatcher = dispatcher ?? (async (a) => log(this.name, msgAction, a.type, a.data));\n this._dispatchAction(HAppActions.init, this).then(() => element && this.mount(element));\n }\n\n dispatch: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any,\n scope?: HDispatchScope\n ): Promise<void> => {\n return this._dispatchAction(type, data, undefined, scope);\n }\n\n // onDispatch = (dispatcher: HDispatcher<State>): this => {\n // this._onDispatch = dispatcher;\n // return this;\n // }\n\n private async _dispatchAction(\n type: HActionType | HAppActionType,\n data?: any,\n event?: Event,\n scope?: HDispatchScope\n ): Promise<void> {\n if (this.debug) {\n log(this.name, msgAction, { type, data, event });\n const t0 = performance.now();\n await this._dispatch(type, data, event, scope);\n const t1 = performance.now();\n log(this.name, msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n await this._dispatch(type, data, event, scope);\n }\n }\n\n private async _dispatch(\n type: HActionType | HAppActionType,\n data: any,\n event?: Event,\n scope?: HDispatchScope\n ) {\n try {\n await this.dispatcher(\n { type: type as HActionType, data, event },\n this.state,\n this.dispatch\n );\n this.update();\n scope === \"element\" && this._dispatchElement(type, data);\n scope === \"window\" && this._dispatchWindow(type, data);\n } catch (e) {\n error(this.name, msgDispatch, e);\n }\n }\n\n private _dispatchElement: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any\n ): Promise<void> => {\n this.customElement && elementDispatchCustomEvent(this.customElement, HAppActions.action, { type, data });\n !this.customElement && this.element && elementDispatchCustomEvent(this.element, HAppActions.action, { type, data });\n // this.customElement && elementDispatchCustomEvent(this.customElement, type, data);\n // !this.customElement && this.element && elementDispatchCustomEvent(this.element, type, data);\n // this._onDispatch?.({ type, data, event }, this.state, this.dispatch);\n }\n\n private _dispatchWindow: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any): Promise<void> => {\n window.dispatchEvent(new CustomEvent(HAppActions.action, { detail: { type, data } }));\n }\n\n windowDispatchOn() {\n if (!this._windowEventListener) {\n this._windowEventListener = (event: Event) => {\n const action = (event as CustomEvent).detail as HAction<HActionType>;\n this._dispatchAction(action.type, action.data);\n };\n window.addEventListener(HAppActions.action, this._windowEventListener);\n } else {\n warn(\"windowEventListener olready setted\");\n }\n }\n\n windowDispatchOff() {\n if (this._windowEventListener) {\n window.removeEventListener(HAppActions.action, this._windowEventListener);\n }\n }\n\n render = (): HElements<HActionType> => {\n if (this.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n const t1 = performance.now();\n log(this.name, msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls ?? [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n return hsmls ?? [];\n }\n }\n\n actionCb = (actionType: HActionType, data: HAttrOnData, event: Event): void => {\n data = (data?.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n if (event instanceof CustomEvent) {\n data = event.detail;\n } else {\n data = formData(event);\n }\n }\n this._dispatchAction(actionType, data, event);\n }\n\n private _updateDom<HActionType extends string>(\n el: Element,\n hsml: HElements<HActionType>,\n ctx: HHandlerCtx<HActionType>\n ): void {\n if (this.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(this.name, msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n }\n\n mount = (e: Element | string | null): this => {\n const el = (typeof e === \"string\") ? document.getElementById(e) : e;\n if (el && (el as any)[HAPP]) {\n const a = (el as any)[HAPP] as HApp<State, HActionType>;\n a.umount();\n }\n if (el && !this.element) {\n (this as any).element = el;\n (el as any)[HAPP] = this;\n const hsmls = (this as any).render();\n this._updateDom<HActionType>(el, hsmls, this);\n this._dispatchAction(HAppActions.mount, this.element);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.element) {\n this._dispatchAction(HAppActions.umount, this.element);\n if (this.element.hasAttribute(HAPP)) {\n this.element.removeAttribute(HAPP);\n }\n const aNodes = this.element.querySelectorAll(`[${HAPP}]`);\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).happ as HApp<State, HActionType>;\n a?.umount();\n }\n while (this.element.firstChild /*.hasChildNodes()*/) {\n this.element.removeChild(this.element.firstChild);\n }\n delete (this.element as any).happ;\n (this as any).element = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.element && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.element) {\n const hsmls = this.render();\n this._updateDom<HActionType>(this.element, hsmls, this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement<HActionType> => {\n if (this.element) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.element) {\n (this as any).element = e;\n (e as any).happ = this;\n this._dispatchAction(HAppActions.mount, this.element);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.element ? this.element.outerHTML : \"\";\n }\n\n}\n\nfunction elementDispatchCustomEvent<HActionType extends string>(\n el: HTMLElement,\n type: HActionType,\n data: any\n) {\n el?.dispatchEvent(new CustomEvent(type, { detail: data }));\n (el as any)[`on${type}`]?.(new CustomEvent(type, { detail: data }));\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n let data: { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: iel.checked };\n } else {\n data = iel.checked;\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n","import { HElements } from \"../src/hsml\";\nimport { HAction, HAppActions, happel, HDispatch, HDispatcher, HDispatchScopes, HState, HView } from \"../src/hsml-app\";\n\ninterface CounterState {\n count: number;\n}\n\nenum CounterActions {\n dec = \"counter-dec\",\n inc = \"counter-inc\",\n count = \"counter-count\"\n}\n\nconst counterState: HState<CounterState> = function () {\n return {\n count: 77\n }\n};\n\nconst counterView: HView<CounterState, CounterActions> = function (state) {\n return [\n [\"h3\", [\"Counter\"]],\n [\"p\", [\n [\"em\", [\"Count\"]], \": \", state.count,\n \" \",\n [\"button\", { on: [\"click\", CounterActions.dec, 1] }, [\"-\"]],\n [\"button\", { on: [\"click\", CounterActions.inc, 2] }, [\"+\"]]\n ]]\n ];\n};\n\nconst counterDispatcher: HDispatcher<CounterState, CounterActions> = async function (action, state, dispatch) {\n console.log(\"action counter:\", action);\n // console.log(\"state counter:\", state);\n // console.log(\"happ counter:\", this);\n\n switch (action.type) {\n case HAppActions.init:\n case HAppActions.mount:\n case HAppActions.umount:\n break;\n\n case HAppActions.attribute:\n if (action.data.attrName === \"count\") {\n state.count = Number(action.data.newVal);\n }\n break;\n\n case CounterActions.inc:\n state.count = state.count + action.data as number;\n setTimeout(() => dispatch(CounterActions.dec, 1), 1e3); // async call\n dispatch(CounterActions.count, state.count, HDispatchScopes.element);\n break;\n\n case CounterActions.dec:\n state.count = state.count - action.data as number;\n dispatch(CounterActions.count, state.count, HDispatchScopes.element);\n break;\n }\n};\n\nhappel<CounterState, CounterActions>({\n state: counterState,\n view: counterView,\n dispatcher: counterDispatcher,\n name: \"counter\",\n attributes: [\"count\"],\n debug: true\n});\n\n\ninterface AppState {\n count: number;\n}\n\nenum AppActions {\n action = \"app-action\"\n}\n\nconst appState: HState<AppState> = function () {\n return {\n count: 0\n }\n};\n\nconst appView: HView<AppState, AppActions> = function (state) {\n return [\n [\"h2\", [\"App count: \", state.count]],\n [\"happ-counter\", {\n count: 33,\n on: [HAppActions.action, AppActions.action]\n }]\n ];\n};\n\nconst appDispatcher: HDispatcher<AppState, AppActions | CounterActions> = async function (action, state, dispatch) {\n console.log(\"action:\", action);\n // console.log(\"state:\", state);\n // console.log(\"happ:\", this);\n\n switch (action.type) {\n case AppActions.action:\n const a = action.data as HAction<AppActions | CounterActions>;\n switch (a.type) {\n case CounterActions.count:\n state.count = a.data as number;\n dispatch(CounterActions.count, state.count, HDispatchScopes.element);\n break;\n default:\n console.log(a);\n break;\n }\n break;\n }\n};\n\nhappel<AppState, AppActions | CounterActions>({\n state: appState,\n view: appView,\n dispatcher: appDispatcher,\n name: \"app\",\n attributes: [],\n debug: true\n});\n"],"names":["$fe5fa9c04fc86188$var$log","console","log","$fe5fa9c04fc86188$var$error","error","$fe5fa9c04fc86188$var$warn","warn","$fe5fa9c04fc86188$export$3dcd9fad60135c2c","HAppActions","$fe5fa9c04fc86188$export$3d736e925369e0e4","HDispatchScopes","$fe5fa9c04fc86188$var$schedule","window","requestAnimationFrame","callback","setTimeout","$fe5fa9c04fc86188$var$unschedule","cancelAnimationFrame","handle","clearTimeout","$fe5fa9c04fc86188$var$msgAction","$fe5fa9c04fc86188$var$msgDispatch","$fe5fa9c04fc86188$var$msgRender","$fe5fa9c04fc86188$var$HAPP","$fe5fa9c04fc86188$export$eb8950696418f795","hAppI","$fe5fa9c04fc86188$export$8cfef5dc37c46888","state","view","dispatcher","element","debug","name","$fe5fa9c04fc86188$export$1cfc54b3834d3c50","customElements","define","HTMLElement","observedAttributes","attributes","connectedCallback","this","attachShadow","mode","_happel","mount","shadowRoot","disconnectedCallback","umount","adoptedCallback","update","attributeChangedCallback","attrName","oldVal","newVal","dispatch","attribute","constructor","super","undefined","customElement","_dispatchAction","type","data","event","scope","t0","performance","now","_dispatch","t1","_dispatchElement","_dispatchWindow","e","windowDispatchOn","_windowEventListener","action","detail","addEventListener","windowDispatchOff","removeEventListener","_updateDom","el","hsml","ctx","$hrCkK","hsmls2idomPatch","refs","$fe5fa9c04fc86188$var$__awaiter","$fe5fa9c04fc86188$var$elementDispatchCustomEvent","dispatchEvent","CustomEvent","render","hsmls","actionCb","actionType","Function","target","nodeName","preventDefault","els","elements","i","length","d","$fe5fa9c04fc86188$var$formInputData","names","Object","keys","value","String","Array","concat","push","filter","$fe5fa9c04fc86188$var$formData","document","getElementById","hasAttribute","removeAttribute","aNodes","querySelectorAll","a","happ","firstChild","removeChild","_updateSched","toHsml","skip","toHtml","outerHTML","init","then","_b","_a","call","iel","checked","sel","multiple","values","from","selectedOptions","map","o","tel","bel","$aba843136a874dd7$var$CounterActions","CounterActions","$aba843136a874dd7$var$AppActions","$fe5fa9c04fc86188$exports","happel","count","on","dec","inc","Number"],"version":3,"file":"hsml-appel_demo.7ddb6fb3.js.map"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><script nomodule defer src="hsml-app-form-validation_demo.
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><script nomodule defer src="hsml-app-form-validation_demo.fdcc0b2d.js"></script><script type="module" src="hsml-app-form-validation_demo.c6856b02.js"></script><meta charset="utf-8"><title>PeRyL hsml app demo</title></head><body> <h1>PeRyL hsml app demo</h1> <happ-app></happ-app> <script type="module" src="hsml-appel_demo.7ddb6fb3.js"></script><script src="hsml-appel_demo.4d9e135c.js" nomodule defer></script> <script>document.getElementsByTagName("happ-app")[0].addEventListener("action",(function(e){console.log("EventListener action",e.detail)}));</script> </body></html>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(){function t(t,e,n,i){Object.defineProperty(t,e,{get:n,set:i,enumerable:!0,configurable:!0})}var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},i={},s=e.parcelRequirede31;null==s&&((s=function(t){if(t in n)return n[t].exports;if(t in i){var e=i[t];delete i[t];var s={id:t,exports:{}};return n[t]=s,e.call(s.exports,s,s.exports),s.exports}var a=new Error("Cannot find module '"+t+"'");throw a.code="MODULE_NOT_FOUND",a}).register=function(t,e){i[t]=e},e.parcelRequirede31=s);var a={};t(a,"HAppActions",(function(){return l}),(function(t){return l=t})),t(a,"HDispatchScopes",(function(){return m}),(function(t){return m=t})),t(a,"happ",(function(){return g}),(function(t){return g=t})),t(a,"HApp",(function(){return A}),(function(t){return A=t})),t(a,"happel",(function(){return E}),(function(t){return E=t}));var o=s("8IJ2T"),c=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{h(i.next(t))}catch(t){a(t)}}function c(t){try{h(i.throw(t))}catch(t){a(t)}}function h(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,c)}h((i=i.apply(t,e||[])).next())}))};const h=console.log,r=console.error,u=console.warn;var l,d,m,p;(d=l||(l={})).init="happ-init",d.mount="happ-mount",d.umount="happ-umount",d.update="happ-update",d.action="happ-action",d.attribute="happ-attribute",(p=m||(m={})).element="element",p.window="window";const f=window.requestAnimationFrame||function(t){window.setTimeout(t,1e3/60)},v=window.cancelAnimationFrame||function(t){window.clearTimeout(t)},w="action:",b="dispatch:",y="render:",_="happ";function g(t){return new A(t.state,t.view,t.dispatcher,t.element,t.debug,t.name)}function E(t){customElements.define(`${_}-${t.name}`,class extends HTMLElement{static get observedAttributes(){return t.attributes}connectedCallback(){this.attachShadow({mode:"open"}),this._happel.mount(this.shadowRoot)}disconnectedCallback(){this._happel.umount()}adoptedCallback(){this._happel.update()}attributeChangedCallback(t,e,n){this._happel.dispatch(l.attribute,{attrName:t,oldVal:e,newVal:n})}constructor(){super(),this._happel=new A(t.state,t.view,t.dispatcher,void 0,t.debug,t.name,t.attributes),this._happel.customElement=this}})}class A{_dispatchAction(t,e,n,i){return c(this,void 0,void 0,(function*(){if(this.debug){h(this.name,w,{type:t,data:e,event:n});const s=performance.now();yield this._dispatch(t,e,n,i);const a=performance.now();h(this.name,b,a-s+" ms",this.state)}else yield this._dispatch(t,e,n,i)}))}_dispatch(t,e,n,i){return c(this,void 0,void 0,(function*(){try{yield this.dispatcher({type:t,data:e,event:n},this.state,this.dispatch),this.update(),"element"===i&&this._dispatchElement(t,e),"window"===i&&this._dispatchWindow(t,e)}catch(t){r(this.name,b,t)}}))}windowDispatchOn(){this._windowEventListener?u("windowEventListener olready setted"):(this._windowEventListener=t=>{const e=t.detail;this._dispatchAction(e.type,e.data)},window.addEventListener(l.action,this._windowEventListener))}windowDispatchOff(){this._windowEventListener&&window.removeEventListener(l.action,this._windowEventListener)}_updateDom(t,e,n){if(this.debug){const i=performance.now();(0,o.hsmls2idomPatch)(t,e,n);const s=performance.now();h(this.name,"update:",s-i+" ms",t)}else(0,o.hsmls2idomPatch)(t,e,n)}constructor(t,e,n,i,s,a,o){this.refs={},this.dispatch=(t,e,n)=>c(this,void 0,void 0,(function*(){return this._dispatchAction(t,e,void 0,n)})),this._dispatchElement=(t,e)=>c(this,void 0,void 0,(function*(){this.customElement&&k(this.customElement,l.action,{type:t,data:e}),!this.customElement&&this.element&&k(this.element,l.action,{type:t,data:e})})),this._dispatchWindow=(t,e)=>c(this,void 0,void 0,(function*(){window.dispatchEvent(new CustomEvent(l.action,{detail:{type:t,data:e}}))})),this.render=()=>{if(this.debug){const t=performance.now();let e;try{e=this.view(this.state)}catch(t){r(this.name,y,t)}const n=performance.now();return h(this.name,y,n-t+" ms",e),null!=e?e:[]}{let t;try{t=this.view(this.state)}catch(t){r(this.name,y,t)}return null!=t?t:[]}},this.actionCb=(t,e,n)=>{void 0===(e=(null==e?void 0:e.constructor)===Function?e(n):e)&&n&&(e=n instanceof CustomEvent?n.detail:function(t){const e=t.target;if("FORM"===e.nodeName){t.preventDefault();const n=e.elements,i={};for(let t=0;t<n.length;t++){const e=C(n[t]);if("object"==typeof e){const s=Object.keys(e);if(s.length){const a=s[0],o=e[a];void 0===i[a]?i[a]=o:"string"==typeof i[a]||i[a]instanceof String?i[a]=o instanceof Array?[i[a],...o]:[i[a],o]:i[a]instanceof Array?o instanceof Array?i[a]=i[a].concat(o):i[a].push(o):i[a]=o instanceof Array?[i[a],...o]:[i[a],o],i[a]instanceof Array&&(i[a]=i[a].filter((t=>null!==t)),"radio"===n[t].type&&(i[a]=i[a].length?i[a][0]:null))}}}return i}return C(e)}(n)),this._dispatchAction(t,e,n)},this.mount=t=>{const e="string"==typeof t?document.getElementById(t):t;if(e&&e[_]){e[_].umount()}if(e&&!this.element){this.element=e,e[_]=this;const t=this.render();this._updateDom(e,t,this),this._dispatchAction(l.mount,this.element)}return this},this.umount=()=>{if(this.element){this._dispatchAction(l.umount,this.element),this.element.hasAttribute(_)&&this.element.removeAttribute(_);const t=this.element.querySelectorAll(`[${_}]`);for(let e=0;e<t.length;e++){const n=t[e].happ;null==n||n.umount()}for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);delete this.element.happ,this.element=void 0}return this},this.update=()=>(this.element&&!this._updateSched&&(this._updateSched=f((()=>{if(this.element){const t=this.render();this._updateDom(this.element,t,this)}this._updateSched=void 0}))),this),this.toHsml=()=>{if(this.element){if(!this._updateSched)return["div",{skip:!0}];v(this._updateSched),this._updateSched=void 0}const t=this.render();return t.push((t=>{this.element||(this.element=t,t.happ=this,this._dispatchAction(l.mount,this.element))})),["div",t]},this.toHtml=()=>this.element?this.element.outerHTML:"",this.debug=null!=s&&s,this.name=null!=a?a:_,this.attributes=null!=o?o:[],this.state=t(),this.view=e,this.dispatcher=null!=n?n:t=>c(this,void 0,void 0,(function*(){return h(this.name,w,t.type,t.data)})),this._dispatchAction(l.init,this).then((()=>i&&this.mount(i)))}}function k(t,e,n){var i,s;null==t||t.dispatchEvent(new CustomEvent(e,{detail:n})),null===(s=(i=t)[`on${e}`])||void 0===s||s.call(i,new CustomEvent(e,{detail:n}))}function C(t){let e=null;switch(t.nodeName){case"INPUT":const n=t;switch(n.type){case"text":case"hidden":case"password":case"email":case"number":case"search":case"url":case"tel":case"color":case"date":case"datetime-local":case"month":case"range":case"time":case"week":case"submit":case"button":e=n.name?{[n.name]:n.value}:n.value;break;case"radio":e=n.name?{[n.name]:n.checked?n.value:null}:n.checked?n.value:null;break;case"checkbox":e="on"===n.value?n.name?{[n.name]:n.checked}:n.checked:n.name?{[n.name]:n.checked?String(n.value):null}:n.checked?String(n.value):null}break;case"SELECT":const i=t;if(i.multiple){const t=Array.from(i.selectedOptions).map((t=>t.value));e=i.name?{[i.name]:t}:t}else e=i.name?{[i.name]:i.value}:i.value;break;case"TEXTAREA":const s=t;e=s.name?{[s.name]:s.value}:s.value;break;case"BUTTON":const a=t;e=a.name?{[a.name]:a.value}:a.value}return e}var T,x=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{h(i.next(t))}catch(t){a(t)}}function c(t){try{h(i.throw(t))}catch(t){a(t)}}function h(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,c)}h((i=i.apply(t,e||[])).next())}))};(T||(T={})).name="name",window.app=(0,a.happ)({state:function(){return{name:""}},view:function(t){return[["h1","Hello"],["input~focus",{type:"text",placeholder:"name",on:["input",T.name]}],["p",t.name?["Hello ",["b",t.name],"!"]:"Greeting"]]},dispatcher:function(t,e,n){return x(this,void 0,void 0,(function*(){switch(console.log(t),t.type){case a.HAppActions.mount:this.refs.focus.focus();break;case T.name:e.name=t.data}}))},element:"app",debug:!1})}();
|
|
2
|
+
//# sourceMappingURL=hsml-appi_demo.e5e28a65.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["src/hsml-app.ts","demo/hsml-appi_demo.ts"],"sourcesContent":["import { HAttrOnData, HAttrOnDataFnc, HElement, HElements, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst error = console.error;\nconst warn = console.warn;\n\nexport type HState<State> = () => State;\n\nexport type HView<State, HActionType extends string> = (\n state: State\n) => HElements<HActionType>;\n\nexport type HView1<State, HActionType extends string> = (\n state: State\n) => HElement<HActionType>;\n\nexport type HAppActionType =\n | \"happ-init\"\n | \"happ-mount\"\n | \"happ-umount\"\n | \"happ-update\"\n | \"happ-action\"\n | \"happ-attribute\";\n\nexport enum HAppActions {\n init = \"happ-init\",\n mount = \"happ-mount\",\n umount = \"happ-umount\",\n update = \"happ-update\",\n action = \"happ-action\",\n attribute = \"happ-attribute\"\n}\n\nexport interface HAction<HActionType extends string> {\n type: HActionType | HAppActionType | HAppActions;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatchScope =\n | \"element\"\n | \"window\";\n\nexport enum HDispatchScopes {\n element = \"element\",\n window = \"window\"\n}\n\nexport type HDispatch<HActionType extends string> = (\n type: HAction<HActionType>[\"type\"],\n data?: HAction<HActionType>[\"data\"],\n scope?: HDispatchScope | HDispatchScopes\n) => Promise<void>;\n\nexport type HDispatcher<State, HActionType extends string> = (\n // this: HApp<State, HActionType>,\n action: HAction<HActionType>,\n state: State,\n dispatch: HDispatch<HActionType>\n) => Promise<void>;\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"action:\";\nconst msgDispatch = \"dispatch:\";\nconst msgRender = \"render:\";\nconst msgUpdate = \"update:\";\n\nconst HAPP = \"happ\";\n\nexport interface HAppI<State, HActionType extends string> {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element?: Element | string | null;\n debug?: boolean;\n name?: string;\n attributes?: string[];\n}\n\n/**\n * HApp definition\n *\n * @param hAppI HApp definition\n * @returns HApp instance\n */\nexport function happ<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element: Element | string | null;\n debug?: boolean;\n name?: string;\n // attributes?: string[];\n}) {\n return new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n hAppI.element,\n hAppI.debug,\n hAppI.name\n // hAppI!.attributes\n );\n}\n\n// export type Class<T = object> = new (...args: any[]) => T;\n\n// export function happi<State, HActionType extends string>(\n// hAppI: Class<HAppI<State, HActionType>>,\n// element?: Element | string | null,\n// debug? boolean,\n// name?: string,\n// attributes: string[]\n// ) {\n// const hapi = new hAppI();\n// return new HApp<State, HActionType>(\n// hapi.state,\n// hapi.view,\n// hapi.dispatcher,\n// element,\n// debug\n// );\n// }\n\n// HAppEl\n\n/**\n * HApp custom HTML element definition.\n *\n * @param hAppI HApp definition\n */\nexport function happel<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n /** Element suffix name, element name patern is `happ-${name}` */\n name: string;\n /** Element attribute list */\n attributes: string[];\n debug?: boolean;\n}): void {\n customElements.define(\n `${HAPP}-${hAppI.name}`,\n class HAppElement extends HTMLElement {\n static get observedAttributes() {\n return hAppI.attributes;\n }\n\n private _happel: HApp<State, HActionType>;\n\n constructor() {\n super();\n this._happel = new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n undefined,\n hAppI.debug,\n hAppI.name,\n hAppI.attributes\n );\n (this._happel as any).customElement = this;\n }\n\n connectedCallback() {\n // this._happel.mount(this);\n this.attachShadow({ mode: \"open\" });\n this._happel.mount(this.shadowRoot as any);\n }\n\n disconnectedCallback() {\n this._happel.umount();\n }\n\n adoptedCallback() {\n this._happel.update();\n }\n\n attributeChangedCallback(\n attrName: string,\n oldVal: string | null,\n newVal: string | null\n ) {\n this._happel.dispatch(HAppActions.attribute, {\n attrName,\n oldVal,\n newVal,\n });\n }\n }\n );\n}\n\n/**\n * HSML App\n */\nexport class HApp<State, HActionType extends string> implements HHandlerCtx<HActionType> {\n\n readonly state: State;\n readonly view: HView<State, HActionType>;\n readonly dispatcher: HDispatcher<State, HActionType>;\n\n debug: boolean;\n\n readonly name: string;\n readonly attributes: string[];\n\n readonly element?: HTMLElement;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n readonly customElement?: HTMLElement; // happ custom html element\n\n private _updateSched?: number;\n\n // private _onDispatch?: HDispatcher<State>;\n\n private _windowEventListener?: (event: Event) => void;\n\n constructor(\n state: HState<State>,\n view: HView<State, HActionType>,\n dispatcher?: HDispatcher<State, HActionType>,\n element?: Element | string | null,\n debug?: boolean ,\n name?: string,\n attributes?: string[]\n ) {\n this.debug = debug ?? false;\n this.name = name ?? HAPP;\n this.attributes = attributes ?? [];\n this.state = state();\n this.view = view;\n this.dispatcher = dispatcher ?? (async (a) => log(this.name, msgAction, a.type, a.data));\n this._dispatchAction(HAppActions.init, this).then(() => element && this.mount(element));\n }\n\n dispatch: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any,\n scope?: HDispatchScope\n ): Promise<void> => {\n return this._dispatchAction(type, data, undefined, scope);\n }\n\n // onDispatch = (dispatcher: HDispatcher<State>): this => {\n // this._onDispatch = dispatcher;\n // return this;\n // }\n\n private async _dispatchAction(\n type: HActionType | HAppActionType,\n data?: any,\n event?: Event,\n scope?: HDispatchScope\n ): Promise<void> {\n if (this.debug) {\n log(this.name, msgAction, { type, data, event });\n const t0 = performance.now();\n await this._dispatch(type, data, event, scope);\n const t1 = performance.now();\n log(this.name, msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n await this._dispatch(type, data, event, scope);\n }\n }\n\n private async _dispatch(\n type: HActionType | HAppActionType,\n data: any,\n event?: Event,\n scope?: HDispatchScope\n ) {\n try {\n await this.dispatcher(\n { type: type as HActionType, data, event },\n this.state,\n this.dispatch\n );\n this.update();\n scope === \"element\" && this._dispatchElement(type, data);\n scope === \"window\" && this._dispatchWindow(type, data);\n } catch (e) {\n error(this.name, msgDispatch, e);\n }\n }\n\n private _dispatchElement: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any\n ): Promise<void> => {\n this.customElement && elementDispatchCustomEvent(this.customElement, HAppActions.action, { type, data });\n !this.customElement && this.element && elementDispatchCustomEvent(this.element, HAppActions.action, { type, data });\n // this.customElement && elementDispatchCustomEvent(this.customElement, type, data);\n // !this.customElement && this.element && elementDispatchCustomEvent(this.element, type, data);\n // this._onDispatch?.({ type, data, event }, this.state, this.dispatch);\n }\n\n private _dispatchWindow: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any): Promise<void> => {\n window.dispatchEvent(new CustomEvent(HAppActions.action, { detail: { type, data } }));\n }\n\n windowDispatchOn() {\n if (!this._windowEventListener) {\n this._windowEventListener = (event: Event) => {\n const action = (event as CustomEvent).detail as HAction<HActionType>;\n this._dispatchAction(action.type, action.data);\n };\n window.addEventListener(HAppActions.action, this._windowEventListener);\n } else {\n warn(\"windowEventListener olready setted\");\n }\n }\n\n windowDispatchOff() {\n if (this._windowEventListener) {\n window.removeEventListener(HAppActions.action, this._windowEventListener);\n }\n }\n\n render = (): HElements<HActionType> => {\n if (this.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n const t1 = performance.now();\n log(this.name, msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls ?? [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n return hsmls ?? [];\n }\n }\n\n actionCb = (actionType: HActionType, data: HAttrOnData, event: Event): void => {\n data = (data?.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n if (event instanceof CustomEvent) {\n data = event.detail;\n } else {\n data = formData(event);\n }\n }\n this._dispatchAction(actionType, data, event);\n }\n\n private _updateDom<HActionType extends string>(\n el: Element,\n hsml: HElements<HActionType>,\n ctx: HHandlerCtx<HActionType>\n ): void {\n if (this.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(this.name, msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n }\n\n mount = (e: Element | string | null): this => {\n const el = (typeof e === \"string\") ? document.getElementById(e) : e;\n if (el && (el as any)[HAPP]) {\n const a = (el as any)[HAPP] as HApp<State, HActionType>;\n a.umount();\n }\n if (el && !this.element) {\n (this as any).element = el;\n (el as any)[HAPP] = this;\n const hsmls = (this as any).render();\n this._updateDom<HActionType>(el, hsmls, this);\n this._dispatchAction(HAppActions.mount, this.element);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.element) {\n this._dispatchAction(HAppActions.umount, this.element);\n if (this.element.hasAttribute(HAPP)) {\n this.element.removeAttribute(HAPP);\n }\n const aNodes = this.element.querySelectorAll(`[${HAPP}]`);\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).happ as HApp<State, HActionType>;\n a?.umount();\n }\n while (this.element.firstChild /*.hasChildNodes()*/) {\n this.element.removeChild(this.element.firstChild);\n }\n delete (this.element as any).happ;\n (this as any).element = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.element && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.element) {\n const hsmls = this.render();\n this._updateDom<HActionType>(this.element, hsmls, this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement<HActionType> => {\n if (this.element) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.element) {\n (this as any).element = e;\n (e as any).happ = this;\n this._dispatchAction(HAppActions.mount, this.element);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.element ? this.element.outerHTML : \"\";\n }\n\n}\n\nfunction elementDispatchCustomEvent<HActionType extends string>(\n el: HTMLElement,\n type: HActionType,\n data: any\n) {\n el?.dispatchEvent(new CustomEvent(type, { detail: data }));\n (el as any)[`on${type}`]?.(new CustomEvent(type, { detail: data }));\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n let data: { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: iel.checked };\n } else {\n data = iel.checked;\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n","import { HElements } from \"../src/hsml\";\nimport { HAction, HApp, HAppActions, HDispatch, happ } from \"../src/hsml-app\";\n\nenum Actions {\n name = \"name\"\n}\n\ninterface State {\n name: string;\n}\n\n(window as any).app = happ<State, Actions>({\n\n state: function (): State {\n return { name: \"\" };\n },\n\n view: function (state: State): HElements<Actions> {\n return [\n [\"h1\", \"Hello\"],\n [\"input~focus\", {\n type: \"text\",\n placeholder: \"name\",\n on: [\"input\", Actions.name]\n }],\n [\"p\",\n state.name\n ? [\"Hello \", [\"b\", state.name], \"!\"]\n : \"Greeting\"\n ]\n ];\n },\n\n dispatcher: async function (this: HApp<State, Actions>, action: HAction<Actions>, state: State, dispatch: HDispatch<Actions>): Promise<void> {\n console.log(action);\n // console.log(this);\n switch (action.type) {\n\n case HAppActions.mount:\n this.refs[\"focus\"].focus();\n break;\n\n case Actions.name:\n state.name = action.data;\n break;\n }\n },\n\n element: \"app\",\n debug: false\n});\n"],"names":["$a85519cc1b20a4af$var$log","console","log","$a85519cc1b20a4af$var$error","error","$a85519cc1b20a4af$var$warn","warn","$a85519cc1b20a4af$export$3dcd9fad60135c2c","HAppActions","$a85519cc1b20a4af$export$3d736e925369e0e4","HDispatchScopes","$a85519cc1b20a4af$var$schedule","window","requestAnimationFrame","callback","setTimeout","$a85519cc1b20a4af$var$unschedule","cancelAnimationFrame","handle","clearTimeout","$a85519cc1b20a4af$var$msgAction","$a85519cc1b20a4af$var$msgDispatch","$a85519cc1b20a4af$var$msgRender","$a85519cc1b20a4af$var$HAPP","$a85519cc1b20a4af$export$eb8950696418f795","hAppI","$a85519cc1b20a4af$export$8cfef5dc37c46888","state","view","dispatcher","element","debug","name","$a85519cc1b20a4af$export$1cfc54b3834d3c50","customElements","define","HTMLElement","observedAttributes","attributes","connectedCallback","this","attachShadow","mode","_happel","mount","shadowRoot","disconnectedCallback","umount","adoptedCallback","update","attributeChangedCallback","attrName","oldVal","newVal","dispatch","attribute","constructor","super","undefined","customElement","_dispatchAction","type","data","event","scope","t0","performance","now","_dispatch","t1","_dispatchElement","_dispatchWindow","e","windowDispatchOn","_windowEventListener","action","detail","addEventListener","windowDispatchOff","removeEventListener","_updateDom","el","hsml","ctx","$8IJ2T","hsmls2idomPatch","refs","$a85519cc1b20a4af$var$__awaiter","$a85519cc1b20a4af$var$elementDispatchCustomEvent","dispatchEvent","CustomEvent","render","hsmls","actionCb","actionType","Function","target","nodeName","preventDefault","els","elements","i","length","d","$a85519cc1b20a4af$var$formInputData","names","Object","keys","value","String","Array","concat","push","filter","$a85519cc1b20a4af$var$formData","document","getElementById","hasAttribute","removeAttribute","aNodes","querySelectorAll","a","happ","firstChild","removeChild","_updateSched","toHsml","skip","toHtml","outerHTML","init","then","_b","_a","call","iel","checked","sel","multiple","values","from","selectedOptions","map","o","tel","bel","$e27ccf3f139ade02$var$Actions","app","$a85519cc1b20a4af$exports","placeholder","on","focus"],"version":3,"file":"hsml-appi_demo.e5e28a65.js.map"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function t(t,e,n,i){Object.defineProperty(t,e,{get:n,set:i,enumerable:!0,configurable:!0})}var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},i={},s=e.parcelRequirede31;null==s&&((s=function(t){if(t in n)return n[t].exports;if(t in i){var e=i[t];delete i[t];var s={id:t,exports:{}};return n[t]=s,e.call(s.exports,s,s.exports),s.exports}var a=new Error("Cannot find module '"+t+"'");throw a.code="MODULE_NOT_FOUND",a}).register=function(t,e){i[t]=e},e.parcelRequirede31=s);var a={};t(a,"HAppActions",(function(){return l}),(function(t){return l=t})),t(a,"HDispatchScopes",(function(){return m}),(function(t){return m=t})),t(a,"happ",(function(){return g}),(function(t){return g=t})),t(a,"HApp",(function(){return A}),(function(t){return A=t})),t(a,"happel",(function(){return E}),(function(t){return E=t}));var o=s("hrCkK"),c=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{h(i.next(t))}catch(t){a(t)}}function c(t){try{h(i.throw(t))}catch(t){a(t)}}function h(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,c)}h((i=i.apply(t,e||[])).next())}))};const h=console.log,r=console.error,u=console.warn;var l,d,m,p;(d=l||(l={})).init="happ-init",d.mount="happ-mount",d.umount="happ-umount",d.update="happ-update",d.action="happ-action",d.attribute="happ-attribute",(p=m||(m={})).element="element",p.window="window";const f=window.requestAnimationFrame||function(t){window.setTimeout(t,1e3/60)},v=window.cancelAnimationFrame||function(t){window.clearTimeout(t)},w="action:",b="dispatch:",y="render:",_="happ";function g(t){return new A(t.state,t.view,t.dispatcher,t.element,t.debug,t.name)}function E(t){customElements.define(`${_}-${t.name}`,class extends HTMLElement{static get observedAttributes(){return t.attributes}connectedCallback(){this.attachShadow({mode:"open"}),this._happel.mount(this.shadowRoot)}disconnectedCallback(){this._happel.umount()}adoptedCallback(){this._happel.update()}attributeChangedCallback(t,e,n){this._happel.dispatch(l.attribute,{attrName:t,oldVal:e,newVal:n})}constructor(){super(),this._happel=new A(t.state,t.view,t.dispatcher,void 0,t.debug,t.name,t.attributes),this._happel.customElement=this}})}class A{_dispatchAction(t,e,n,i){return c(this,void 0,void 0,(function*(){if(this.debug){h(this.name,w,{type:t,data:e,event:n});const s=performance.now();yield this._dispatch(t,e,n,i);const a=performance.now();h(this.name,b,a-s+" ms",this.state)}else yield this._dispatch(t,e,n,i)}))}_dispatch(t,e,n,i){return c(this,void 0,void 0,(function*(){try{yield this.dispatcher({type:t,data:e,event:n},this.state,this.dispatch),this.update(),"element"===i&&this._dispatchElement(t,e),"window"===i&&this._dispatchWindow(t,e)}catch(t){r(this.name,b,t)}}))}windowDispatchOn(){this._windowEventListener?u("windowEventListener olready setted"):(this._windowEventListener=t=>{const e=t.detail;this._dispatchAction(e.type,e.data)},window.addEventListener(l.action,this._windowEventListener))}windowDispatchOff(){this._windowEventListener&&window.removeEventListener(l.action,this._windowEventListener)}_updateDom(t,e,n){if(this.debug){const i=performance.now();(0,o.hsmls2idomPatch)(t,e,n);const s=performance.now();h(this.name,"update:",s-i+" ms",t)}else(0,o.hsmls2idomPatch)(t,e,n)}constructor(t,e,n,i,s,a,o){this.refs={},this.dispatch=(t,e,n)=>c(this,void 0,void 0,(function*(){return this._dispatchAction(t,e,void 0,n)})),this._dispatchElement=(t,e)=>c(this,void 0,void 0,(function*(){this.customElement&&k(this.customElement,l.action,{type:t,data:e}),!this.customElement&&this.element&&k(this.element,l.action,{type:t,data:e})})),this._dispatchWindow=(t,e)=>c(this,void 0,void 0,(function*(){window.dispatchEvent(new CustomEvent(l.action,{detail:{type:t,data:e}}))})),this.render=()=>{if(this.debug){const t=performance.now();let e;try{e=this.view(this.state)}catch(t){r(this.name,y,t)}const n=performance.now();return h(this.name,y,n-t+" ms",e),null!=e?e:[]}{let t;try{t=this.view(this.state)}catch(t){r(this.name,y,t)}return null!=t?t:[]}},this.actionCb=(t,e,n)=>{void 0===(e=(null==e?void 0:e.constructor)===Function?e(n):e)&&n&&(e=n instanceof CustomEvent?n.detail:function(t){const e=t.target;if("FORM"===e.nodeName){t.preventDefault();const n=e.elements,i={};for(let t=0;t<n.length;t++){const e=C(n[t]);if("object"==typeof e){const s=Object.keys(e);if(s.length){const a=s[0],o=e[a];void 0===i[a]?i[a]=o:"string"==typeof i[a]||i[a]instanceof String?i[a]=o instanceof Array?[i[a],...o]:[i[a],o]:i[a]instanceof Array?o instanceof Array?i[a]=i[a].concat(o):i[a].push(o):i[a]=o instanceof Array?[i[a],...o]:[i[a],o],i[a]instanceof Array&&(i[a]=i[a].filter((t=>null!==t)),"radio"===n[t].type&&(i[a]=i[a].length?i[a][0]:null))}}}return i}return C(e)}(n)),this._dispatchAction(t,e,n)},this.mount=t=>{const e="string"==typeof t?document.getElementById(t):t;if(e&&e[_]){e[_].umount()}if(e&&!this.element){this.element=e,e[_]=this;const t=this.render();this._updateDom(e,t,this),this._dispatchAction(l.mount,this.element)}return this},this.umount=()=>{if(this.element){this._dispatchAction(l.umount,this.element),this.element.hasAttribute(_)&&this.element.removeAttribute(_);const t=this.element.querySelectorAll(`[${_}]`);for(let e=0;e<t.length;e++){const n=t[e].happ;null==n||n.umount()}for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);delete this.element.happ,this.element=void 0}return this},this.update=()=>(this.element&&!this._updateSched&&(this._updateSched=f((()=>{if(this.element){const t=this.render();this._updateDom(this.element,t,this)}this._updateSched=void 0}))),this),this.toHsml=()=>{if(this.element){if(!this._updateSched)return["div",{skip:!0}];v(this._updateSched),this._updateSched=void 0}const t=this.render();return t.push((t=>{this.element||(this.element=t,t.happ=this,this._dispatchAction(l.mount,this.element))})),["div",t]},this.toHtml=()=>this.element?this.element.outerHTML:"",this.debug=null!=s&&s,this.name=null!=a?a:_,this.attributes=null!=o?o:[],this.state=t(),this.view=e,this.dispatcher=null!=n?n:t=>c(this,void 0,void 0,(function*(){return h(this.name,w,t.type,t.data)})),this._dispatchAction(l.init,this).then((()=>i&&this.mount(i)))}}function k(t,e,n){var i,s;null==t||t.dispatchEvent(new CustomEvent(e,{detail:n})),null===(s=(i=t)[`on${e}`])||void 0===s||s.call(i,new CustomEvent(e,{detail:n}))}function C(t){let e=null;switch(t.nodeName){case"INPUT":const n=t;switch(n.type){case"text":case"hidden":case"password":case"email":case"number":case"search":case"url":case"tel":case"color":case"date":case"datetime-local":case"month":case"range":case"time":case"week":case"submit":case"button":e=n.name?{[n.name]:n.value}:n.value;break;case"radio":e=n.name?{[n.name]:n.checked?n.value:null}:n.checked?n.value:null;break;case"checkbox":e="on"===n.value?n.name?{[n.name]:n.checked}:n.checked:n.name?{[n.name]:n.checked?String(n.value):null}:n.checked?String(n.value):null}break;case"SELECT":const i=t;if(i.multiple){const t=Array.from(i.selectedOptions).map((t=>t.value));e=i.name?{[i.name]:t}:t}else e=i.name?{[i.name]:i.value}:i.value;break;case"TEXTAREA":const s=t;e=s.name?{[s.name]:s.value}:s.value;break;case"BUTTON":const a=t;e=a.name?{[a.name]:a.value}:a.value}return e}var x,S=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{h(i.next(t))}catch(t){a(t)}}function c(t){try{h(i.throw(t))}catch(t){a(t)}}function h(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,c)}h((i=i.apply(t,e||[])).next())}))};(x||(x={})).name="name",window.app=(0,a.happ)({state:function(){return{name:""}},view:function(t){return[["h1","Hello"],["input~focus",{type:"text",placeholder:"name",on:["input",x.name]}],["p",t.name?["Hello ",["b",t.name],"!"]:"Greeting"]]},dispatcher:function(t,e,n){return S(this,void 0,void 0,(function*(){switch(console.log(t),t.type){case a.HAppActions.mount:this.refs.focus.focus();break;case x.name:e.name=t.data}}))},element:"app",debug:!1});
|
|
2
|
+
//# sourceMappingURL=hsml-appi_demo.fef950c1.js.map
|