peryl 1.5.23 → 1.5.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/demo/hash_demo.ts +2 -3
  2. package/demo/hsml-app-tictactoe_demo.ts +2 -3
  3. package/dist/browser-esmodule/debounce.js +2 -4
  4. package/dist/browser-esmodule/debounce.js.map +1 -1
  5. package/dist/browser-esmodule/hash.js.map +1 -1
  6. package/dist/browser-esmodule/hsml-app.js +7 -1
  7. package/dist/browser-esmodule/hsml-app.js.map +1 -1
  8. package/dist/browser-esmodule/hsml-dom.js +7 -1
  9. package/dist/browser-esmodule/hsml-dom.js.map +1 -1
  10. package/dist/browser-esmodule/hsml-html.js +7 -1
  11. package/dist/browser-esmodule/hsml-html.js.map +1 -1
  12. package/dist/browser-esmodule/hsml-idom.js +7 -1
  13. package/dist/browser-esmodule/hsml-idom.js.map +1 -1
  14. package/dist/browser-esmodule/hsml.js +8 -2
  15. package/dist/browser-esmodule/hsml.js.map +1 -1
  16. package/dist/browser-esmodule/index.js +9 -5
  17. package/dist/browser-esmodule/index.js.map +1 -1
  18. package/dist/browser-umd/debounce.js +1 -1
  19. package/dist/browser-umd/debounce.js.map +1 -1
  20. package/dist/browser-umd/hash.js.map +1 -1
  21. package/dist/browser-umd/hsml-app.js +1 -1
  22. package/dist/browser-umd/hsml-app.js.map +1 -1
  23. package/dist/browser-umd/hsml-dom.js +1 -1
  24. package/dist/browser-umd/hsml-dom.js.map +1 -1
  25. package/dist/browser-umd/hsml-html.js +1 -1
  26. package/dist/browser-umd/hsml-html.js.map +1 -1
  27. package/dist/browser-umd/hsml-idom.js +1 -1
  28. package/dist/browser-umd/hsml-idom.js.map +1 -1
  29. package/dist/browser-umd/hsml.js +1 -1
  30. package/dist/browser-umd/hsml.js.map +1 -1
  31. package/dist/browser-umd/index.js +1 -1
  32. package/dist/browser-umd/index.js.map +1 -1
  33. package/dist/debounce.d.ts +1 -3
  34. package/dist/debounce.js +2 -4
  35. package/dist/debounce.js.map +1 -1
  36. package/dist/demo/{hash_demo.7e0ef005.js → hash_demo.4e831ae6.js} +2 -2
  37. package/dist/demo/hash_demo.4e831ae6.js.map +1 -0
  38. package/dist/demo/{hash_demo.57b93f2a.js → hash_demo.80993753.js} +2 -2
  39. package/dist/demo/hash_demo.80993753.js.map +1 -0
  40. package/dist/demo/hash_demo.html +1 -1
  41. package/dist/demo/hsml-app-bysquare_demo.html +1 -1
  42. package/dist/demo/hsml-app-form-validation_demo.html +1 -1
  43. package/dist/demo/hsml-app-form_demo.html +1 -1
  44. package/dist/demo/hsml-app-test_demo.html +1 -1
  45. package/dist/demo/hsml-app-tictactoe_demo.06bc822a.js +2 -0
  46. package/dist/demo/hsml-app-tictactoe_demo.06bc822a.js.map +1 -0
  47. package/dist/demo/hsml-app-tictactoe_demo.edcb7a3e.js +2 -0
  48. package/dist/demo/hsml-app-tictactoe_demo.edcb7a3e.js.map +1 -0
  49. package/dist/demo/hsml-app-tictactoe_demo.html +1 -1
  50. package/dist/demo/hsml-app_demo.html +1 -1
  51. package/dist/demo/hsml-appel_demo.html +1 -1
  52. package/dist/demo/hsml-appi_demo.html +1 -1
  53. package/dist/demo/hsml_demo.11dae6c9.js +2 -0
  54. package/dist/demo/hsml_demo.11dae6c9.js.map +1 -0
  55. package/dist/demo/hsml_demo.c2b93717.js +2 -0
  56. package/dist/demo/hsml_demo.c2b93717.js.map +1 -0
  57. package/dist/demo/hsml_demo.html +1 -1
  58. package/dist/hash.d.ts +2 -2
  59. package/dist/hsml.d.ts +4 -1
  60. package/dist/hsml.js +5 -2
  61. package/dist/hsml.js.map +1 -1
  62. package/package.json +1 -1
  63. package/src/debounce.ts +21 -8
  64. package/src/hash.ts +2 -2
  65. package/src/hsml.ts +12 -1
  66. package/dist/demo/hash_demo.57b93f2a.js.map +0 -1
  67. package/dist/demo/hash_demo.7e0ef005.js.map +0 -1
  68. package/dist/demo/hsml-app-tictactoe_demo.84aaf792.js +0 -2
  69. package/dist/demo/hsml-app-tictactoe_demo.84aaf792.js.map +0 -1
  70. package/dist/demo/hsml-app-tictactoe_demo.868e02e5.js +0 -2
  71. package/dist/demo/hsml-app-tictactoe_demo.868e02e5.js.map +0 -1
  72. package/dist/demo/hsml_demo.967b2a46.js +0 -2
  73. package/dist/demo/hsml_demo.967b2a46.js.map +0 -1
  74. package/dist/demo/hsml_demo.d6914957.js +0 -2
  75. package/dist/demo/hsml_demo.d6914957.js.map +0 -1
package/demo/hash_demo.ts CHANGED
@@ -12,7 +12,6 @@ interface Query {
12
12
  c: string;
13
13
  time: string;
14
14
  u?: string;
15
- n?: string;
16
15
  }
17
16
 
18
17
  const h = new hash.Hash<hash.HashUrlData<keyof Query>>(emitWritten)
@@ -26,8 +25,8 @@ const h = new hash.Hash<hash.HashUrlData<keyof Query>>(emitWritten)
26
25
  // .write("hello");
27
26
  // .write({ message: "hello" });
28
27
  .write({
29
- path: ["hello", "peter"],
30
- query: { a: "a?a", b: "b&b", c: " .%", u: undefined, n: null }
28
+ path: ["hello", "peter", undefined],
29
+ query: { a: "a?a", b: "b&b", c: " .%", u: undefined }
31
30
  });
32
31
 
33
32
  (self as any).h = h;
@@ -1,7 +1,6 @@
1
- import { HElement, HElements } from "../src/hsml";
2
- import { HAction, HApp, HDispatch } from "../src/hsml-app";
1
+ import { HElement, HElements, NBSP } from "../src/hsml";
2
+ import { HApp } from "../src/hsml-app";
3
3
 
4
- const NBSP = "\u00A0";
5
4
  const CIRC = "\u25EF";
6
5
  const CROS = "\u2A2F";
7
6
 
@@ -5,13 +5,11 @@ var $0ce6b4362c09d565$exports = {};
5
5
 
6
6
  $parcel$export($0ce6b4362c09d565$exports, "debounce", function () { return $0ce6b4362c09d565$export$61fc7d43ac8f84b0; });
7
7
  $parcel$export($0ce6b4362c09d565$exports, "Debounce", function () { return $0ce6b4362c09d565$export$73cca143ae6d0e61; });
8
- function $0ce6b4362c09d565$export$61fc7d43ac8f84b0(func, delay = 300) {
8
+ function $0ce6b4362c09d565$export$61fc7d43ac8f84b0(fnc, delay = 300) {
9
9
  let timeout;
10
10
  return function(...args) {
11
11
  clearTimeout(timeout);
12
- timeout = setTimeout(()=>{
13
- func.apply(this, args);
14
- }, delay);
12
+ timeout = setTimeout(()=>fnc.apply(this, args), delay);
15
13
  };
16
14
  }
17
15
  function $0ce6b4362c09d565$export$73cca143ae6d0e61(delay = 300) {
@@ -1 +1 @@
1
- {"mappings":";;;;;;;AAGM,SAAU,0CAAwB,IAAO,EAAE,QAAQ,GAAG,EAA5D;IAEI,IAAI;IACJ,OAAO,SAAqB,GAAG,IAAU,EAAzC;QACI,aAAa;QACb,UAAU,WAAW,IAArB;YACI,KAAK,KAAK,CAAC,IAAI,EAAE;QACrB,GAAG;IACP;AACJ;AAGM,SAAU,0CAAS,QAAQ,GAAG,EAApC;IACI,OAAO,SAAU,MAAW,EAAE,WAAmB,EAAE,UAA8B,EAAjF;QACI,MAAM,SAAS,WAAW,KAAK;QAC/B,WAAW,KAAK,GAAG,0CAAS,QAAQ;QACpC,OAAO;IACX;AACJ","sources":["src/debounce.ts"],"sourcesContent":["\ntype Fnc = (...args: any[]) => void;\n\nexport function debounce<F extends Fnc>(func: F, delay = 300) {\n type Args = F extends (...args: infer P) => void ? P : never;\n let timeout: number | NodeJS.Timeout;\n return function (this: any, ...args: Args) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, delay);\n };\n}\n\n// Method decorator\nexport function Debounce(delay = 300) {\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const method = descriptor.value;\n descriptor.value = debounce(method, delay);\n return descriptor;\n };\n}\n\n\n// TEST\n\n// const d = debounce(\n// function (this: any, x: string, y: number) {\n// console.log(\"debounce\", x, y);\n// },\n// 300);\n// d(\"peter\", 3);\n\n// const o = {\n// x: \"o.x\",\n// m: function (y: number) {\n// console.log(\"o.m\", this.x, y);\n// },\n// d: ({} as any)\n// };\n// o.d = debounce(o.m, 300);\n// o.d(\"test\");\n\n// class O {\n// x: string = \"O.x\";\n\n// @Debounce(300)\n// m(y: string) {\n// console.log(\"O.m\", this.x, y);\n// }\n// }\n// const obj = new O();\n// // obj.m = debounce(obj.m, 300); // decorator equivalent\n// obj.m(\"m(p)\");\n\n// setTimeout(() => obj.m(\"m(p) 200\"), 200);\n// setTimeout(() => obj.m(\"m(p) 1200\"), 1200);\n// setTimeout(() => obj.m(\"m(p) 1400\"), 1400);\n// setTimeout(() => obj.m(\"m(p) 2200\"), 2200);\n// setTimeout(() => obj.m(\"m(p) 2400\"), 2400);\n"],"names":[],"version":3,"file":"debounce.js.map"}
1
+ {"mappings":";;;;;;;AAEM,SAAU,0CAA4C,GAAM,EAAE,QAAQ,GAAG,EAA/E;IACI,IAAI;IACJ,OAAO,SAAqB,GAAG,IAAmB,EAAlD;QACI,aAAa;QACb,UAAU,WAAW,IAAM,IAAI,KAAK,CAAC,IAAI,EAAE,OAAO;IACtD;AACJ;AAaM,SAAU,0CAAS,QAAQ,GAAG,EAApC;IACI,OAAO,SAAU,MAAW,EAAE,WAAmB,EAAE,UAA8B,EAAjF;QACI,MAAM,SAAS,WAAW,KAAK;QAC/B,WAAW,KAAK,GAAG,0CAAS,QAAQ;QACpC,OAAO;IACX;AACJ","sources":["src/debounce.ts"],"sourcesContent":["\n\nexport function debounce<F extends (...args: any[]) => any>(fnc: F, delay = 300) {\n let timeout: number | NodeJS.Timeout | undefined;\n return function (this: any, ...args: Parameters<F>) {\n clearTimeout(timeout);\n timeout = setTimeout(() => fnc.apply(this, args), delay);\n };\n}\n\n// export function debounceAsync<F extends (...args: any[]) => any>(fnc: F, delay = 300) {\n// let timeout: number | NodeJS.Timeout | undefined;\n// return function (this: ThisParameterType<F>, ...args: Parameters<F>) {\n// clearTimeout(timeout);\n// return new Promise<ReturnType<F>>((resolve) => {\n// timeout = setTimeout(() => resolve(fnc.apply(this, args)), delay);\n// });\n// };\n// }\n\n// Method decorator\nexport function Debounce(delay = 300) {\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const method = descriptor.value;\n descriptor.value = debounce(method, delay);\n return descriptor;\n };\n}\n\n\n// TEST\n\n// const d = debounce(\n// function (this: any, x: string, y: number) {\n// console.log(\"debounce\", x, y);\n// },\n// 300);\n// d(\"peter\", 3);\n\n// const da = debounceAsync(\n// function (this: any, x: string, y: number) {\n// console.log(\"debounce\", x, y);\n// },\n// 300);\n// da(\"peter\", 3).then(res => console.log(\"async\", res));\n\n// const o = {\n// x: \"o.x\",\n// m: function (y: number) {\n// console.log(\"o.m\", this.x, y);\n// },\n// d: ({} as any)\n// };\n// o.d = debounce(o.m, 300);\n// o.d(\"test\");\n\n// class O {\n// x: string = \"O.x\";\n\n// @Debounce(300)\n// m(y: string) {\n// console.log(\"O.m\", this.x, y);\n// }\n// }\n// const obj = new O();\n// // obj.m = debounce(obj.m, 300); // decorator equivalent\n// obj.m(\"m(p)\");\n\n// setTimeout(() => obj.m(\"m(p) 200\"), 200);\n// setTimeout(() => obj.m(\"m(p) 1200\"), 1200);\n// setTimeout(() => obj.m(\"m(p) 1400\"), 1400);\n// setTimeout(() => obj.m(\"m(p) 2200\"), 2200);\n// setTimeout(() => obj.m(\"m(p) 2400\"), 2400);\n"],"names":[],"version":3,"file":"debounce.js.map"}
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/hash.ts"],"sourcesContent":["\nexport interface HashUrlData <QueryKeys extends string = string> {\n path: (string | undefined | null)[];\n query: {\n [key in QueryKeys]?: string | string[] | undefined | null;\n };\n}\n\nexport const hashJsonEncode = (data: any) => data ? encodeURIComponent(JSON.stringify(data)) : \"\";\nexport const hashJsonDecode = (str: string) => str ? JSON.parse(decodeURIComponent(str)) : undefined;\n\nexport const hashUrlEncode = <QueryKeys extends string = string>(data: HashUrlData<QueryKeys>): string => {\n // console.log(data);\n const d = typeof data === \"string\"\n ? hashUrlDecode(data)\n : data as HashUrlData;\n const dpath = d.path ?? [];\n const dquery = d.query ?? {};\n const path = dpath.map(p => encodeURIComponent(p ?? \"\")).join(\"/\");\n // const params = new URLSearchParams();\n const query = Object.entries(dquery)\n .reduce(\n (p, c) => {\n if (typeof c[1] === \"string\") {\n p.append(c[0], c[1]);\n } else if (c[1] && typeof c[1].length === \"number\") {\n (c[1] as Array<any>).forEach(v => p.append(c[0], v));\n }\n return p;\n },\n new URLSearchParams())\n .toString();\n const str = `${path}${query ? \"?\" : \"\"}${query}`;\n // console.log(str);\n return str;\n};\n\nexport const hashUrlDecode = <QueryKeys extends string = string>(str: string): HashUrlData<QueryKeys> => {\n // console.log(str);\n const [pathStr, queryStr] = str.split(\"?\");\n // const pathStr = str.substring(0, str.indexOf(\"?\"));\n // const queryStr = str.substring(str.indexOf(\"?\") + 1);\n const path = pathStr.split(\"/\").map(p => decodeURIComponent(p));\n const query = {} as any;\n for (const e of new URLSearchParams(queryStr).entries()) {\n const [k, v] = e;\n if (k in query) {\n if (typeof query[k] === \"string\") {\n query[k] = [query[k], v];\n } else {\n query[k].push(v);\n }\n } else {\n query[k] = v;\n }\n }\n const data = { path, query };\n // console.log(data);\n return data;\n};\n\nexport class Hash<T = string> {\n\n private _cb?: (data: T) => void;\n\n private _emitWritten: boolean;\n private _writtenDataJson?: string;\n\n private _encode = (data: T) => String(data);\n private _decode = (str: string) => str as any as T;\n\n constructor(emitWritten = true) {\n this._emitWritten = emitWritten;\n }\n\n onChange(cb: (data: T) => void): this {\n this._cb = cb;\n return this;\n }\n\n coders(encode: (data: T) => string,\n decode: (data: string) => T): this {\n this._encode = encode;\n this._decode = decode;\n return this;\n }\n\n listen(): this {\n this._cb && this._cb(this.read());\n if (\"onhashchange\" in window) {\n onhashchange = () => {\n const data = this.read();\n // console.log(\"onhashchange\", location.hash, data);\n if (!this._emitWritten) {\n const written = this._writtenDataJson === JSON.stringify(data);\n this._writtenDataJson = undefined;\n if (!written) {\n this._cb && this._cb(data);\n }\n } else {\n this._cb && this._cb(data);\n }\n };\n } else {\n alert(`Browser \"window.onhashchange\" not implemented`);\n // let prevHash = location.hash;\n // if (this._iId) {\n // clearInterval(this._iId);\n // }\n // this._iId = setInterval(() => {\n // if (location.hash !== prevHash) {\n // prevHash = location.hash;\n // const written = this._dataJson === location.hash;\n // this._dataJson = undefined;\n // if (this._emitWritten || !written) {\n // this._cb && this._cb(data);\n // }\n // }\n // }, 500);\n }\n return this;\n }\n\n read(): T {\n return this._decode(location.hash.slice(1));\n }\n\n write(data: T): this {\n location.hash = this._encode(data);\n if (!this._emitWritten) {\n this._writtenDataJson = JSON.stringify(data);\n this._cb && this._cb(data);\n }\n return this;\n }\n\n}\n"],"names":[],"version":3,"file":"hash.js.map"}
1
+ {"mappings":"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","sources":["src/hash.ts"],"sourcesContent":["\nexport interface HashUrlData <QueryKeys extends string = string> {\n path: (string | undefined)[];\n query: {\n [key in QueryKeys]?: string | string[] | undefined;\n };\n}\n\nexport const hashJsonEncode = (data: any) => data ? encodeURIComponent(JSON.stringify(data)) : \"\";\nexport const hashJsonDecode = (str: string) => str ? JSON.parse(decodeURIComponent(str)) : undefined;\n\nexport const hashUrlEncode = <QueryKeys extends string = string>(data: HashUrlData<QueryKeys>): string => {\n // console.log(data);\n const d = typeof data === \"string\"\n ? hashUrlDecode(data)\n : data as HashUrlData;\n const dpath = d.path ?? [];\n const dquery = d.query ?? {};\n const path = dpath.map(p => encodeURIComponent(p ?? \"\")).join(\"/\");\n // const params = new URLSearchParams();\n const query = Object.entries(dquery)\n .reduce(\n (p, c) => {\n if (typeof c[1] === \"string\") {\n p.append(c[0], c[1]);\n } else if (c[1] && typeof c[1].length === \"number\") {\n (c[1] as Array<any>).forEach(v => p.append(c[0], v));\n }\n return p;\n },\n new URLSearchParams())\n .toString();\n const str = `${path}${query ? \"?\" : \"\"}${query}`;\n // console.log(str);\n return str;\n};\n\nexport const hashUrlDecode = <QueryKeys extends string = string>(str: string): HashUrlData<QueryKeys> => {\n // console.log(str);\n const [pathStr, queryStr] = str.split(\"?\");\n // const pathStr = str.substring(0, str.indexOf(\"?\"));\n // const queryStr = str.substring(str.indexOf(\"?\") + 1);\n const path = pathStr.split(\"/\").map(p => decodeURIComponent(p));\n const query = {} as any;\n for (const e of new URLSearchParams(queryStr).entries()) {\n const [k, v] = e;\n if (k in query) {\n if (typeof query[k] === \"string\") {\n query[k] = [query[k], v];\n } else {\n query[k].push(v);\n }\n } else {\n query[k] = v;\n }\n }\n const data = { path, query };\n // console.log(data);\n return data;\n};\n\nexport class Hash<T = string> {\n\n private _cb?: (data: T) => void;\n\n private _emitWritten: boolean;\n private _writtenDataJson?: string;\n\n private _encode = (data: T) => String(data);\n private _decode = (str: string) => str as any as T;\n\n constructor(emitWritten = true) {\n this._emitWritten = emitWritten;\n }\n\n onChange(cb: (data: T) => void): this {\n this._cb = cb;\n return this;\n }\n\n coders(encode: (data: T) => string,\n decode: (data: string) => T): this {\n this._encode = encode;\n this._decode = decode;\n return this;\n }\n\n listen(): this {\n this._cb && this._cb(this.read());\n if (\"onhashchange\" in window) {\n onhashchange = () => {\n const data = this.read();\n // console.log(\"onhashchange\", location.hash, data);\n if (!this._emitWritten) {\n const written = this._writtenDataJson === JSON.stringify(data);\n this._writtenDataJson = undefined;\n if (!written) {\n this._cb && this._cb(data);\n }\n } else {\n this._cb && this._cb(data);\n }\n };\n } else {\n alert(`Browser \"window.onhashchange\" not implemented`);\n // let prevHash = location.hash;\n // if (this._iId) {\n // clearInterval(this._iId);\n // }\n // this._iId = setInterval(() => {\n // if (location.hash !== prevHash) {\n // prevHash = location.hash;\n // const written = this._dataJson === location.hash;\n // this._dataJson = undefined;\n // if (this._emitWritten || !written) {\n // this._cb && this._cb(data);\n // }\n // }\n // }, 500);\n }\n return this;\n }\n\n read(): T {\n return this._decode(location.hash.slice(1));\n }\n\n write(data: T): this {\n location.hash = this._encode(data);\n if (!this._emitWritten) {\n this._writtenDataJson = JSON.stringify(data);\n this._cb && this._cb(data);\n }\n return this;\n }\n\n}\n"],"names":[],"version":3,"file":"hash.js.map"}
@@ -15,9 +15,15 @@ $parcel$export($32c8c7b45dace799$exports, "hsmls2idomPatch", function () { retur
15
15
  var $a15669afd069c056$exports = {};
16
16
 
17
17
  $parcel$export($a15669afd069c056$exports, "NBSP", function () { return $a15669afd069c056$export$4442f9d5f627adc8; });
18
+ $parcel$export($a15669afd069c056$exports, "NNBSP", function () { return $a15669afd069c056$export$3027455780d8394; });
19
+ $parcel$export($a15669afd069c056$exports, "THSP", function () { return $a15669afd069c056$export$76bbc0cf5037aeea; });
20
+ $parcel$export($a15669afd069c056$exports, "NUMSP", function () { return $a15669afd069c056$export$480ed2f7fd18b4a2; });
18
21
  $parcel$export($a15669afd069c056$exports, "hsml", function () { return $a15669afd069c056$export$8f4ee6ea2853750b; });
19
22
  $parcel$export($a15669afd069c056$exports, "hjoin", function () { return $a15669afd069c056$export$7427c8b17ccb408c; });
20
- const $a15669afd069c056$export$4442f9d5f627adc8 = "\xa0 ";
23
+ const $a15669afd069c056$export$4442f9d5f627adc8 = "\xa0";
24
+ const $a15669afd069c056$export$3027455780d8394 = " ";
25
+ const $a15669afd069c056$export$76bbc0cf5037aeea = " ";
26
+ const $a15669afd069c056$export$480ed2f7fd18b4a2 = " ";
21
27
  function $a15669afd069c056$export$8f4ee6ea2853750b(hml, handler, ctx) {
22
28
  if (hml === undefined || hml === null) return;
23
29
  switch(hml.constructor){