@kirill.konshin/utils 0.0.18 → 0.0.19

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 (170) hide show
  1. package/.turbo/turbo-build.log +39 -39
  2. package/.turbo/turbo-test.log +36 -36
  3. package/CHANGELOG.md +6 -0
  4. package/dist/bootstrap/adaptiveContainer.d.ts +2 -1
  5. package/dist/bootstrap/adaptiveContainer.d.ts.map +1 -1
  6. package/dist/bootstrap/adaptiveContainer.js +2 -2
  7. package/dist/bootstrap/adaptiveContainer.js.map +1 -1
  8. package/dist/bootstrap/controls.d.ts +6 -6
  9. package/dist/bootstrap/controls.d.ts.map +1 -1
  10. package/dist/bootstrap/controls.js.map +1 -1
  11. package/dist/bootstrap/error.d.ts +4 -2
  12. package/dist/bootstrap/error.d.ts.map +1 -1
  13. package/dist/bootstrap/error.js +2 -7
  14. package/dist/bootstrap/error.js.map +1 -1
  15. package/dist/bootstrap/field.d.ts +4 -2
  16. package/dist/bootstrap/field.d.ts.map +1 -1
  17. package/dist/bootstrap/field.js +2 -2
  18. package/dist/bootstrap/field.js.map +1 -1
  19. package/dist/bootstrap/footer.d.ts +5 -5
  20. package/dist/bootstrap/footer.d.ts.map +1 -1
  21. package/dist/bootstrap/footer.js +9 -4
  22. package/dist/bootstrap/footer.js.map +1 -1
  23. package/dist/bootstrap/globalLoading.d.ts +4 -2
  24. package/dist/bootstrap/globalLoading.d.ts.map +1 -1
  25. package/dist/bootstrap/globalLoading.js +2 -2
  26. package/dist/bootstrap/globalLoading.js.map +1 -1
  27. package/dist/bootstrap/loading.d.ts +4 -2
  28. package/dist/bootstrap/loading.d.ts.map +1 -1
  29. package/dist/bootstrap/loading.js +3 -2
  30. package/dist/bootstrap/loading.js.map +1 -1
  31. package/dist/bootstrap/responsiveHelper.d.ts +2 -1
  32. package/dist/bootstrap/responsiveHelper.d.ts.map +1 -1
  33. package/dist/bootstrap/responsiveHelper.js +5 -5
  34. package/dist/bootstrap/responsiveHelper.js.map +1 -1
  35. package/dist/bootstrap/screen.d.ts +4 -2
  36. package/dist/bootstrap/screen.d.ts.map +1 -1
  37. package/dist/bootstrap/screen.js +3 -2
  38. package/dist/bootstrap/screen.js.map +1 -1
  39. package/dist/bootstrap/toaster.d.ts +4 -2
  40. package/dist/bootstrap/toaster.d.ts.map +1 -1
  41. package/dist/bootstrap/toaster.js +2 -5
  42. package/dist/bootstrap/toaster.js.map +1 -1
  43. package/dist/bootstrap/useModal.d.ts +2 -1
  44. package/dist/bootstrap/useModal.d.ts.map +1 -1
  45. package/dist/bootstrap/useModal.js +3 -3
  46. package/dist/bootstrap/useModal.js.map +1 -1
  47. package/dist/bootstrap/useWrappedForm.d.ts +1 -1
  48. package/dist/bootstrap/useWrappedForm.d.ts.map +1 -1
  49. package/dist/bootstrap/useWrappedForm.js.map +1 -1
  50. package/dist/core/cache.d.ts +2 -2
  51. package/dist/core/cache.d.ts.map +1 -1
  52. package/dist/core/cache.js.map +1 -1
  53. package/dist/core/errors.d.ts.map +1 -1
  54. package/dist/core/errors.js.map +1 -1
  55. package/dist/core/files.d.ts +2 -1
  56. package/dist/core/files.d.ts.map +1 -1
  57. package/dist/core/files.js +6 -2
  58. package/dist/core/files.js.map +1 -1
  59. package/dist/core/index.js +2 -1
  60. package/dist/core/ls.d.ts +1 -1
  61. package/dist/core/ls.d.ts.map +1 -1
  62. package/dist/core/ls.js.map +1 -1
  63. package/dist/core/measure.d.ts +4 -4
  64. package/dist/core/measure.d.ts.map +1 -1
  65. package/dist/core/measure.js +5 -1
  66. package/dist/core/measure.js.map +1 -1
  67. package/dist/core/worker.d.ts +3 -3
  68. package/dist/core/worker.d.ts.map +1 -1
  69. package/dist/core/worker.js.map +1 -1
  70. package/dist/core/wrpc.d.ts +4 -4
  71. package/dist/core/wrpc.d.ts.map +1 -1
  72. package/dist/core/wrpc.fixture.d.ts +1 -4
  73. package/dist/core/wrpc.fixture.d.ts.map +1 -1
  74. package/dist/core/wrpc.js.map +1 -1
  75. package/dist/electron/createWindow.d.ts.map +1 -1
  76. package/dist/electron/createWindow.js.map +1 -1
  77. package/dist/electron/updater.d.ts +1 -1
  78. package/dist/electron/updater.d.ts.map +1 -1
  79. package/dist/electron/updater.js +1 -1
  80. package/dist/electron/updater.js.map +1 -1
  81. package/dist/electron-builder/images.d.ts.map +1 -1
  82. package/dist/electron-builder/images.js.map +1 -1
  83. package/dist/mui/formControlFieldset.d.ts +2 -2
  84. package/dist/mui/formControlFieldset.d.ts.map +1 -1
  85. package/dist/mui/formControlFieldset.js.map +1 -1
  86. package/dist/mui/formLabelLegend.d.ts +2 -2
  87. package/dist/mui/formLabelLegend.d.ts.map +1 -1
  88. package/dist/mui/formLabelLegend.js.map +1 -1
  89. package/dist/mui/genericControl.d.ts +2 -2
  90. package/dist/mui/genericControl.d.ts.map +1 -1
  91. package/dist/mui/genericControl.js.map +1 -1
  92. package/dist/mui/readOnly.d.ts +2 -2
  93. package/dist/mui/readOnly.d.ts.map +1 -1
  94. package/dist/mui/readOnly.js.map +1 -1
  95. package/dist/next/measure.d.ts.map +1 -1
  96. package/dist/next/measure.js.map +1 -1
  97. package/dist/next/noSSR.d.ts +27 -3
  98. package/dist/next/noSSR.d.ts.map +1 -1
  99. package/dist/next/noSSR.js +2 -4
  100. package/dist/next/noSSR.js.map +1 -1
  101. package/dist/react/form/client.d.ts.map +1 -1
  102. package/dist/react/form/client.js.map +1 -1
  103. package/dist/react/form/form.d.ts +22 -8
  104. package/dist/react/form/form.d.ts.map +1 -1
  105. package/dist/react/form/form.js +27 -7
  106. package/dist/react/form/form.js.map +1 -1
  107. package/dist/react/index.js +2 -1
  108. package/dist/react/keyboard.d.ts +5 -6
  109. package/dist/react/keyboard.d.ts.map +1 -1
  110. package/dist/react/keyboard.js.map +1 -1
  111. package/dist/react/useFetcher.d.ts.map +1 -1
  112. package/dist/react/useFetcher.js.map +1 -1
  113. package/dist/react-native/share.d.ts +1 -1
  114. package/dist/react-native/share.d.ts.map +1 -1
  115. package/dist/react-native/share.js.map +1 -1
  116. package/dist/react-native/update.d.ts +2 -3
  117. package/dist/react-native/update.d.ts.map +1 -1
  118. package/dist/react-native/update.js +2 -2
  119. package/dist/react-native/update.js.map +1 -1
  120. package/dist/react-native/useAppState.d.ts +1 -1
  121. package/dist/react-native/useAppState.d.ts.map +1 -1
  122. package/dist/react-native/useAppState.js.map +1 -1
  123. package/dist/tailwind/fullpage.d.ts +2 -6
  124. package/dist/tailwind/fullpage.d.ts.map +1 -1
  125. package/dist/tailwind/fullpage.js.map +1 -1
  126. package/dist/tailwind/responsiveHelper.d.ts +2 -1
  127. package/dist/tailwind/responsiveHelper.d.ts.map +1 -1
  128. package/dist/tailwind/responsiveHelper.js +2 -2
  129. package/dist/tailwind/responsiveHelper.js.map +1 -1
  130. package/package.json +1 -1
  131. package/src/bootstrap/adaptiveContainer.tsx +3 -3
  132. package/src/bootstrap/controls.stories.tsx +1 -1
  133. package/src/bootstrap/controls.tsx +12 -12
  134. package/src/bootstrap/error.tsx +7 -10
  135. package/src/bootstrap/field.tsx +11 -9
  136. package/src/bootstrap/footer.tsx +17 -5
  137. package/src/bootstrap/globalLoading.tsx +5 -3
  138. package/src/bootstrap/loading.tsx +10 -8
  139. package/src/bootstrap/responsiveHelper.tsx +11 -6
  140. package/src/bootstrap/screen.tsx +24 -22
  141. package/src/bootstrap/toaster.tsx +8 -6
  142. package/src/bootstrap/useModal.tsx +12 -7
  143. package/src/bootstrap/useWrappedForm.ts +9 -7
  144. package/src/core/cache.ts +15 -8
  145. package/src/core/errors.ts +4 -1
  146. package/src/core/files.ts +6 -2
  147. package/src/core/ls.ts +8 -4
  148. package/src/core/measure.ts +55 -7
  149. package/src/core/worker.ts +18 -11
  150. package/src/core/wrpc.fixture.ts +40 -6
  151. package/src/core/wrpc.ts +23 -5
  152. package/src/electron/createWindow.ts +3 -3
  153. package/src/electron/updater.ts +1 -1
  154. package/src/electron-builder/images.ts +1 -1
  155. package/src/mui/formControlFieldset.tsx +2 -2
  156. package/src/mui/formLabelLegend.tsx +2 -2
  157. package/src/mui/genericControl.tsx +2 -2
  158. package/src/mui/readOnly.tsx +2 -2
  159. package/src/next/measure.ts +19 -2
  160. package/src/next/noSSR.tsx +26 -7
  161. package/src/react/form/client.tsx +13 -2
  162. package/src/react/form/form.tsx +67 -18
  163. package/src/react/keyboard.tsx +9 -4
  164. package/src/react/useFetcher.ts +8 -3
  165. package/src/react-native/share.ts +1 -1
  166. package/src/react-native/update.tsx +3 -3
  167. package/src/react-native/useAppState.ts +1 -1
  168. package/src/tailwind/fullpage.tsx +2 -2
  169. package/src/tailwind/responsiveHelper.tsx +3 -3
  170. package/tsconfig.json +1 -0
@@ -16,7 +16,11 @@ const uncolored = {
16
16
  err: noColor,
17
17
  ok: noColor
18
18
  };
19
- function createMeasurer({ colors = true, prepend = "LOG", padding = 10 }) {
19
+ function createMeasurer({
20
+ colors = true,
21
+ prepend = "LOG",
22
+ padding = 10
23
+ }) {
20
24
  const { important, subject, arg, sup, ok, err } = colors ? colored : uncolored;
21
25
  function measure(what, step, supplemental = "", ...args) {
22
26
  const time = performance.now();
@@ -1 +1 @@
1
- {"version":3,"file":"measure.js","sources":["../../src/core/measure.ts"],"sourcesContent":["import { bold, magenta, cyan, yellow, red, green } from 'colors/safe';\n\nexport const colored = {\n important: bold,\n subject: magenta,\n arg: cyan,\n sup: yellow,\n err: red,\n ok: green,\n};\n\nconst noColor = (str) => str;\n\nexport const uncolored = {\n important: noColor,\n subject: noColor,\n arg: noColor,\n sup: noColor,\n err: noColor,\n ok: noColor,\n};\n\nexport function createMeasurer({ colors = true, prepend = 'LOG', padding = 10 }) {\n const { important, subject, arg, sup, ok, err } = colors ? colored : uncolored;\n\n function measure(what: string, step: string, supplemental: string = '', ...args) {\n const time = performance.now();\n\n const prefix = [\n prepend,\n important(subject(what.substring(0, padding).padStart(padding, ' '))),\n arg(step),\n sup(supplemental),\n ...args,\n ];\n\n const done = (result: string = ok('DONE'), ...args2) => {\n console.log(\n ...[\n ...prefix,\n important(result),\n ...args2,\n 'in',\n important((performance.now() - time).toFixed(0)),\n 'ms',\n ].filter(Boolean),\n );\n console.groupEnd();\n };\n\n const fail = (result: string = err('FAIL'), ...args2) => done(result, ...args2);\n\n const log = (...args2) => {\n console.log(...prefix, ...args2);\n };\n\n return { done, fail, log };\n }\n\n return { measure, important, subject, arg, sup, ok, err };\n}\n"],"names":[],"mappings":";AAEO,MAAM,UAAU;AAAA,EACnB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AACR;AAEA,MAAM,UAAU,CAAC,QAAQ;AAElB,MAAM,YAAY;AAAA,EACrB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AACR;AAEgB,SAAA,eAAe,EAAE,SAAS,MAAM,UAAU,OAAO,UAAU,MAAM;AACvE,QAAA,EAAE,WAAW,SAAS,KAAK,KAAK,IAAI,IAAQ,IAAA,SAAS,UAAU;AAErE,WAAS,QAAQ,MAAc,MAAc,eAAuB,OAAO,MAAM;AACvE,UAAA,OAAO,YAAY,IAAI;AAE7B,UAAM,SAAS;AAAA,MACX;AAAA,MACA,UAAU,QAAQ,KAAK,UAAU,GAAG,OAAO,EAAE,SAAS,SAAS,GAAG,CAAC,CAAC;AAAA,MACpE,IAAI,IAAI;AAAA,MACR,IAAI,YAAY;AAAA,MAChB,GAAG;AAAA,IACP;AAEA,UAAM,OAAO,CAAC,SAAiB,GAAG,MAAM,MAAM,UAAU;AAC5C,cAAA;AAAA,QACJ,GAAG;AAAA,UACC,GAAG;AAAA,UACH,UAAU,MAAM;AAAA,UAChB,GAAG;AAAA,UACH;AAAA,UACA,WAAW,YAAY,IAAA,IAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,UAC/C;AAAA,QACJ,EAAE,OAAO,OAAO;AAAA,MACpB;AACA,cAAQ,SAAS;AAAA,IACrB;AAEM,UAAA,OAAO,CAAC,SAAiB,IAAI,MAAM,MAAM,UAAU,KAAK,QAAQ,GAAG,KAAK;AAExE,UAAA,MAAM,IAAI,UAAU;AACtB,cAAQ,IAAI,GAAG,QAAQ,GAAG,KAAK;AAAA,IACnC;AAEO,WAAA,EAAE,MAAM,MAAM,IAAI;AAAA,EAAA;AAG7B,SAAO,EAAE,SAAS,WAAW,SAAS,KAAK,KAAK,IAAI,IAAI;AAC5D;"}
1
+ {"version":3,"file":"measure.js","sources":["../../src/core/measure.ts"],"sourcesContent":["import { bold, magenta, cyan, yellow, red, green } from 'colors/safe';\n\nexport const colored: {\n important: typeof bold;\n subject: typeof magenta;\n arg: typeof cyan;\n sup: typeof yellow;\n err: typeof red;\n ok: typeof green;\n} = {\n important: bold,\n subject: magenta,\n arg: cyan,\n sup: yellow,\n err: red,\n ok: green,\n};\n\nconst noColor = (str) => str;\n\nexport const uncolored: {\n important: (str: any) => any;\n subject: (str: any) => any;\n arg: (str: any) => any;\n sup: (str: any) => any;\n err: (str: any) => any;\n ok: (str: any) => any;\n} = {\n important: noColor,\n subject: noColor,\n arg: noColor,\n sup: noColor,\n err: noColor,\n ok: noColor,\n};\n\nexport function createMeasurer({\n colors = true,\n prepend = 'LOG',\n padding = 10,\n}: {\n colors?: boolean;\n prepend?: string;\n padding?: number;\n}): {\n measure: (\n what: string,\n step: string,\n supplemental?: string,\n ...args: any[]\n ) => {\n done: (result?: string, ...args2: any[]) => void;\n fail: (result?: string, ...args2: any[]) => void;\n log: (...args2: any[]) => void;\n };\n important: (str: any) => any;\n subject: (str: any) => any;\n arg: (str: any) => any;\n sup: (str: any) => any;\n ok: (str: any) => any;\n err: (str: any) => any;\n} {\n const { important, subject, arg, sup, ok, err } = colors ? colored : uncolored;\n\n function measure(\n what: string,\n step: string,\n supplemental: string = '',\n ...args: any[]\n ): {\n done: (result?: string, ...args2: any[]) => void;\n fail: (result?: string, ...args2: any[]) => void;\n log: (...args2: any[]) => void;\n } {\n const time = performance.now();\n\n const prefix = [\n prepend,\n important(subject(what.substring(0, padding).padStart(padding, ' '))),\n arg(step),\n sup(supplemental),\n ...args,\n ];\n\n const done = (result: string = ok('DONE'), ...args2: any[]): void => {\n console.log(\n ...[\n ...prefix,\n important(result),\n ...args2,\n 'in',\n important((performance.now() - time).toFixed(0)),\n 'ms',\n ].filter(Boolean),\n );\n console.groupEnd();\n };\n\n const fail = (result: string = err('FAIL'), ...args2: any[]): void => done(result, ...args2);\n\n const log = (...args2: any[]): void => {\n console.log(...prefix, ...args2);\n };\n\n return { done, fail, log };\n }\n\n return { measure, important, subject, arg, sup, ok, err };\n}\n"],"names":[],"mappings":";AAEO,MAAM,UAOT;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AACR;AAEA,MAAM,UAAU,CAAC,QAAQ;AAElB,MAAM,YAOT;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AACR;AAEO,SAAS,eAAe;AAAA,EAC3B,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AACd,GAqBE;AACQ,QAAA,EAAE,WAAW,SAAS,KAAK,KAAK,IAAI,IAAQ,IAAA,SAAS,UAAU;AAErE,WAAS,QACL,MACA,MACA,eAAuB,OACpB,MAKL;AACQ,UAAA,OAAO,YAAY,IAAI;AAE7B,UAAM,SAAS;AAAA,MACX;AAAA,MACA,UAAU,QAAQ,KAAK,UAAU,GAAG,OAAO,EAAE,SAAS,SAAS,GAAG,CAAC,CAAC;AAAA,MACpE,IAAI,IAAI;AAAA,MACR,IAAI,YAAY;AAAA,MAChB,GAAG;AAAA,IACP;AAEA,UAAM,OAAO,CAAC,SAAiB,GAAG,MAAM,MAAM,UAAuB;AACzD,cAAA;AAAA,QACJ,GAAG;AAAA,UACC,GAAG;AAAA,UACH,UAAU,MAAM;AAAA,UAChB,GAAG;AAAA,UACH;AAAA,UACA,WAAW,YAAY,IAAA,IAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA,UAC/C;AAAA,QACJ,EAAE,OAAO,OAAO;AAAA,MACpB;AACA,cAAQ,SAAS;AAAA,IACrB;AAEM,UAAA,OAAO,CAAC,SAAiB,IAAI,MAAM,MAAM,UAAuB,KAAK,QAAQ,GAAG,KAAK;AAErF,UAAA,MAAM,IAAI,UAAuB;AACnC,cAAQ,IAAI,GAAG,QAAQ,GAAG,KAAK;AAAA,IACnC;AAEO,WAAA,EAAE,MAAM,MAAM,IAAI;AAAA,EAAA;AAG7B,SAAO,EAAE,SAAS,WAAW,SAAS,KAAK,KAAK,IAAI,IAAI;AAC5D;"}
@@ -41,9 +41,9 @@ declare abstract class Context<R, M extends keyof R> {
41
41
  close(reason?: string): void;
42
42
  get info(): string;
43
43
  get debugInfo(): {
44
- id: string | undefined;
45
- parentId: string | undefined;
46
- message: M;
44
+ id?: string;
45
+ parentId?: string;
46
+ message: string | number | symbol;
47
47
  closed: boolean;
48
48
  type: string;
49
49
  listeners: number;
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/core/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/core/worker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sources":["../../src/core/worker.ts"],"sourcesContent":["import { getTransferrable } from './workerUtils';\n\n// Types\n\ntype WebWorker = Worker | (Window & typeof globalThis) | (WorkerGlobalScope & typeof globalThis);\n\ntype MethodReturn<R, M extends keyof R> = R[M] extends (...args: any[]) => any\n ? Partial<Awaited<ReturnType<R[M]>>>\n : never;\n\ntype MethodArg<R, M extends keyof R> = R[M] extends (arg: infer A, ...args: any[]) => any ? Partial<A> : never;\n\nexport type Ctx<R, K extends keyof R> = {\n id: string;\n parentId?: string;\n message: K;\n done: boolean;\n};\n\ntype Data<R, M extends keyof R> = MethodReturn<R, M> | MethodArg<R, M> | Error;\n\ntype Event<R, M extends keyof R> = MessageEvent<{ data: Data<R, M>; ctx: Ctx<R, M> }>;\n\ntype Listener<R, M extends keyof R, D extends Data<R, M> = Data<R, M>, S extends Context<R, M> = Context<R, M>> = (\n data: D,\n self: S,\n event: Event<R, M>,\n) => void | Promise<void>;\n\n// Constants\n\nconst ALL = '*';\n\nconst RESPONDER = Symbol('responder');\n\nfunction checkClosed(obj: any, label: string = 'external') {\n if (obj?.closed) throw new Error(`Context ${obj.id} is closed (${label})`, { cause: obj });\n}\n\nfunction checkMessage(obj: any, message: any) {\n if (!message) throw new Error('New context must have message', { cause: obj });\n}\n\n// Classes\n\nexport class WorkerDialog<R extends RespondersBase<any>> {\n readonly contexts = new Set<Context<R, keyof R>>();\n protected closed = false;\n protected currentId = 0; // IDs are intentionally not global\n\n constructor(\n public worker: WebWorker,\n public responders: R,\n public name: string,\n public debug: number = 0, // 0 - none, 1 - general messages, 2 - sub/unsub, 3 - transport TODO Object?\n ) {\n if (!this.worker) return; // Next.js SSR\n\n for (const message in this.responders) {\n if (!this.responders?.[message]?.[RESPONDER]) continue;\n\n // root context with id=all\n const rootContext = new ResponseContext<R, typeof message>(this, message, ALL);\n\n //TODO: unsub(); ? Probably not needed, root must be always listening until closed by WorkerDialog\n rootContext.listen(async (data, context, event) => {\n // create sub context with ID\n const responseContext = context.withMessage(message, event.data.ctx.id);\n\n /* v8 ignore start */\n if (this.debug)\n console.log('Root Listener', rootContext.info, {\n rootContext: context,\n data,\n responseContext,\n event,\n responder: this.responders[message],\n });\n /* v8 ignore stop */\n\n try {\n responseContext.send(await (this.responders[message] as any)(data, responseContext), true);\n responseContext.close('root.listener');\n } catch (e) {\n /* v8 ignore next */\n if (this.debug) console.error(`Error in responder ${responseContext.info}`, { e });\n responseContext.send(e, true);\n }\n }, true);\n }\n }\n\n getID() {\n return (++this.currentId).toString();\n }\n\n close() {\n for (const context of this.contexts) context.close('root');\n this.contexts.clear();\n }\n\n withMessage<M extends keyof R>(message: M) {\n return new RequestContext<R, M>(this, message, this.getID()); // always new context\n }\n}\n\nexport class RespondersBase<R> {\n create<M extends keyof R, F extends (input: any, context: ResponseContext<R, M>) => any>(\n message: M,\n responder: F,\n ): F {\n responder[RESPONDER] = true;\n return responder as any;\n }\n}\n\n// can only be used to create actual contexts, carries the context data\nabstract class Context<R, M extends keyof R> {\n protected readonly unsub = new Set<() => void>();\n protected closed = false;\n\n constructor(\n protected readonly dialog: WorkerDialog<any>,\n public message: M,\n public id: string | undefined,\n public parent: Context<R, keyof R> | undefined | null = null,\n ) {\n checkClosed(dialog, 'newContext');\n checkClosed(parent, 'newContext');\n checkMessage(this, message);\n this.id = id ?? parent?.id;\n if (!this.id) throw new Error('ID is required', { cause: this });\n this.dialog.contexts.add(this);\n }\n\n abstract withMessage<M2 extends keyof R>(message: M2, id?: string): Context<R, M2>;\n\n close(reason: string = 'external') {\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Closing', this.info, reason, this);\n\n this.dialog.contexts.delete(this);\n\n // Unsubscribe from all listeners\n for (const unsub of this.unsub) unsub();\n this.unsub.clear();\n\n // Remove all child contexts\n this.dialog.contexts.forEach((context) => {\n if (context.parent?.id === this.id) context.close('parent');\n });\n\n this.closed = true;\n }\n\n get info() {\n return `${this.dialog.name}:${this.parent?.id ?? ALL}/${this.id}:${this.message.toString()}[${this.closed ? 'closed' : 'open'},${this.type}]`;\n }\n\n get debugInfo() {\n return {\n id: this.id,\n parentId: this.parent?.id,\n message: this.message,\n closed: this.closed,\n type: this.type,\n listeners: this.unsub.size,\n };\n }\n\n abstract type: 'request' | 'response' | string;\n\n protected postMessage(data?: Data<R, M>, done = false) {\n checkClosed(this, 'postMessage');\n\n const transfer = getTransferrable(data);\n\n const ctx = {\n done,\n id: this.id,\n parentId: this.parent?.id,\n message: this.message,\n };\n\n /* v8 ignore next */\n if (this.dialog.debug >= 3) console.log('postMessage', this.info, { ctx, data, transfer }, this);\n\n this.dialog.worker.postMessage({ data, ctx }, transfer);\n\n return data;\n }\n\n send(data?: Data<R, M>, done = false) {\n return this.postMessage(data, done);\n }\n\n /**\n * Does not automatically close, assumes consumer will close\n *\n * ```ts\n * dialog.request('x').fetch((c) => {\n * c.response('x').listen(() => { ... }); // listens to \"x\", will be closed by upper level fetch\n * c.request('x').fetcH(y, (c) => { ... }); // closes\n * }) // closes\n *\n * const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'\n * un(); // closes\n *\n * const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'\n * un(); // closes\n * ```\n */\n listen(callback: Listener<R, M>, done = false): () => void {\n checkClosed(this, 'listen');\n\n const controller = new AbortController();\n\n this.dialog.worker.addEventListener(\n 'message',\n async (event: Event<R, M>) => {\n try {\n const {\n data: { ctx, data },\n } = event;\n\n if (\n !ctx ||\n (this.id !== ALL && this.id !== ctx.id) ||\n this.message !== ctx.message ||\n (done && !ctx.done)\n )\n return; // unknown message from devtools etc., or different context\n\n /* v8 ignore next */\n if (this.dialog.debug) console.log('Listener event', this.info, event, this);\n\n await callback(data, this, event); // Requests can come here, but they're typed in responders\n } catch (e) {\n /* v8 ignore next */\n if (this.dialog.debug) console.error(`Error in listener ${this.info}`, this, { event, e });\n //TODO Respond with error?\n }\n },\n { signal: controller.signal },\n );\n\n const unsub = () => {\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Stop listening', this.info, this);\n controller.abort();\n this.unsub.delete(unsub);\n };\n\n this.unsub.add(unsub);\n\n return unsub;\n }\n}\n\nclass RequestContext<R, M extends keyof R> extends Context<R, M> {\n type = 'request';\n\n withMessage<M2 extends keyof R>(message: M2, id?: string): RequestContext<R, M2> {\n return new RequestContext<R, M2>(this.dialog, message, id, this);\n }\n\n send(data?: MethodArg<R, M>, done = false): MethodArg<R, M> {\n return super.send(data, done) as any;\n }\n\n listen(callback: Listener<R, M, MethodReturn<R, M>, RequestContext<R, M>>, done = false): () => void {\n return super.listen(callback, done);\n }\n\n /**\n * Returns response\n * If you need to work with ctx, use callback\n * Closed automatically on response\n *\n * dialog.fetch('x', (c) => {\n * c.listen(() => { ... }); // will be closed by upper level fetch\n * c.fetcH(y, (c) => { ... }); // closes c\n * c.context().fetcH(y, (c) => { ... }); // closes sub, not closes c, will be closed by upper level fetch\n * })\n */\n async fetch(\n data?: MethodArg<R, M>,\n callback?: (context: RequestContext<R, M>) => void,\n ): Promise<MethodReturn<R, M>> {\n checkClosed(this, 'fetch');\n\n const res = await Promise.all([\n callback?.(this),\n this.expect(), // will be closed in expect -> listener -> unsub\n this.send(data, true),\n ]);\n\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Fetch', this.info, this);\n\n this.close('fetch');\n\n return res[1];\n }\n\n protected async expect() {\n checkClosed(this, 'expect');\n\n //FIXME Manual promise type\n return new Promise<MethodReturn<R, M>>((resolve, reject) => {\n const responseListener = this.listen(async (data) => {\n try {\n if ((data as any) instanceof Error) throw data;\n responseListener();\n /* v8 ignore next */\n if (this.dialog.debug >= 3) console.log('Expect', this.info, data, this);\n resolve(data as any);\n } catch (e) {\n reject(e);\n }\n }, true);\n });\n }\n}\n\nclass ResponseContext<R, M extends keyof R> extends Context<R, M> {\n type = 'response';\n\n withMessage<M2 extends keyof R>(message: M2, id?: string): ResponseContext<R, M2> {\n return new ResponseContext<R, M2>(this.dialog, message, id, this);\n }\n\n listen(callback: Listener<R, M, MethodArg<R, M>, ResponseContext<R, M>>, done = false): () => void {\n return super.listen(callback, done);\n }\n\n send(data?: MethodReturn<R, M>, done = false): MethodReturn<R, M> {\n return super.send(data, done) as any;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sources":["../../src/core/worker.ts"],"sourcesContent":["import { getTransferrable } from './workerUtils';\n\n// Types\n\ntype WebWorker = Worker | (Window & typeof globalThis) | (WorkerGlobalScope & typeof globalThis);\n\ntype MethodReturn<R, M extends keyof R> = R[M] extends (...args: any[]) => any\n ? Partial<Awaited<ReturnType<R[M]>>>\n : never;\n\ntype MethodArg<R, M extends keyof R> = R[M] extends (arg: infer A, ...args: any[]) => any ? Partial<A> : never;\n\nexport type Ctx<R, K extends keyof R> = {\n id: string;\n parentId?: string;\n message: K;\n done: boolean;\n};\n\ntype Data<R, M extends keyof R> = MethodReturn<R, M> | MethodArg<R, M> | Error;\n\ntype Event<R, M extends keyof R> = MessageEvent<{ data: Data<R, M>; ctx: Ctx<R, M> }>;\n\ntype Listener<R, M extends keyof R, D extends Data<R, M> = Data<R, M>, S extends Context<R, M> = Context<R, M>> = (\n data: D,\n self: S,\n event: Event<R, M>,\n) => void | Promise<void>;\n\n// Constants\n\nconst ALL = '*';\n\nconst RESPONDER = Symbol('responder');\n\nfunction checkClosed(obj: any, label: string = 'external') {\n if (obj?.closed) throw new Error(`Context ${obj.id} is closed (${label})`, { cause: obj });\n}\n\nfunction checkMessage(obj: any, message: any) {\n if (!message) throw new Error('New context must have message', { cause: obj });\n}\n\n// Classes\n\nexport class WorkerDialog<R extends RespondersBase<any>> {\n readonly contexts: Set<Context<R, keyof R>> = new Set();\n protected closed = false;\n protected currentId = 0; // IDs are intentionally not global\n\n constructor(\n public worker: WebWorker,\n public responders: R,\n public name: string,\n public debug: number = 0, // 0 - none, 1 - general messages, 2 - sub/unsub, 3 - transport TODO Object?\n ) {\n if (!this.worker) return; // Next.js SSR\n\n for (const message in this.responders) {\n if (!this.responders?.[message]?.[RESPONDER]) continue;\n\n // root context with id=all\n const rootContext = new ResponseContext<R, typeof message>(this, message, ALL);\n\n //TODO: unsub(); ? Probably not needed, root must be always listening until closed by WorkerDialog\n rootContext.listen(async (data, context, event) => {\n // create sub context with ID\n const responseContext = context.withMessage(message, event.data.ctx.id);\n\n /* v8 ignore start */\n if (this.debug)\n console.log('Root Listener', rootContext.info, {\n rootContext: context,\n data,\n responseContext,\n event,\n responder: this.responders[message],\n });\n /* v8 ignore stop */\n\n try {\n responseContext.send(await (this.responders[message] as any)(data, responseContext), true);\n responseContext.close('root.listener');\n } catch (e) {\n /* v8 ignore next */\n if (this.debug) console.error(`Error in responder ${responseContext.info}`, { e });\n responseContext.send(e, true);\n }\n }, true);\n }\n }\n\n getID(): string {\n return (++this.currentId).toString();\n }\n\n close(): void {\n for (const context of this.contexts) context.close('root');\n this.contexts.clear();\n }\n\n withMessage<M extends keyof R>(message: M): RequestContext<R, M> {\n return new RequestContext<R, M>(this, message, this.getID()); // always new context\n }\n}\n\nexport class RespondersBase<R> {\n create<M extends keyof R, F extends (input: any, context: ResponseContext<R, M>) => any>(\n message: M,\n responder: F,\n ): F {\n responder[RESPONDER] = true;\n return responder as any;\n }\n}\n\n// can only be used to create actual contexts, carries the context data\nabstract class Context<R, M extends keyof R> {\n protected readonly unsub: Set<() => void> = new Set();\n protected closed = false;\n\n constructor(\n protected readonly dialog: WorkerDialog<any>,\n public message: M,\n public id: string | undefined,\n public parent: Context<R, keyof R> | undefined | null = null,\n ) {\n checkClosed(dialog, 'newContext');\n checkClosed(parent, 'newContext');\n checkMessage(this, message);\n this.id = id ?? parent?.id;\n if (!this.id) throw new Error('ID is required', { cause: this });\n this.dialog.contexts.add(this);\n }\n\n abstract withMessage<M2 extends keyof R>(message: M2, id?: string): Context<R, M2>;\n\n close(reason: string = 'external'): void {\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Closing', this.info, reason, this);\n\n this.dialog.contexts.delete(this);\n\n // Unsubscribe from all listeners\n for (const unsub of this.unsub) unsub();\n this.unsub.clear();\n\n // Remove all child contexts\n this.dialog.contexts.forEach((context) => {\n if (context.parent?.id === this.id) context.close('parent');\n });\n\n this.closed = true;\n }\n\n get info() {\n return `${this.dialog.name}:${this.parent?.id ?? ALL}/${this.id}:${this.message.toString()}[${this.closed ? 'closed' : 'open'},${this.type}]`;\n }\n\n get debugInfo(): {\n id?: string;\n parentId?: string;\n message: string | number | symbol;\n closed: boolean;\n type: string;\n listeners: number;\n } {\n return {\n id: this.id,\n parentId: this.parent?.id,\n message: this.message,\n closed: this.closed,\n type: this.type,\n listeners: this.unsub.size,\n };\n }\n\n abstract type: 'request' | 'response' | string;\n\n protected postMessage(data?: Data<R, M>, done = false): Data<R, M> | undefined {\n checkClosed(this, 'postMessage');\n\n const transfer = getTransferrable(data);\n\n const ctx = {\n done,\n id: this.id,\n parentId: this.parent?.id,\n message: this.message,\n };\n\n /* v8 ignore next */\n if (this.dialog.debug >= 3) console.log('postMessage', this.info, { ctx, data, transfer }, this);\n\n this.dialog.worker.postMessage({ data, ctx }, transfer);\n\n return data;\n }\n\n send(data?: Data<R, M>, done = false): Data<R, M> | undefined {\n return this.postMessage(data, done);\n }\n\n /**\n * Does not automatically close, assumes consumer will close\n *\n * ```ts\n * dialog.request('x').fetch((c) => {\n * c.response('x').listen(() => { ... }); // listens to \"x\", will be closed by upper level fetch\n * c.request('x').fetcH(y, (c) => { ... }); // closes\n * }) // closes\n *\n * const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'\n * un(); // closes\n *\n * const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'\n * un(); // closes\n * ```\n */\n listen(callback: Listener<R, M>, done = false): () => void {\n checkClosed(this, 'listen');\n\n const controller = new AbortController();\n\n this.dialog.worker.addEventListener(\n 'message',\n async (event: Event<R, M>) => {\n try {\n const {\n data: { ctx, data },\n } = event;\n\n if (\n !ctx ||\n (this.id !== ALL && this.id !== ctx.id) ||\n this.message !== ctx.message ||\n (done && !ctx.done)\n )\n return; // unknown message from devtools etc., or different context\n\n /* v8 ignore next */\n if (this.dialog.debug) console.log('Listener event', this.info, event, this);\n\n await callback(data, this, event); // Requests can come here, but they're typed in responders\n } catch (e) {\n /* v8 ignore next */\n if (this.dialog.debug) console.error(`Error in listener ${this.info}`, this, { event, e });\n //TODO Respond with error?\n }\n },\n { signal: controller.signal },\n );\n\n const unsub = () => {\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Stop listening', this.info, this);\n controller.abort();\n this.unsub.delete(unsub);\n };\n\n this.unsub.add(unsub);\n\n return unsub;\n }\n}\n\nclass RequestContext<R, M extends keyof R> extends Context<R, M> {\n type = 'request';\n\n withMessage<M2 extends keyof R>(message: M2, id?: string): RequestContext<R, M2> {\n return new RequestContext<R, M2>(this.dialog, message, id, this);\n }\n\n send(data?: MethodArg<R, M>, done = false): MethodArg<R, M> {\n return super.send(data, done) as any;\n }\n\n listen(callback: Listener<R, M, MethodReturn<R, M>, RequestContext<R, M>>, done = false): () => void {\n return super.listen(callback, done);\n }\n\n /**\n * Returns response\n * If you need to work with ctx, use callback\n * Closed automatically on response\n *\n * dialog.fetch('x', (c) => {\n * c.listen(() => { ... }); // will be closed by upper level fetch\n * c.fetcH(y, (c) => { ... }); // closes c\n * c.context().fetcH(y, (c) => { ... }); // closes sub, not closes c, will be closed by upper level fetch\n * })\n */\n async fetch(\n data?: MethodArg<R, M>,\n callback?: (context: RequestContext<R, M>) => void,\n ): Promise<MethodReturn<R, M>> {\n checkClosed(this, 'fetch');\n\n const res = await Promise.all([\n callback?.(this),\n this.expect(), // will be closed in expect -> listener -> unsub\n this.send(data, true),\n ]);\n\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Fetch', this.info, this);\n\n this.close('fetch');\n\n return res[1];\n }\n\n protected async expect(): Promise<MethodReturn<R, M>> {\n checkClosed(this, 'expect');\n\n //FIXME Manual promise type\n return new Promise((resolve, reject) => {\n const responseListener = this.listen(async (data) => {\n try {\n if ((data as any) instanceof Error) throw data;\n responseListener();\n /* v8 ignore next */\n if (this.dialog.debug >= 3) console.log('Expect', this.info, data, this);\n resolve(data as any);\n } catch (e) {\n reject(e);\n }\n }, true);\n });\n }\n}\n\nclass ResponseContext<R, M extends keyof R> extends Context<R, M> {\n type = 'response';\n\n withMessage<M2 extends keyof R>(message: M2, id?: string): ResponseContext<R, M2> {\n return new ResponseContext<R, M2>(this.dialog, message, id, this);\n }\n\n listen(callback: Listener<R, M, MethodArg<R, M>, ResponseContext<R, M>>, done = false): () => void {\n return super.listen(callback, done);\n }\n\n send(data?: MethodReturn<R, M>, done = false): MethodReturn<R, M> {\n return super.send(data, done) as any;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ export type WorkerLike = {
22
22
  once?: boolean;
23
23
  }) => void;
24
24
  removeEventListener: (event: string, listener: (e: any) => void) => void;
25
- };
25
+ } & any;
26
26
  export declare enum LogLevel {
27
27
  disabled = 0,
28
28
  error = 1,
@@ -31,10 +31,10 @@ export declare enum LogLevel {
31
31
  transport = 4
32
32
  }
33
33
  export declare function deriveController(signal?: AbortSignal): [AbortController, AbortSignal];
34
- export declare function rejectOnSignal(promise: Promise<any>, signal: AbortSignal): Promise<any>;
34
+ export declare function rejectOnSignal(promise: Promise<any>, signal: AbortSignal): Promise<Event['data']>;
35
35
  export declare function wrpc({ debug, name, }?: {
36
- debug?: LogLevel | undefined;
37
- name?: string | undefined;
36
+ debug?: LogLevel;
37
+ name?: string;
38
38
  }): {
39
39
  createResponder: <T extends Responders>(worker: WorkerLike, responders: T) => {
40
40
  responders: T;
@@ -1 +1 @@
1
- {"version":3,"file":"wrpc.d.ts","sourceRoot":"","sources":["../../src/core/wrpc.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;CAAE,CAAC;AAErH,MAAM,MAAM,OAAO,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,GAAG,GAAG,KAAK,CAAA;CAAE,CAAC,CAAC;AAEzE,MAAM,MAAM,UAAU,GAAG;IACrB,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACzD,gBAAgB,EAAE,CACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,EAC1B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,IAAI,CAAC;IACV,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;CAC5E,CAAC;AAEF,oBAAY,QAAQ;IAChB,QAAQ,IAAI;IACZ,KAAK,IAAI;IACT,SAAS,IAAI;IACb,MAAM,IAAI;IACV,SAAS,IAAI;CAChB;AAID,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAGrF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,gBAOxE;AAID,wBAAgB,IAAI,CAAC,EACjB,KAAyB,EACzB,IAAiE,GACpE;;;CAAK;sBA0EuB,CAAC,SAAS,UAAU,UAAU,UAAU,cAAc,CAAC;;;;mBAqG1D,CAAC,SAAS,UAAU,UAAU,UAAU,cAAc,CAAC,KAAG,CAAC;EA6HpF"}
1
+ {"version":3,"file":"wrpc.d.ts","sourceRoot":"","sources":["../../src/core/wrpc.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;CAAE,CAAC;AAErH,MAAM,MAAM,OAAO,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,GAAG,GAAG,KAAK,CAAA;CAAE,CAAC,CAAC;AAEzE,MAAM,MAAM,UAAU,GAAG;IACrB,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACzD,gBAAgB,EAAE,CACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,EAC1B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,IAAI,CAAC;IACV,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;CAC5E,GAAG,GAAG,CAAC;AAER,oBAAY,QAAQ;IAChB,QAAQ,IAAI;IACZ,KAAK,IAAI;IACT,SAAS,IAAI;IACb,MAAM,IAAI;IACV,SAAS,IAAI;CAChB;AAID,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAGrF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAOjG;AAID,wBAAgB,IAAI,CAAC,EACjB,KAAyB,EACzB,IAAiE,GACpE,GAAE;IACC,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG;IACL,eAAe,EAAE,CAAC,CAAC,SAAS,UAAU,EAClC,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,CAAC,KACZ;QACD,UAAU,EAAE,CAAC,CAAC;QACd,IAAI,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;IACF,YAAY,EAAE,CAAC,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;CAChF,CAkTA"}
@@ -5,10 +5,7 @@ export declare const responder: {
5
5
  buf?: ArrayBuffer;
6
6
  }) => Generator<{
7
7
  progress: number;
8
- aborted?: undefined;
9
- } | {
10
- progress: number;
11
- aborted: boolean;
8
+ aborted?: boolean;
12
9
  }, string, unknown>;
13
10
  returnYield: () => Generator<1 | 3 | 2, any, unknown>;
14
11
  bidirectional: (prefix?: any) => Generator<string, string, number>;
@@ -1 +1 @@
1
- {"version":3,"file":"wrpc.fixture.d.ts","sourceRoot":"","sources":["../../src/core/wrpc.fixture.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS;;iCAEgB;YAAE,MAAM,CAAC,EAAE,WAAW,CAAC;YAAC,GAAG,CAAC,EAAE,WAAW,CAAA;SAAE;;;;;;;;yCAYtC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;;;;;;mCAkBjC;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE;oCAGT;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE;;;CAKxE,CAAC"}
1
+ {"version":3,"file":"wrpc.fixture.d.ts","sourceRoot":"","sources":["../../src/core/wrpc.fixture.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,EAAE;IACpB,UAAU,EAAE;QAGR,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,WAAW,CAAC;YAAC,GAAG,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,SAAS,CAC9E;YACI,QAAQ,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,OAAO,CAAC;SACrB,EACD,MAAM,EACN,OAAO,CACV,CAAC;QAEF,WAAW,EAAE,MAAM,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEnE,KAAK,EAAE,MAAM,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,EAAE,MAAM,OAAO,CAAC;YACnB,IAAI,EAAE,MAAM,CAAC;SAChB,CAAC,CAAC;QACH,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACrE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;KAC5F,CAAC;IACF,IAAI,EAAE,MAAM,IAAI,CAAC;CAkDnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wrpc.js","sources":["../../src/core/wrpc.ts"],"sourcesContent":["import { getTransferrable } from './workerUtils';\n\n// Types\n\nexport type Responders = { [key: string]: (arg?: any) => Generator<any> | AsyncGenerator<any> | Promise<any> | any };\n\nexport type Context = {\n message: string;\n id: string;\n signalName?: string;\n done?: boolean;\n abort?: string;\n error?: boolean;\n ack?: boolean;\n promise?: boolean;\n};\n\nexport type Event = MessageEvent<{ ctx: Context; payload: any | Error }>;\n\nexport type WorkerLike = {\n postMessage: (payload: any, transferable: any[]) => void;\n addEventListener: (\n event: string,\n listener: (e: any) => void,\n options?: { signal?: AbortSignal; once?: boolean },\n ) => void;\n removeEventListener: (event: string, listener: (e: any) => void) => void;\n};\n\nexport enum LogLevel {\n disabled = 0,\n error = 1,\n lifecycle = 2,\n detail = 3,\n transport = 4,\n}\n\n// Helpers\n\nexport function deriveController(signal?: AbortSignal): [AbortController, AbortSignal] {\n const controller = new AbortController();\n return [controller, AbortSignal.any([controller.signal, signal].filter(Boolean) as AbortSignal[])];\n}\n\nexport function rejectOnSignal(promise: Promise<any>, signal: AbortSignal) {\n return Promise.race([\n promise,\n new Promise<Event['data']>((resolve, reject) => {\n signal.addEventListener('abort', () => reject('RaceAborted:' + signal.reason), { once: true, signal });\n }),\n ]);\n}\n\n// Lib\n\nexport function wrpc({\n debug = LogLevel.disabled,\n name = (globalThis as any).importScripts ? 'RESPONDER' : 'CALLER',\n} = {}) {\n // Logger\n\n function logger(type: string) {\n return (level: number, ctx: Context | null, ...args: any[]) => {\n if (!debug || debug < level) return;\n const { id, message, ...restCtx } = ctx || {};\n console[type](name, message || '*', id || '*', ...args, restCtx);\n };\n }\n\n const log = logger('log');\n const logWarn = logger('warn');\n const logError = logger('error');\n\n // Service\n\n function send(worker: WorkerLike, ctx: Context, payload?: any) {\n log(LogLevel.transport, ctx, 'SEND', payload, typeof payload);\n worker.postMessage({ ctx, payload }, getTransferrable(payload));\n }\n\n //TODO Listener error handling\n function listen(\n worker: WorkerLike,\n context: Context | null,\n listener: (event: Event['data']) => void,\n signal: AbortSignal,\n once: boolean = false,\n ) {\n signal.addEventListener(\n 'abort',\n () => logWarn(LogLevel.detail, context, 'LISTEN SIGNAL ABORT', signal.reason),\n {\n signal,\n once: true,\n },\n );\n worker.addEventListener(\n 'message',\n ({ data }: Event) => {\n log(LogLevel.transport, context, 'LISTEN EVENT', data);\n // no context = listen all, or matching context\n if (!context || (data?.ctx?.message === context.message && data.ctx?.id === context.id)) listener(data);\n },\n { signal, once },\n );\n }\n\n function waitFor(\n worker: WorkerLike,\n ctx: Context,\n condition: (data: Event['data']) => boolean = (data) => true,\n signal: AbortSignal,\n ) {\n const [waitController, waitSignal] = deriveController(signal);\n\n return new Promise<Event['data']>((res) =>\n listen(\n worker,\n ctx,\n (data) => {\n if (!condition(data)) return;\n waitController.abort('WaitFinished');\n res(data);\n },\n waitSignal,\n ),\n );\n }\n\n // Responder\n\n //TODO Name arg\n function createResponder<T extends Responders>(worker: WorkerLike, responders: T) {\n const mainController = new AbortController();\n\n worker.addEventListener('messageerror', (e) => logError(LogLevel.error, null, 'MESSAGE ERROR', e), {\n signal: mainController.signal,\n });\n\n listen(\n worker,\n null,\n async ({ ctx, payload = {} }) => {\n if (!ctx || !ctx.message || !ctx.id || ctx.abort || ctx.ack) return; // ignore invalid and service messages\n try {\n const responder = responders[ctx.message];\n\n if (!responder) throw new Error('Unknown responder', { cause: ctx });\n\n const [subController, subSignal] = deriveController(mainController.signal);\n\n // always recover signal so that promises also can abort\n if (ctx.signalName) payload[ctx.signalName] = subSignal;\n\n const iterator = responder(payload); // no await!\n\n log(LogLevel.lifecycle, ctx, 'START', iterator);\n\n // PROMISE\n\n // https://stackoverflow.com/a/19660350/5125659 the only right way is to call function and see what it returned\n if (!iterator[Symbol.asyncIterator] && !iterator[Symbol.iterator]) {\n // Errors are caught in generic handler\n send(worker, { ...ctx, promise: true }, await rejectOnSignal(iterator, subSignal));\n log(LogLevel.detail, ctx, 'PROMISE RESOLVED');\n return;\n }\n\n // GENERATOR\n\n try {\n // Listen outside the loop to react immediately\n // Could be a wait for since abort is a one-off, but listeners are disposed by signal anyway, and we don't need to block the async thread\n listen(\n worker,\n ctx,\n (data) => {\n if (!data.ctx.abort) return;\n subController.abort(data.ctx.abort);\n logWarn(LogLevel.lifecycle, ctx, 'GOT ABORT');\n },\n subSignal,\n );\n\n let res: any;\n let nextPayload: any = payload; // does not matter, will be ignored anyway\n do {\n res = await rejectOnSignal(iterator.next(nextPayload), subSignal);\n\n send(worker, { ...ctx, done: res.done }, res.value);\n\n if (res.done) {\n subController.abort('Done');\n break;\n }\n\n const nextData = await rejectOnSignal(\n waitFor(worker, ctx, (data) => !!data.ctx.ack, subSignal),\n subSignal,\n );\n nextPayload = nextData.payload;\n\n log(LogLevel.detail, ctx, 'LOOP ACK');\n } while (!res.done && !subSignal.aborted);\n } catch (e) {\n if (!subSignal.aborted && !e.message.includes('RaceAborted')) {\n logError(LogLevel.error, ctx, 'LOOP ERROR', e);\n send(worker, { ...ctx, error: true, done: true }, e);\n }\n } finally {\n log(LogLevel.detail, ctx, 'LOOP DONE');\n }\n } catch (e) {\n // Generator-specific error handling\n logError(LogLevel.error, ctx, 'ERROR', e);\n send(worker, { ...ctx, error: true, done: true }, e); // Generic error handling\n } finally {\n log(LogLevel.detail, ctx, 'DONE');\n }\n },\n mainController.signal,\n );\n\n function stop() {\n mainController.abort('Stop');\n }\n\n return { responders, stop }; // responders needed for typing\n }\n\n // Caller\n\n //TODO Name arg\n function createCaller<T extends Responders>(worker: WorkerLike, responders: T): T {\n worker.addEventListener('messageerror', (e) => logError(LogLevel.error, null, 'MESSAGE ERROR', e));\n\n //TODO Stop\n\n return new Proxy<T>(responders as any, {\n get(target, prop, receiver) {\n function gen(payload: any) {\n const ctx: Context = { message: prop.toString(), id: crypto.randomUUID() };\n\n let signal: AbortSignal = null as any;\n\n if (payload && Object.is(payload, Object(payload))) {\n for (const [key, value] of Object.entries(payload)) {\n if (value instanceof AbortSignal) {\n log(LogLevel.detail, ctx, 'FOUND SIGNAL', key);\n ctx.signalName = key;\n signal = value;\n payload[key] = null; // will be recovered in responder\n }\n }\n }\n\n const [mainController, mainSignal] = deriveController(signal);\n\n const cancel = (notify: boolean, reason: string = '') => {\n if (mainController.signal.aborted) return;\n logWarn(LogLevel.lifecycle, ctx, 'CANCEL', reason, notify);\n if (reason) mainController.abort(reason); // stop listening\n if (notify) send(worker, { ...ctx, abort: reason }); // worker will break & acknowledge, but it's not important\n };\n\n // Generator\n\n const [promiseController, promiseSignal] = deriveController(mainSignal);\n\n const promise = waitFor(\n worker,\n ctx,\n (data) => !!data.ctx.promise || !!data.ctx.error,\n promiseSignal,\n ).then(({ ctx, payload }) => {\n if (ctx.error) {\n logError(LogLevel.error, ctx, 'PROMISE ERROR', payload);\n throw payload;\n }\n log(LogLevel.lifecycle, ctx, 'PROMISE RESOLVED', payload);\n return payload;\n });\n\n async function* generator() {\n let done = false;\n try {\n // React immediately\n mainSignal.addEventListener('abort', () => cancel(true, mainSignal.reason), {\n once: true,\n signal: mainSignal,\n });\n\n log(LogLevel.detail, ctx, 'GENERATOR START');\n promiseController.abort('GeneratorUsed');\n\n do {\n const data = await rejectOnSignal(\n waitFor(worker, ctx, undefined, mainSignal),\n mainSignal,\n );\n\n const { ctx: ctxIn, payload: value } = data;\n\n log(LogLevel.lifecycle, ctx, 'EVENT', mainSignal.aborted, ctxIn, value);\n\n if (ctxIn.promise) {\n // && !ctxIn.error\n // cancel(false, 'Resolved');\n // return payloadIn;\n logError(LogLevel.error, ctx, 'ERROR', 'Unexpected promise in generator', data);\n throw new Error('Unexpected promise in generator', { cause: data });\n }\n\n if (ctxIn.error) {\n logError(LogLevel.error, ctx, 'ERROR', data);\n cancel(false, 'Error');\n throw value;\n }\n\n if (ctxIn.done) {\n done = true;\n return value;\n } else {\n const nextPayload = yield value;\n if (!mainSignal.aborted) send(worker, { ...ctx, ack: true }, nextPayload);\n }\n } while (!mainSignal.aborted);\n } finally {\n // prevent further cycles in worker once main is closed/cancelled/aborted\n log(LogLevel.detail, ctx, 'DONE');\n cancel(true, mainSignal.aborted ? mainSignal.reason : done ? 'Done' : 'Break');\n }\n }\n\n const iterator = generator();\n\n send(worker, ctx, payload);\n\n // FIXME Nasty hack, return both iterator and promise\n // Consuming code will get both, but IDE should show only proper type\n // Consuming code will likely use only one except someone calls `for await ... of await` which is not useful in any case\n iterator['then'] = promise.then.bind(promise);\n iterator['catch'] = promise.catch.bind(promise);\n iterator['finally'] = promise.finally.bind(promise);\n return iterator;\n }\n\n //TODO mimic-function(gen, fn); but no access to original\n Object.defineProperty(gen, 'name', { value: prop.toString() });\n\n (target as any)[prop] = gen; // so that fn is visible after use, maybe not needed\n\n return gen;\n },\n }) as T;\n }\n\n return { createResponder, createCaller };\n}\n"],"names":["LogLevel","ctx","payload"],"mappings":"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"}
1
+ {"version":3,"file":"wrpc.js","sources":["../../src/core/wrpc.ts"],"sourcesContent":["import { getTransferrable } from './workerUtils';\n\n// Types\n\nexport type Responders = { [key: string]: (arg?: any) => Generator<any> | AsyncGenerator<any> | Promise<any> | any };\n\nexport type Context = {\n message: string;\n id: string;\n signalName?: string;\n done?: boolean;\n abort?: string;\n error?: boolean;\n ack?: boolean;\n promise?: boolean;\n};\n\nexport type Event = MessageEvent<{ ctx: Context; payload: any | Error }>;\n\nexport type WorkerLike = {\n postMessage: (payload: any, transferable: any[]) => void;\n addEventListener: (\n event: string,\n listener: (e: any) => void,\n options?: { signal?: AbortSignal; once?: boolean },\n ) => void;\n removeEventListener: (event: string, listener: (e: any) => void) => void;\n} & any;\n\nexport enum LogLevel {\n disabled = 0,\n error = 1,\n lifecycle = 2,\n detail = 3,\n transport = 4,\n}\n\n// Helpers\n\nexport function deriveController(signal?: AbortSignal): [AbortController, AbortSignal] {\n const controller = new AbortController();\n return [controller, AbortSignal.any([controller.signal, signal].filter(Boolean) as AbortSignal[])];\n}\n\nexport function rejectOnSignal(promise: Promise<any>, signal: AbortSignal): Promise<Event['data']> {\n return Promise.race([\n promise,\n new Promise((resolve, reject) => {\n signal.addEventListener('abort', () => reject('RaceAborted:' + signal.reason), { once: true, signal });\n }),\n ]);\n}\n\n// Lib\n\nexport function wrpc({\n debug = LogLevel.disabled,\n name = (globalThis as any).importScripts ? 'RESPONDER' : 'CALLER',\n}: {\n debug?: LogLevel;\n name?: string;\n} = {}): {\n createResponder: <T extends Responders>(\n worker: WorkerLike,\n responders: T,\n ) => {\n responders: T;\n stop: () => void;\n };\n createCaller: <T extends Responders>(worker: WorkerLike, responders: T) => T;\n} {\n // Logger\n\n function logger(type: string) {\n return (level: number, ctx: Context | null, ...args: any[]) => {\n if (!debug || debug < level) return;\n const { id, message, ...restCtx } = ctx || {};\n console[type](name, message || '*', id || '*', ...args, restCtx);\n };\n }\n\n const log = logger('log');\n const logWarn = logger('warn');\n const logError = logger('error');\n\n // Service\n\n function send(worker: WorkerLike, ctx: Context, payload?: any) {\n log(LogLevel.transport, ctx, 'SEND', payload, typeof payload);\n worker.postMessage({ ctx, payload }, getTransferrable(payload));\n }\n\n //TODO Listener error handling\n function listen(\n worker: WorkerLike,\n context: Context | null,\n listener: (event: Event['data']) => void,\n signal: AbortSignal,\n once: boolean = false,\n ) {\n signal.addEventListener(\n 'abort',\n () => logWarn(LogLevel.detail, context, 'LISTEN SIGNAL ABORT', signal.reason),\n {\n signal,\n once: true,\n },\n );\n worker.addEventListener(\n 'message',\n ({ data }: Event) => {\n log(LogLevel.transport, context, 'LISTEN EVENT', data);\n // no context = listen all, or matching context\n if (!context || (data?.ctx?.message === context.message && data.ctx?.id === context.id)) listener(data);\n },\n { signal, once },\n );\n }\n\n function waitFor(\n worker: WorkerLike,\n ctx: Context,\n condition: (data: Event['data']) => boolean = (data) => true,\n signal: AbortSignal,\n ) {\n const [waitController, waitSignal] = deriveController(signal);\n\n return new Promise<Event['data']>((res) =>\n listen(\n worker,\n ctx,\n (data) => {\n if (!condition(data)) return;\n waitController.abort('WaitFinished');\n res(data);\n },\n waitSignal,\n ),\n );\n }\n\n // Responder\n\n //TODO Name arg\n function createResponder<T extends Responders>(\n worker: WorkerLike,\n responders: T,\n ): {\n responders: T;\n stop: () => void;\n } {\n const mainController = new AbortController();\n\n worker.addEventListener('messageerror', (e) => logError(LogLevel.error, null, 'MESSAGE ERROR', e), {\n signal: mainController.signal,\n });\n\n listen(\n worker,\n null,\n async ({ ctx, payload = {} }) => {\n if (!ctx || !ctx.message || !ctx.id || ctx.abort || ctx.ack) return; // ignore invalid and service messages\n try {\n const responder = responders[ctx.message];\n\n if (!responder) throw new Error('Unknown responder', { cause: ctx });\n\n const [subController, subSignal] = deriveController(mainController.signal);\n\n // always recover signal so that promises also can abort\n if (ctx.signalName) payload[ctx.signalName] = subSignal;\n\n const iterator = responder(payload); // no await!\n\n log(LogLevel.lifecycle, ctx, 'START', iterator);\n\n // PROMISE\n\n // https://stackoverflow.com/a/19660350/5125659 the only right way is to call function and see what it returned\n if (!iterator[Symbol.asyncIterator] && !iterator[Symbol.iterator]) {\n // Errors are caught in generic handler\n send(worker, { ...ctx, promise: true }, await rejectOnSignal(iterator, subSignal));\n log(LogLevel.detail, ctx, 'PROMISE RESOLVED');\n return;\n }\n\n // GENERATOR\n\n try {\n // Listen outside the loop to react immediately\n // Could be a wait for since abort is a one-off, but listeners are disposed by signal anyway, and we don't need to block the async thread\n listen(\n worker,\n ctx,\n (data) => {\n if (!data.ctx.abort) return;\n subController.abort(data.ctx.abort);\n logWarn(LogLevel.lifecycle, ctx, 'GOT ABORT');\n },\n subSignal,\n );\n\n let res: any;\n let nextPayload: any = payload; // does not matter, will be ignored anyway\n do {\n res = await rejectOnSignal(iterator.next(nextPayload), subSignal);\n\n send(worker, { ...ctx, done: res.done }, res.value);\n\n if (res.done) {\n subController.abort('Done');\n break;\n }\n\n const nextData = await rejectOnSignal(\n waitFor(worker, ctx, (data) => !!data.ctx.ack, subSignal),\n subSignal,\n );\n nextPayload = nextData.payload;\n\n log(LogLevel.detail, ctx, 'LOOP ACK');\n } while (!res.done && !subSignal.aborted);\n } catch (e) {\n if (!subSignal.aborted && !e.message.includes('RaceAborted')) {\n logError(LogLevel.error, ctx, 'LOOP ERROR', e);\n send(worker, { ...ctx, error: true, done: true }, e);\n }\n } finally {\n log(LogLevel.detail, ctx, 'LOOP DONE');\n }\n } catch (e) {\n // Generator-specific error handling\n logError(LogLevel.error, ctx, 'ERROR', e);\n send(worker, { ...ctx, error: true, done: true }, e); // Generic error handling\n } finally {\n log(LogLevel.detail, ctx, 'DONE');\n }\n },\n mainController.signal,\n );\n\n function stop() {\n mainController.abort('Stop');\n }\n\n return { responders, stop }; // responders needed for typing\n }\n\n // Caller\n\n //TODO Name arg\n function createCaller<T extends Responders>(worker: WorkerLike, responders: T): T {\n worker.addEventListener('messageerror', (e) => logError(LogLevel.error, null, 'MESSAGE ERROR', e));\n\n //TODO Stop\n\n return new Proxy<T>(responders as any, {\n get(target, prop, receiver) {\n function gen(payload: any) {\n const ctx: Context = { message: prop.toString(), id: crypto.randomUUID() };\n\n let signal: AbortSignal = null as any;\n\n if (payload && Object.is(payload, Object(payload))) {\n for (const [key, value] of Object.entries(payload)) {\n if (value instanceof AbortSignal) {\n log(LogLevel.detail, ctx, 'FOUND SIGNAL', key);\n ctx.signalName = key;\n signal = value;\n payload[key] = null; // will be recovered in responder\n }\n }\n }\n\n const [mainController, mainSignal] = deriveController(signal);\n\n const cancel = (notify: boolean, reason: string = '') => {\n if (mainController.signal.aborted) return;\n logWarn(LogLevel.lifecycle, ctx, 'CANCEL', reason, notify);\n if (reason) mainController.abort(reason); // stop listening\n if (notify) send(worker, { ...ctx, abort: reason }); // worker will break & acknowledge, but it's not important\n };\n\n // Generator\n\n const [promiseController, promiseSignal] = deriveController(mainSignal);\n\n const promise = waitFor(\n worker,\n ctx,\n (data) => !!data.ctx.promise || !!data.ctx.error,\n promiseSignal,\n ).then(({ ctx, payload }) => {\n if (ctx.error) {\n logError(LogLevel.error, ctx, 'PROMISE ERROR', payload);\n throw payload;\n }\n log(LogLevel.lifecycle, ctx, 'PROMISE RESOLVED', payload);\n return payload;\n });\n\n async function* generator() {\n let done = false;\n try {\n // React immediately\n mainSignal.addEventListener('abort', () => cancel(true, mainSignal.reason), {\n once: true,\n signal: mainSignal,\n });\n\n log(LogLevel.detail, ctx, 'GENERATOR START');\n promiseController.abort('GeneratorUsed');\n\n do {\n const data = await rejectOnSignal(\n waitFor(worker, ctx, undefined, mainSignal),\n mainSignal,\n );\n\n const { ctx: ctxIn, payload: value } = data;\n\n log(LogLevel.lifecycle, ctx, 'EVENT', mainSignal.aborted, ctxIn, value);\n\n if (ctxIn.promise) {\n // && !ctxIn.error\n // cancel(false, 'Resolved');\n // return payloadIn;\n logError(LogLevel.error, ctx, 'ERROR', 'Unexpected promise in generator', data);\n throw new Error('Unexpected promise in generator', { cause: data });\n }\n\n if (ctxIn.error) {\n logError(LogLevel.error, ctx, 'ERROR', data);\n cancel(false, 'Error');\n throw value;\n }\n\n if (ctxIn.done) {\n done = true;\n return value;\n } else {\n const nextPayload = yield value;\n if (!mainSignal.aborted) send(worker, { ...ctx, ack: true }, nextPayload);\n }\n } while (!mainSignal.aborted);\n } finally {\n // prevent further cycles in worker once main is closed/cancelled/aborted\n log(LogLevel.detail, ctx, 'DONE');\n cancel(true, mainSignal.aborted ? mainSignal.reason : done ? 'Done' : 'Break');\n }\n }\n\n const iterator = generator();\n\n send(worker, ctx, payload);\n\n // FIXME Nasty hack, return both iterator and promise\n // Consuming code will get both, but IDE should show only proper type\n // Consuming code will likely use only one except someone calls `for await ... of await` which is not useful in any case\n iterator['then'] = promise.then.bind(promise);\n iterator['catch'] = promise.catch.bind(promise);\n iterator['finally'] = promise.finally.bind(promise);\n return iterator;\n }\n\n //TODO mimic-function(gen, fn); but no access to original\n Object.defineProperty(gen, 'name', { value: prop.toString() });\n\n (target as any)[prop] = gen; // so that fn is visible after use, maybe not needed\n\n return gen;\n },\n }) as T;\n }\n\n return { createResponder, createCaller };\n}\n"],"names":["LogLevel","ctx","payload"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createWindow.d.ts","sourceRoot":"","sources":["../../src/electron/createWindow.ts"],"names":[],"mappings":"AAMA,OAAO,EAAa,aAAa,EAA8B,MAAM,UAAU,CAAC;AAKhF,eAAO,MAAM,KAAK,SAA4C,CAAC;AAC/D,eAAO,MAAM,OAAO,QAAmB,CAAC;AAiBxC,wBAAgB,YAAY,CAAC,EACzB,KAAY,EACZ,MAAa,EACb,eAAsB,EACtB,uBAA8B,EAC9B,WAAkB,EAClB,MAAM,EACN,OAAO,EACP,YAAsC,EACtC,aAAkB,EAAE,yDAAyD;AAC7E,OAAsC,EAAE,+DAA+D;AACvG,cAAsB,EACtB,OAAe,EACf,cAAqB,GACxB,GAAE;IACC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CACvB;;EAgLL"}
1
+ {"version":3,"file":"createWindow.d.ts","sourceRoot":"","sources":["../../src/electron/createWindow.ts"],"names":[],"mappings":"AAMA,OAAO,EAAa,aAAa,EAA8B,MAAM,UAAU,CAAC;AAKhF,eAAO,MAAM,KAAK,EAAE,OAAmD,CAAC;AACxE,eAAO,MAAM,OAAO,EAAE,MAAyB,CAAC;AAiBhD,wBAAgB,YAAY,CAAC,EACzB,KAAY,EACZ,MAAa,EACb,eAAsB,EACtB,uBAA8B,EAC9B,WAAkB,EAClB,MAAM,EACN,OAAO,EACP,YAAsC,EACtC,aAAkB,EAAE,yDAAyD;AAC7E,OAAsC,EAAE,+DAA+D;AACvG,cAAsB,EACtB,OAAe,EACf,cAAqB,GACxB,GAAE;IACC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CACvB;yBA4KoB,aAAa,GAAG,IAAI;EAI7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"createWindow.js","sources":["../../src/electron/createWindow.ts"],"sourcesContent":["import path from 'node:path';\nimport https from 'node:https';\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport url from 'node:url';\nimport { Menu, app, BrowserWindow, shell, protocol, Rectangle } from 'electron';\nimport defaultMenu from 'electron-default-menu';\nimport Store from 'electron-store';\nimport { checkForUpdates } from './updater.js';\n\nexport const isDev = process.env['NODE_ENV'] === 'development';\nexport const appPath = app.getAppPath();\n\n// See https://cs.chromium.org/chromium/src/net/base/net_error_list.h\nconst FILE_NOT_FOUND = -6;\n\nconst getPath = async (path_, file = '') => {\n try {\n const result = await fsp.stat(path_);\n\n if (result.isFile()) return path_;\n\n if (result.isDirectory()) return getPath(path.join(path_, `${file}.html`));\n } catch {\n /* empty */\n }\n};\n\nexport function createWindow({\n width = 1000,\n height = 1000,\n disableSecurity = true,\n disableSecurityWarnings = true,\n quitOnClose = true,\n onOpen,\n onClose,\n localhostUrl = 'http://localhost:3000',\n productionUrl = '', // in this mode Electron acts as a browser for remote app\n webPath = path.resolve(appPath, 'web'), // must conform to what is in electron-builder.js files section\n useStaticInDev = false,\n updater = false,\n rememberBounds = true,\n}: {\n width?: number;\n height?: number;\n disableSecurity?: boolean;\n disableSecurityWarnings?: boolean;\n quitOnClose?: boolean;\n onOpen?: (win: BrowserWindow) => void;\n onClose?: (win: BrowserWindow) => void;\n localhostUrl?: string;\n productionUrl?: string;\n webPath?: string;\n useStaticInDev?: boolean;\n updater?: boolean;\n rememberBounds?: boolean;\n} = {}) {\n let mainWindow: BrowserWindow | null = null;\n\n console.log('[APP] Starting Electron', {\n isDev,\n appPath,\n useStaticInDev,\n localhostUrl,\n productionUrl,\n webPath,\n updater,\n rememberBounds,\n quitOnClose,\n disableSecurity,\n disableSecurityWarnings,\n });\n\n if (!productionUrl && !webPath) {\n throw new Error('productionUrl or webPath must be defined');\n }\n\n if (productionUrl && webPath) {\n throw new Error('productionUrl and webPath cannot be used together');\n }\n\n if (!localhostUrl) {\n throw new Error('localhostUrl must be defined');\n }\n\n const store = new Store<{ bounds: Rectangle }>({\n schema: {\n bounds: {\n type: 'object',\n properties: {\n // Docs: https://electronjs.org/docs/api/structures/rectangle\n height: { type: 'number' },\n width: { type: 'number' },\n x: { type: 'number' },\n y: { type: 'number' },\n },\n },\n },\n });\n\n if (disableSecurityWarnings) process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';\n process.env['ELECTRON_ENABLE_LOGGING'] = 'true';\n\n process.on('SIGTERM', () => process.exit(0));\n process.on('SIGINT', () => process.exit(0));\n\n const openDevTools = () => {\n if (!mainWindow) return;\n mainWindow.setSize(width + 800, height);\n mainWindow.center();\n mainWindow.webContents.openDevTools();\n };\n\n const createWindow = async () => {\n mainWindow = new BrowserWindow({\n width,\n height,\n icon: path.resolve(appPath, 'assets/icon.png'),\n webPreferences: {\n nodeIntegration: false, // is default value after Electron v5\n contextIsolation: true, // protect against prototype pollution\n webSecurity: !disableSecurity,\n devTools: true,\n },\n ...(rememberBounds ? store.get('bounds') : {}),\n });\n\n mainWindow.on('move', () => rememberBounds && mainWindow && store.set('bounds', mainWindow.getBounds()));\n\n mainWindow.once('ready-to-show', () => isDev && openDevTools());\n\n // Static interceptor\n\n let interceptor: (() => void) | null = null;\n\n if (webPath && (!isDev || useStaticInDev)) {\n console.log(`[APP] Static Server Enabled, ${localhostUrl} will be intercepted to ${webPath}`);\n\n //TODO https://localhost:3000\n // @see https://github.com/sindresorhus/electron-serve/blob/main/index.js\n protocol.interceptStreamProtocol('http', (request, callback) => {\n if (request.url.startsWith(localhostUrl)) {\n let fileUrl = url.parse(request.url, false).pathname;\n\n if (!fileUrl) return callback({ error: FILE_NOT_FOUND });\n\n if (fileUrl === '/') fileUrl = 'index.html';\n\n const filePath = path.join(webPath, fileUrl);\n\n const relativePath = path.relative(webPath, fileUrl);\n\n const isSafe = !relativePath.startsWith('..') && !path.isAbsolute(relativePath);\n\n if (!isSafe && !isDev) return callback({ error: FILE_NOT_FOUND });\n\n // const finalPath = await getPath(filePath, options.file);\n // const fileExtension = path.extname(filePath);\n\n console.log('[APP] Static Server', fileUrl, '->', filePath);\n\n // return {path: path.join(webPath, fileUrl)};\n callback(fs.createReadStream(filePath));\n\n return true;\n }\n\n // return {url: request.url};\n (request.url.startsWith('https') ? https : http).get(request.url, callback);\n\n return true;\n });\n\n interceptor = () => protocol.uninterceptProtocol('http');\n }\n\n mainWindow.on('closed', () => {\n interceptor?.();\n onClose?.(mainWindow as never);\n mainWindow = null;\n interceptor = null;\n });\n\n // External URLs\n\n mainWindow.webContents.setWindowOpenHandler(({ url }) => {\n shell.openExternal(url).catch((e) => console.error(e));\n return { action: 'deny' };\n });\n\n // Menu\n\n const menu = defaultMenu(app, shell);\n\n if (updater) {\n (menu.at(-1)!.submenu as any).push(\n { type: 'separator' },\n {\n label: 'Check For Updates',\n click: checkForUpdates,\n },\n );\n }\n\n Menu.setApplicationMenu(Menu.buildFromTemplate(menu)); //TODO onMenu\n\n // Should be last, after all listeners and menu\n\n await app.whenReady();\n\n onOpen?.(mainWindow);\n\n if (!onOpen && localhostUrl) {\n await mainWindow.loadURL(productionUrl && !isDev ? productionUrl : `${localhostUrl}/`);\n }\n\n console.log('[APP] Main Window Open');\n };\n\n app.on('ready', createWindow);\n\n app.on('window-all-closed', () => {\n if (process.platform !== 'darwin' || quitOnClose) app.quit();\n });\n\n app.on('activate', () => BrowserWindow.getAllWindows().length === 0 && !mainWindow && createWindow());\n\n return {\n get mainWindow() {\n return mainWindow;\n },\n };\n}\n"],"names":["createWindow","url"],"mappings":";;;;;;;;;;AAWO,MAAM,QAAQ,QAAQ,IAAI,UAAU,MAAM;AACpC,MAAA,UAAU,IAAI,WAAW;AAGtC,MAAM,iBAAiB;AAchB,SAAS,aAAa;AAAA,EACzB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA;AAAA,EAChB,UAAU,KAAK,QAAQ,SAAS,KAAK;AAAA;AAAA,EACrC,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,iBAAiB;AACrB,IAcI,IAAI;AACJ,MAAI,aAAmC;AAEvC,UAAQ,IAAI,2BAA2B;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACH;AAEG,MAAA,CAAC,iBAAiB,CAAC,SAAS;AACtB,UAAA,IAAI,MAAM,0CAA0C;AAAA,EAAA;AAG9D,MAAI,iBAAiB,SAAS;AACpB,UAAA,IAAI,MAAM,mDAAmD;AAAA,EAAA;AAGvE,MAAI,CAAC,cAAc;AACT,UAAA,IAAI,MAAM,8BAA8B;AAAA,EAAA;AAG5C,QAAA,QAAQ,IAAI,MAA6B;AAAA,IAC3C,QAAQ;AAAA,MACJ,QAAQ;AAAA,QACJ,MAAM;AAAA,QACN,YAAY;AAAA;AAAA,UAER,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,GAAG,EAAE,MAAM,SAAS;AAAA,UACpB,GAAG,EAAE,MAAM,SAAS;AAAA,QAAA;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ,CACH;AAED,MAAI,wBAAyB,SAAQ,IAAI,oCAAoC,IAAI;AACzE,UAAA,IAAI,yBAAyB,IAAI;AAEzC,UAAQ,GAAG,WAAW,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC3C,UAAQ,GAAG,UAAU,MAAM,QAAQ,KAAK,CAAC,CAAC;AAE1C,QAAM,eAAe,MAAM;AACvB,QAAI,CAAC,WAAY;AACN,eAAA,QAAQ,QAAQ,KAAK,MAAM;AACtC,eAAW,OAAO;AAClB,eAAW,YAAY,aAAa;AAAA,EACxC;AAEA,QAAMA,gBAAe,YAAY;AAC7B,iBAAa,IAAI,cAAc;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,MAAM,KAAK,QAAQ,SAAS,iBAAiB;AAAA,MAC7C,gBAAgB;AAAA,QACZ,iBAAiB;AAAA;AAAA,QACjB,kBAAkB;AAAA;AAAA,QAClB,aAAa,CAAC;AAAA,QACd,UAAU;AAAA,MACd;AAAA,MACA,GAAI,iBAAiB,MAAM,IAAI,QAAQ,IAAI,CAAA;AAAA,IAAC,CAC/C;AAEU,eAAA,GAAG,QAAQ,MAAM,kBAAkB,cAAc,MAAM,IAAI,UAAU,WAAW,UAAW,CAAA,CAAC;AAEvG,eAAW,KAAK,iBAAiB,MAAM,SAAS,cAAc;AAI9D,QAAI,cAAmC;AAEnC,QAAA,YAAY,CAAC,SAAS,iBAAiB;AACvC,cAAQ,IAAI,gCAAgC,YAAY,2BAA2B,OAAO,EAAE;AAI5F,eAAS,wBAAwB,QAAQ,CAAC,SAAS,aAAa;AAC5D,YAAI,QAAQ,IAAI,WAAW,YAAY,GAAG;AACtC,cAAI,UAAU,IAAI,MAAM,QAAQ,KAAK,KAAK,EAAE;AAE5C,cAAI,CAAC,QAAS,QAAO,SAAS,EAAE,OAAO,gBAAgB;AAEnD,cAAA,YAAY,IAAe,WAAA;AAE/B,gBAAM,WAAW,KAAK,KAAK,SAAS,OAAO;AAE3C,gBAAM,eAAe,KAAK,SAAS,SAAS,OAAO;AAE7C,gBAAA,SAAS,CAAC,aAAa,WAAW,IAAI,KAAK,CAAC,KAAK,WAAW,YAAY;AAE1E,cAAA,CAAC,UAAU,CAAC,cAAc,SAAS,EAAE,OAAO,gBAAgB;AAKhE,kBAAQ,IAAI,uBAAuB,SAAS,MAAM,QAAQ;AAGjD,mBAAA,GAAG,iBAAiB,QAAQ,CAAC;AAE/B,iBAAA;AAAA,QAAA;AAIV,SAAA,QAAQ,IAAI,WAAW,OAAO,IAAI,QAAQ,MAAM,IAAI,QAAQ,KAAK,QAAQ;AAEnE,eAAA;AAAA,MAAA,CACV;AAEa,oBAAA,MAAM,SAAS,oBAAoB,MAAM;AAAA,IAAA;AAGhD,eAAA,GAAG,UAAU,MAAM;AACZ;AACd,yCAAU;AACG,mBAAA;AACC,oBAAA;AAAA,IAAA,CACjB;AAID,eAAW,YAAY,qBAAqB,CAAC,EAAE,KAAAC,WAAU;AAC/C,YAAA,aAAaA,IAAG,EAAE,MAAM,CAAC,MAAM,QAAQ,MAAM,CAAC,CAAC;AAC9C,aAAA,EAAE,QAAQ,OAAO;AAAA,IAAA,CAC3B;AAIK,UAAA,OAAO,YAAY,KAAK,KAAK;AAEnC,QAAI,SAAS;AACR,WAAK,GAAG,EAAE,EAAG,QAAgB;AAAA,QAC1B,EAAE,MAAM,YAAY;AAAA,QACpB;AAAA,UACI,OAAO;AAAA,UACP,OAAO;AAAA,QAAA;AAAA,MAEf;AAAA,IAAA;AAGJ,SAAK,mBAAmB,KAAK,kBAAkB,IAAI,CAAC;AAIpD,UAAM,IAAI,UAAU;AAEpB,qCAAS;AAEL,QAAA,CAAC,UAAU,cAAc;AACnB,YAAA,WAAW,QAAQ,iBAAiB,CAAC,QAAQ,gBAAgB,GAAG,YAAY,GAAG;AAAA,IAAA;AAGzF,YAAQ,IAAI,wBAAwB;AAAA,EACxC;AAEI,MAAA,GAAG,SAASD,aAAY;AAExB,MAAA,GAAG,qBAAqB,MAAM;AAC9B,QAAI,QAAQ,aAAa,YAAY,iBAAiB,KAAK;AAAA,EAAA,CAC9D;AAEG,MAAA,GAAG,YAAY,MAAM,cAAc,gBAAgB,WAAW,KAAK,CAAC,cAAcA,cAAAA,CAAc;AAE7F,SAAA;AAAA,IACH,IAAI,aAAa;AACN,aAAA;AAAA,IAAA;AAAA,EAEf;AACJ;"}
1
+ {"version":3,"file":"createWindow.js","sources":["../../src/electron/createWindow.ts"],"sourcesContent":["import path from 'node:path';\nimport https from 'node:https';\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport url from 'node:url';\nimport { Menu, app, BrowserWindow, shell, protocol, Rectangle } from 'electron';\nimport defaultMenu from 'electron-default-menu';\nimport Store from 'electron-store';\nimport { checkForUpdates } from './updater.js';\n\nexport const isDev: boolean = process.env['NODE_ENV'] === 'development';\nexport const appPath: string = app.getAppPath();\n\n// See https://cs.chromium.org/chromium/src/net/base/net_error_list.h\nconst FILE_NOT_FOUND = -6;\n\nconst getPath = async (path_, file = '') => {\n try {\n const result = await fsp.stat(path_);\n\n if (result.isFile()) return path_;\n\n if (result.isDirectory()) return getPath(path.join(path_, `${file}.html`));\n } catch {\n /* empty */\n }\n};\n\nexport function createWindow({\n width = 1000,\n height = 1000,\n disableSecurity = true,\n disableSecurityWarnings = true,\n quitOnClose = true,\n onOpen,\n onClose,\n localhostUrl = 'http://localhost:3000',\n productionUrl = '', // in this mode Electron acts as a browser for remote app\n webPath = path.resolve(appPath, 'web'), // must conform to what is in electron-builder.js files section\n useStaticInDev = false,\n updater = false,\n rememberBounds = true,\n}: {\n width?: number;\n height?: number;\n disableSecurity?: boolean;\n disableSecurityWarnings?: boolean;\n quitOnClose?: boolean;\n onOpen?: (win: BrowserWindow) => void;\n onClose?: (win: BrowserWindow) => void;\n localhostUrl?: string;\n productionUrl?: string;\n webPath?: string;\n useStaticInDev?: boolean;\n updater?: boolean;\n rememberBounds?: boolean;\n} = {}) {\n let mainWindow: BrowserWindow | null = null;\n\n console.log('[APP] Starting Electron', {\n isDev,\n appPath,\n useStaticInDev,\n localhostUrl,\n productionUrl,\n webPath,\n updater,\n rememberBounds,\n quitOnClose,\n disableSecurity,\n disableSecurityWarnings,\n });\n\n if (!productionUrl && !webPath) {\n throw new Error('productionUrl or webPath must be defined');\n }\n\n if (productionUrl && webPath) {\n throw new Error('productionUrl and webPath cannot be used together');\n }\n\n if (!localhostUrl) {\n throw new Error('localhostUrl must be defined');\n }\n\n const store = new Store<{ bounds: Rectangle }>({\n schema: {\n bounds: {\n type: 'object',\n properties: {\n // Docs: https://electronjs.org/docs/api/structures/rectangle\n height: { type: 'number' },\n width: { type: 'number' },\n x: { type: 'number' },\n y: { type: 'number' },\n },\n },\n },\n });\n\n if (disableSecurityWarnings) process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';\n process.env['ELECTRON_ENABLE_LOGGING'] = 'true';\n\n process.on('SIGTERM', () => process.exit(0));\n process.on('SIGINT', () => process.exit(0));\n\n const openDevTools = () => {\n if (!mainWindow) return;\n mainWindow.setSize(width + 800, height);\n mainWindow.center();\n mainWindow.webContents.openDevTools();\n };\n\n const createWindow = async () => {\n mainWindow = new BrowserWindow({\n width,\n height,\n icon: path.resolve(appPath, 'assets/icon.png'),\n webPreferences: {\n nodeIntegration: false, // is default value after Electron v5\n contextIsolation: true, // protect against prototype pollution\n webSecurity: !disableSecurity,\n devTools: true,\n },\n ...(rememberBounds ? store.get('bounds') : {}),\n });\n\n mainWindow.on('move', () => rememberBounds && mainWindow && store.set('bounds', mainWindow.getBounds()));\n\n mainWindow.once('ready-to-show', () => isDev && openDevTools());\n\n // Static interceptor\n\n let interceptor: (() => void) | null = null;\n\n if (webPath && (!isDev || useStaticInDev)) {\n console.log(`[APP] Static Server Enabled, ${localhostUrl} will be intercepted to ${webPath}`);\n\n //TODO https://localhost:3000\n // @see https://github.com/sindresorhus/electron-serve/blob/main/index.js\n protocol.interceptStreamProtocol('http', (request, callback) => {\n if (request.url.startsWith(localhostUrl)) {\n let fileUrl = url.parse(request.url, false).pathname;\n\n if (!fileUrl) return callback({ error: FILE_NOT_FOUND });\n\n if (fileUrl === '/') fileUrl = 'index.html';\n\n const filePath = path.join(webPath, fileUrl);\n\n const relativePath = path.relative(webPath, fileUrl);\n\n const isSafe = !relativePath.startsWith('..') && !path.isAbsolute(relativePath);\n\n if (!isSafe && !isDev) return callback({ error: FILE_NOT_FOUND });\n\n // const finalPath = await getPath(filePath, options.file);\n // const fileExtension = path.extname(filePath);\n\n console.log('[APP] Static Server', fileUrl, '->', filePath);\n\n // return {path: path.join(webPath, fileUrl)};\n callback(fs.createReadStream(filePath));\n\n return true;\n }\n\n // return {url: request.url};\n (request.url.startsWith('https') ? https : http).get(request.url, callback);\n\n return true;\n });\n\n interceptor = () => protocol.uninterceptProtocol('http');\n }\n\n mainWindow.on('closed', () => {\n interceptor?.();\n onClose?.(mainWindow as never);\n mainWindow = null;\n interceptor = null;\n });\n\n // External URLs\n\n mainWindow.webContents.setWindowOpenHandler(({ url }) => {\n shell.openExternal(url).catch((e) => console.error(e));\n return { action: 'deny' };\n });\n\n // Menu\n\n const menu = defaultMenu(app, shell);\n\n if (updater) {\n (menu.at(-1)!.submenu as any).push(\n { type: 'separator' },\n {\n label: 'Check For Updates',\n click: checkForUpdates,\n },\n );\n }\n\n Menu.setApplicationMenu(Menu.buildFromTemplate(menu)); //TODO onMenu\n\n // Should be last, after all listeners and menu\n\n await app.whenReady();\n\n onOpen?.(mainWindow);\n\n if (!onOpen && localhostUrl) {\n await mainWindow.loadURL(productionUrl && !isDev ? productionUrl : `${localhostUrl}/`);\n }\n\n console.log('[APP] Main Window Open');\n };\n\n app.on('ready', createWindow);\n\n app.on('window-all-closed', () => {\n if (process.platform !== 'darwin' || quitOnClose) app.quit();\n });\n\n app.on('activate', () => BrowserWindow.getAllWindows().length === 0 && !mainWindow && createWindow());\n\n return {\n get mainWindow(): BrowserWindow | null {\n return mainWindow;\n },\n };\n}\n"],"names":["createWindow","url"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare function checkForUpdates(menuItem: any, focusedWindow: any, event: any): void;
1
+ export declare function checkForUpdates(menuItem: any): void;
2
2
  //# sourceMappingURL=updater.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/electron/updater.ts"],"names":[],"mappings":"AAiDA,wBAAgB,eAAe,CAAC,QAAQ,KAAA,EAAE,aAAa,KAAA,EAAE,KAAK,KAAA,QAI7D"}
1
+ {"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/electron/updater.ts"],"names":[],"mappings":"AAiDA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAInD"}
@@ -36,7 +36,7 @@ autoUpdater.on("update-downloaded", async () => {
36
36
  });
37
37
  autoUpdater.quitAndInstall();
38
38
  });
39
- function checkForUpdates(menuItem, focusedWindow, event) {
39
+ function checkForUpdates(menuItem) {
40
40
  updateButton = menuItem;
41
41
  updateButton.enabled = false;
42
42
  autoUpdater.checkForUpdates().catch((e) => console.error("Update error", e));
@@ -1 +1 @@
1
- {"version":3,"file":"updater.js","sources":["../../src/electron/updater.ts"],"sourcesContent":["// https://github.com/electron-userland/electron-builder/blob/docs-deprecated/encapsulated%20manual%20update%20via%20menu.js\nimport { dialog } from 'electron';\nimport updater from 'electron-updater';\nconst { autoUpdater } = updater;\n\nlet updateButton;\n\nautoUpdater.autoDownload = false;\n\nautoUpdater.on('error', (error) => {\n dialog.showErrorBox('Error: ', !error ? 'unknown' : (error.stack || error).toString());\n});\n\nautoUpdater.on('update-available', async () => {\n const { response } = await dialog.showMessageBox({\n type: 'info',\n title: 'Found Updates',\n message: 'Found updates, do you want update now?',\n buttons: ['Yes', 'No'],\n });\n\n updateButton.enabled = true;\n updateButton = null;\n\n if (response === 0) await autoUpdater.downloadUpdate();\n});\n\nautoUpdater.on('update-not-available', async () => {\n try {\n await dialog.showMessageBox({\n title: 'No Updates',\n message: 'Current version is up-to-date.',\n });\n } catch (e) {\n dialog.showErrorBox('Error: ', e.toString());\n }\n updateButton.enabled = true;\n updateButton = null;\n});\n\nautoUpdater.on('update-downloaded', async () => {\n await dialog.showMessageBox({\n title: 'Install Update',\n message: 'Update downloaded, application will quit for update...',\n });\n\n autoUpdater.quitAndInstall();\n});\n\nexport function checkForUpdates(menuItem, focusedWindow, event) {\n updateButton = menuItem;\n updateButton.enabled = false;\n autoUpdater.checkForUpdates().catch((e) => console.error('Update error', e));\n}\n"],"names":[],"mappings":";;AAGA,MAAM,EAAE,YAAgB,IAAA;AAExB,IAAI;AAEJ,YAAY,eAAe;AAE3B,YAAY,GAAG,SAAS,CAAC,UAAU;AACxB,SAAA,aAAa,WAAW,CAAC,QAAQ,aAAa,MAAM,SAAS,OAAO,UAAU;AACzF,CAAC;AAED,YAAY,GAAG,oBAAoB,YAAY;AAC3C,QAAM,EAAE,SAAA,IAAa,MAAM,OAAO,eAAe;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS,CAAC,OAAO,IAAI;AAAA,EAAA,CACxB;AAED,eAAa,UAAU;AACR,iBAAA;AAEf,MAAI,aAAa,EAAS,OAAA,YAAY,eAAe;AACzD,CAAC;AAED,YAAY,GAAG,wBAAwB,YAAY;AAC3C,MAAA;AACA,UAAM,OAAO,eAAe;AAAA,MACxB,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ;AAAA,WACI,GAAG;AACR,WAAO,aAAa,WAAW,EAAE,SAAA,CAAU;AAAA,EAAA;AAE/C,eAAa,UAAU;AACR,iBAAA;AACnB,CAAC;AAED,YAAY,GAAG,qBAAqB,YAAY;AAC5C,QAAM,OAAO,eAAe;AAAA,IACxB,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,CACZ;AAED,cAAY,eAAe;AAC/B,CAAC;AAEe,SAAA,gBAAgB,UAAU,eAAe,OAAO;AAC7C,iBAAA;AACf,eAAa,UAAU;AACX,cAAA,kBAAkB,MAAM,CAAC,MAAM,QAAQ,MAAM,gBAAgB,CAAC,CAAC;AAC/E;"}
1
+ {"version":3,"file":"updater.js","sources":["../../src/electron/updater.ts"],"sourcesContent":["// https://github.com/electron-userland/electron-builder/blob/docs-deprecated/encapsulated%20manual%20update%20via%20menu.js\nimport { dialog } from 'electron';\nimport updater from 'electron-updater';\nconst { autoUpdater } = updater;\n\nlet updateButton;\n\nautoUpdater.autoDownload = false;\n\nautoUpdater.on('error', (error) => {\n dialog.showErrorBox('Error: ', !error ? 'unknown' : (error.stack || error).toString());\n});\n\nautoUpdater.on('update-available', async () => {\n const { response } = await dialog.showMessageBox({\n type: 'info',\n title: 'Found Updates',\n message: 'Found updates, do you want update now?',\n buttons: ['Yes', 'No'],\n });\n\n updateButton.enabled = true;\n updateButton = null;\n\n if (response === 0) await autoUpdater.downloadUpdate();\n});\n\nautoUpdater.on('update-not-available', async () => {\n try {\n await dialog.showMessageBox({\n title: 'No Updates',\n message: 'Current version is up-to-date.',\n });\n } catch (e) {\n dialog.showErrorBox('Error: ', e.toString());\n }\n updateButton.enabled = true;\n updateButton = null;\n});\n\nautoUpdater.on('update-downloaded', async () => {\n await dialog.showMessageBox({\n title: 'Install Update',\n message: 'Update downloaded, application will quit for update...',\n });\n\n autoUpdater.quitAndInstall();\n});\n\nexport function checkForUpdates(menuItem: any): void {\n updateButton = menuItem;\n updateButton.enabled = false;\n autoUpdater.checkForUpdates().catch((e) => console.error('Update error', e));\n}\n"],"names":[],"mappings":";;AAGA,MAAM,EAAE,YAAgB,IAAA;AAExB,IAAI;AAEJ,YAAY,eAAe;AAE3B,YAAY,GAAG,SAAS,CAAC,UAAU;AACxB,SAAA,aAAa,WAAW,CAAC,QAAQ,aAAa,MAAM,SAAS,OAAO,UAAU;AACzF,CAAC;AAED,YAAY,GAAG,oBAAoB,YAAY;AAC3C,QAAM,EAAE,SAAA,IAAa,MAAM,OAAO,eAAe;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS,CAAC,OAAO,IAAI;AAAA,EAAA,CACxB;AAED,eAAa,UAAU;AACR,iBAAA;AAEf,MAAI,aAAa,EAAS,OAAA,YAAY,eAAe;AACzD,CAAC;AAED,YAAY,GAAG,wBAAwB,YAAY;AAC3C,MAAA;AACA,UAAM,OAAO,eAAe;AAAA,MACxB,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ;AAAA,WACI,GAAG;AACR,WAAO,aAAa,WAAW,EAAE,SAAA,CAAU;AAAA,EAAA;AAE/C,eAAa,UAAU;AACR,iBAAA;AACnB,CAAC;AAED,YAAY,GAAG,qBAAqB,YAAY;AAC5C,QAAM,OAAO,eAAe;AAAA,IACxB,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,CACZ;AAED,cAAY,eAAe;AAC/B,CAAC;AAEM,SAAS,gBAAgB,UAAqB;AAClC,iBAAA;AACf,eAAa,UAAU;AACX,cAAA,kBAAkB,MAAM,CAAC,MAAM,QAAQ,MAAM,gBAAgB,CAAC,CAAC;AAC/E;"}
@@ -1 +1 @@
1
- {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/electron-builder/images.ts"],"names":[],"mappings":"AAIA,wBAAsB,cAAc,CAAC,EACjC,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GAChB,EAAE;IACC,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACzB,iBAkBA"}
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/electron-builder/images.ts"],"names":[],"mappings":"AAIA,wBAAsB,cAAc,CAAC,EACjC,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GAChB,EAAE;IACC,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"images.js","sources":["../../src/electron-builder/images.ts"],"sourcesContent":["import psd from 'psd';\nimport sharp from 'sharp';\nimport path from 'node:path';\n\nexport async function generateImages({\n iconPsdPath,\n dmgBackgroundPsdPath,\n electronAssetsPath,\n webPublicPath,\n}: {\n iconPsdPath: string;\n dmgBackgroundPsdPath: string;\n electronAssetsPath: string;\n webPublicPath: string;\n}) {\n const iconPsd = await psd.open(iconPsdPath);\n await iconPsd.image!.saveAsPng(path.join(electronAssetsPath, 'icon.png'));\n\n const bgPsd = await psd.open(dmgBackgroundPsdPath);\n await bgPsd.image!.saveAsPng(path.join(electronAssetsPath, 'background@2x.png'));\n\n const iconPng = sharp(path.join(electronAssetsPath, 'icon.png'));\n const bgPng = sharp(path.join(electronAssetsPath, 'background@2x.png'));\n\n await bgPng.resize(500).toFile(path.join(electronAssetsPath, 'background.png'));\n\n await iconPng.toFile(path.join(electronAssetsPath, 'splash.webp'));\n await iconPng.toFile(path.join(electronAssetsPath, 'icon.icns'));\n\n //TODO Crop without icon BG\n await iconPng.toFile(path.join(webPublicPath, 'icon.png'));\n await iconPng.resize(32).toFile(path.join(webPublicPath, 'favicon.ico'));\n}\n"],"names":[],"mappings":";;;AAIA,eAAsB,eAAe;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKG;AACC,QAAM,UAAU,MAAM,IAAI,KAAK,WAAW;AAC1C,QAAM,QAAQ,MAAO,UAAU,KAAK,KAAK,oBAAoB,UAAU,CAAC;AAExE,QAAM,QAAQ,MAAM,IAAI,KAAK,oBAAoB;AACjD,QAAM,MAAM,MAAO,UAAU,KAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAE/E,QAAM,UAAU,MAAM,KAAK,KAAK,oBAAoB,UAAU,CAAC;AAC/D,QAAM,QAAQ,MAAM,KAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAEhE,QAAA,MAAM,OAAO,GAAG,EAAE,OAAO,KAAK,KAAK,oBAAoB,gBAAgB,CAAC;AAE9E,QAAM,QAAQ,OAAO,KAAK,KAAK,oBAAoB,aAAa,CAAC;AACjE,QAAM,QAAQ,OAAO,KAAK,KAAK,oBAAoB,WAAW,CAAC;AAG/D,QAAM,QAAQ,OAAO,KAAK,KAAK,eAAe,UAAU,CAAC;AACnD,QAAA,QAAQ,OAAO,EAAE,EAAE,OAAO,KAAK,KAAK,eAAe,aAAa,CAAC;AAC3E;"}
1
+ {"version":3,"file":"images.js","sources":["../../src/electron-builder/images.ts"],"sourcesContent":["import psd from 'psd';\nimport sharp from 'sharp';\nimport path from 'node:path';\n\nexport async function generateImages({\n iconPsdPath,\n dmgBackgroundPsdPath,\n electronAssetsPath,\n webPublicPath,\n}: {\n iconPsdPath: string;\n dmgBackgroundPsdPath: string;\n electronAssetsPath: string;\n webPublicPath: string;\n}): Promise<void> {\n const iconPsd = await psd.open(iconPsdPath);\n await iconPsd.image!.saveAsPng(path.join(electronAssetsPath, 'icon.png'));\n\n const bgPsd = await psd.open(dmgBackgroundPsdPath);\n await bgPsd.image!.saveAsPng(path.join(electronAssetsPath, 'background@2x.png'));\n\n const iconPng = sharp(path.join(electronAssetsPath, 'icon.png'));\n const bgPng = sharp(path.join(electronAssetsPath, 'background@2x.png'));\n\n await bgPng.resize(500).toFile(path.join(electronAssetsPath, 'background.png'));\n\n await iconPng.toFile(path.join(electronAssetsPath, 'splash.webp'));\n await iconPng.toFile(path.join(electronAssetsPath, 'icon.icns'));\n\n //TODO Crop without icon BG\n await iconPng.toFile(path.join(webPublicPath, 'icon.png'));\n await iconPng.resize(32).toFile(path.join(webPublicPath, 'favicon.ico'));\n}\n"],"names":[],"mappings":";;;AAIA,eAAsB,eAAe;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKkB;AACd,QAAM,UAAU,MAAM,IAAI,KAAK,WAAW;AAC1C,QAAM,QAAQ,MAAO,UAAU,KAAK,KAAK,oBAAoB,UAAU,CAAC;AAExE,QAAM,QAAQ,MAAM,IAAI,KAAK,oBAAoB;AACjD,QAAM,MAAM,MAAO,UAAU,KAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAE/E,QAAM,UAAU,MAAM,KAAK,KAAK,oBAAoB,UAAU,CAAC;AAC/D,QAAM,QAAQ,MAAM,KAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAEhE,QAAA,MAAM,OAAO,GAAG,EAAE,OAAO,KAAK,KAAK,oBAAoB,gBAAgB,CAAC;AAE9E,QAAM,QAAQ,OAAO,KAAK,KAAK,oBAAoB,aAAa,CAAC;AACjE,QAAM,QAAQ,OAAO,KAAK,KAAK,oBAAoB,WAAW,CAAC;AAG/D,QAAM,QAAQ,OAAO,KAAK,KAAK,eAAe,UAAU,CAAC;AACnD,QAAA,QAAQ,OAAO,EAAE,EAAE,OAAO,KAAK,KAAK,eAAe,aAAa,CAAC;AAC3E;"}
@@ -1,5 +1,5 @@
1
+ import { FC } from 'react';
1
2
  import { GenericControlProps } from './genericControl';
2
- import * as React from 'react';
3
3
  export type FormControlFieldsetProps = GenericControlProps;
4
- export declare const FormControlFieldset: React.FC<FormControlFieldsetProps>;
4
+ export declare const FormControlFieldset: FC<FormControlFieldsetProps>;
5
5
  //# sourceMappingURL=formControlFieldset.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formControlFieldset.d.ts","sourceRoot":"","sources":["../../src/mui/formControlFieldset.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAkB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvE,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AAE3D,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAmBlE,CAAC"}
1
+ {"version":3,"file":"formControlFieldset.d.ts","sourceRoot":"","sources":["../../src/mui/formControlFieldset.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAkB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvE,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AAE3D,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,CAmB5D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"formControlFieldset.js","sources":["../../src/mui/formControlFieldset.tsx"],"sourcesContent":["import * as React from 'react';\nimport { GenericControl, GenericControlProps } from './genericControl';\nimport { inputClasses } from '@mui/material/Input';\n\nexport type FormControlFieldsetProps = GenericControlProps;\n\nexport const FormControlFieldset: React.FC<FormControlFieldsetProps> = function FormControlFieldset({\n children,\n sx,\n ...props\n}) {\n return (\n <GenericControl\n {...props}\n component=\"fieldset\"\n sx={{\n ...sx,\n [`legend + .${inputClasses.root}`]: {\n marginTop: 2, //FIXME 16px, hardcoded from @mui/material/Input/Input.js @ 59\n },\n }}\n >\n {children}\n </GenericControl>\n );\n};\n"],"names":["FormControlFieldset"],"mappings":";;;AAMa,MAAA,sBAA0D,SAASA,qBAAoB;AAAA,EAChG;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAG;AAEK,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAU;AAAA,MACV,IAAI;AAAA,QACA,GAAG;AAAA,QACH,CAAC,aAAa,aAAa,IAAI,EAAE,GAAG;AAAA,UAChC,WAAW;AAAA;AAAA,QAAA;AAAA,MAEnB;AAAA,MAEC;AAAA,IAAA;AAAA,EACL;AAER;"}
1
+ {"version":3,"file":"formControlFieldset.js","sources":["../../src/mui/formControlFieldset.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport { GenericControl, GenericControlProps } from './genericControl';\nimport { inputClasses } from '@mui/material/Input';\n\nexport type FormControlFieldsetProps = GenericControlProps;\n\nexport const FormControlFieldset: FC<FormControlFieldsetProps> = function FormControlFieldset({\n children,\n sx,\n ...props\n}) {\n return (\n <GenericControl\n {...props}\n component=\"fieldset\"\n sx={{\n ...sx,\n [`legend + .${inputClasses.root}`]: {\n marginTop: 2, //FIXME 16px, hardcoded from @mui/material/Input/Input.js @ 59\n },\n }}\n >\n {children}\n </GenericControl>\n );\n};\n"],"names":["FormControlFieldset"],"mappings":";;;AAMa,MAAA,sBAAoD,SAASA,qBAAoB;AAAA,EAC1F;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAG;AAEK,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAU;AAAA,MACV,IAAI;AAAA,QACA,GAAG;AAAA,QACH,CAAC,aAAa,aAAa,IAAI,EAAE,GAAG;AAAA,UAChC,WAAW;AAAA;AAAA,QAAA;AAAA,MAEnB;AAAA,MAEC;AAAA,IAAA;AAAA,EACL;AAER;"}
@@ -1,4 +1,4 @@
1
+ import { FC } from 'react';
1
2
  import { InputLabelProps } from '@mui/material/InputLabel';
2
- import * as React from 'react';
3
- export declare const FormLabelLegend: React.FC<InputLabelProps>;
3
+ export declare const FormLabelLegend: FC<InputLabelProps>;
4
4
  //# sourceMappingURL=formLabelLegend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formLabelLegend.d.ts","sourceRoot":"","sources":["../../src/mui/formLabelLegend.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAyB,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAElF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAOrD,CAAC"}
1
+ {"version":3,"file":"formLabelLegend.d.ts","sourceRoot":"","sources":["../../src/mui/formLabelLegend.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAyB,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAElF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,eAAe,CAO/C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"formLabelLegend.js","sources":["../../src/mui/formLabelLegend.tsx"],"sourcesContent":["import * as React from 'react';\nimport { default as InputLabel, InputLabelProps } from '@mui/material/InputLabel';\n\nexport const FormLabelLegend: React.FC<InputLabelProps> = ({ children, ...props }) => {\n return (\n // sx={(theme) => theme.typography.caption}\n <InputLabel {...props} shrink={true} component={'legend' as any}>\n {children}\n </InputLabel>\n );\n};\n"],"names":[],"mappings":";;AAGO,MAAM,kBAA6C,CAAC,EAAE,UAAU,GAAG,YAAY;AAClF;AAAA;AAAA,IAEI,oBAAC,cAAY,GAAG,OAAO,QAAQ,MAAM,WAAW,UAC3C,SACL,CAAA;AAAA;AAER;"}
1
+ {"version":3,"file":"formLabelLegend.js","sources":["../../src/mui/formLabelLegend.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport { default as InputLabel, InputLabelProps } from '@mui/material/InputLabel';\n\nexport const FormLabelLegend: FC<InputLabelProps> = ({ children, ...props }) => {\n return (\n // sx={(theme) => theme.typography.caption}\n <InputLabel {...props} shrink={true} component={'legend' as any}>\n {children}\n </InputLabel>\n );\n};\n"],"names":[],"mappings":";;AAGO,MAAM,kBAAuC,CAAC,EAAE,UAAU,GAAG,YAAY;AAC5E;AAAA;AAAA,IAEI,oBAAC,cAAY,GAAG,OAAO,QAAQ,MAAM,WAAW,UAC3C,SACL,CAAA;AAAA;AAER;"}
@@ -1,7 +1,7 @@
1
+ import { FC } from 'react';
1
2
  import { FormControlProps } from '@mui/material/FormControl';
2
- import * as React from 'react';
3
3
  export type GenericControlProps = FormControlProps & {
4
4
  children: any;
5
5
  };
6
- export declare const GenericControl: React.FC<GenericControlProps>;
6
+ export declare const GenericControl: FC<GenericControlProps>;
7
7
  //# sourceMappingURL=genericControl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"genericControl.d.ts","sourceRoot":"","sources":["../../src/mui/genericControl.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAA0B,MAAM,2BAA2B,CAAC;AAGrF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IAAE,QAAQ,EAAE,GAAG,CAAA;CAAE,CAAC;AAEvE,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAaxD,CAAC"}
1
+ {"version":3,"file":"genericControl.d.ts","sourceRoot":"","sources":["../../src/mui/genericControl.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAA0B,MAAM,2BAA2B,CAAC;AAGrF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IAAE,QAAQ,EAAE,GAAG,CAAA;CAAE,CAAC;AAEvE,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAalD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"genericControl.js","sources":["../../src/mui/genericControl.tsx"],"sourcesContent":["import * as React from 'react';\nimport { FormControlProps, default as FormControl } from '@mui/material/FormControl';\nimport { inputClasses } from '@mui/material/Input';\n\nexport type GenericControlProps = FormControlProps & { children: any };\n\nexport const GenericControl: React.FC<GenericControlProps> = ({ children, sx, ...props }) => (\n <FormControl\n variant=\"standard\"\n sx={{\n ...sx,\n [`& .${inputClasses.root}`]: {\n '&:before, &:after': { display: 'none' },\n },\n }}\n {...props}\n >\n {children}\n </FormControl>\n);\n"],"names":[],"mappings":";;;AAMO,MAAM,iBAAgD,CAAC,EAAE,UAAU,IAAI,GAAG,MAC7E,MAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACG,SAAQ;AAAA,IACR,IAAI;AAAA,MACA,GAAG;AAAA,MACH,CAAC,MAAM,aAAa,IAAI,EAAE,GAAG;AAAA,QACzB,qBAAqB,EAAE,SAAS,OAAO;AAAA,MAAA;AAAA,IAE/C;AAAA,IACC,GAAG;AAAA,IAEH;AAAA,EAAA;AACL;"}
1
+ {"version":3,"file":"genericControl.js","sources":["../../src/mui/genericControl.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport { FormControlProps, default as FormControl } from '@mui/material/FormControl';\nimport { inputClasses } from '@mui/material/Input';\n\nexport type GenericControlProps = FormControlProps & { children: any };\n\nexport const GenericControl: FC<GenericControlProps> = ({ children, sx, ...props }) => (\n <FormControl\n variant=\"standard\"\n sx={{\n ...sx,\n [`& .${inputClasses.root}`]: {\n '&:before, &:after': { display: 'none' },\n },\n }}\n {...props}\n >\n {children}\n </FormControl>\n);\n"],"names":[],"mappings":";;;AAMO,MAAM,iBAA0C,CAAC,EAAE,UAAU,IAAI,GAAG,MACvE,MAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACG,SAAQ;AAAA,IACR,IAAI;AAAA,MACA,GAAG;AAAA,MACH,CAAC,MAAM,aAAa,IAAI,EAAE,GAAG;AAAA,QACzB,qBAAqB,EAAE,SAAS,OAAO;AAAA,MAAA;AAAA,IAE/C;AAAA,IACC,GAAG;AAAA,IAEH;AAAA,EAAA;AACL;"}
@@ -1,6 +1,6 @@
1
- import { default as React } from 'react';
1
+ import { FC } from 'react';
2
2
  import { InputProps } from '@mui/material/Input';
3
- export declare const ReadOnly: React.FC<InputProps & {
3
+ export declare const ReadOnly: FC<InputProps & {
4
4
  children: any;
5
5
  }>;
6
6
  //# sourceMappingURL=readOnly.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"readOnly.d.ts","sourceRoot":"","sources":["../../src/mui/readOnly.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAoB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEnE,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,GAAG;IAAE,QAAQ,EAAE,GAAG,CAAA;CAAE,CAE7D,CAAC"}
1
+ {"version":3,"file":"readOnly.d.ts","sourceRoot":"","sources":["../../src/mui/readOnly.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAoB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEnE,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,UAAU,GAAG;IAAE,QAAQ,EAAE,GAAG,CAAA;CAAE,CAEvD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"readOnly.js","sources":["../../src/mui/readOnly.tsx"],"sourcesContent":["import React from 'react';\nimport { default as Input, InputProps } from '@mui/material/Input';\n\nexport const ReadOnly: React.FC<InputProps & { children: any }> = ({ children, inputProps, ...props }) => (\n <Input {...props} inputComponent={'div' as any} inputProps={{ ...inputProps, children }}></Input>\n);\n"],"names":[],"mappings":";;AAGO,MAAM,WAAqD,CAAC,EAAE,UAAU,YAAY,GAAG,YAC1F,oBAAC,SAAO,GAAG,OAAO,gBAAgB,OAAc,YAAY,EAAE,GAAG,YAAY,WAAY,CAAA;"}
1
+ {"version":3,"file":"readOnly.js","sources":["../../src/mui/readOnly.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport { default as Input, InputProps } from '@mui/material/Input';\n\nexport const ReadOnly: FC<InputProps & { children: any }> = ({ children, inputProps, ...props }) => (\n <Input {...props} inputComponent={'div' as any} inputProps={{ ...inputProps, children }}></Input>\n);\n"],"names":[],"mappings":";;AAGO,MAAM,WAA+C,CAAC,EAAE,UAAU,YAAY,GAAG,YACpF,oBAAC,SAAO,GAAG,OAAO,gBAAgB,OAAc,YAAY,EAAE,GAAG,YAAY,WAAY,CAAA;"}
@@ -1 +1 @@
1
- {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../src/next/measure.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,SACwF,CAAC;AAE5G,eAAO,MAAM,QAAQ;;;;;;;;;;;;CAAqC,CAAC"}
1
+ {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../src/next/measure.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,EAAE,OACsF,CAAC;AAE5G,eAAO,MAAM,QAAQ,EAAE;IACnB,OAAO,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,EACrB,GAAG,IAAI,EAAE,GAAG,EAAE,KACb;QACD,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QACjD,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QACjD,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;KAClC,CAAC;IACF,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACvB,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACvB,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACtB,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;CACW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"measure.js","sources":["../../src/next/measure.ts"],"sourcesContent":["import { createMeasurer } from '../core/measure';\nimport { PHASE_PRODUCTION_BUILD, PHASE_PRODUCTION_SERVER } from 'next/constants';\n\nexport const isProd =\n process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD || process.env.NEXT_PHASE === PHASE_PRODUCTION_SERVER;\n\nexport const measurer = createMeasurer({ colors: isProd });\n"],"names":[],"mappings":";;AAGO,MAAM,SACT,QAAQ,IAAI,eAAe,0BAA0B,QAAQ,IAAI,eAAe;AAE7E,MAAM,WAAW,eAAe,EAAE,QAAQ,OAAQ,CAAA;"}
1
+ {"version":3,"file":"measure.js","sources":["../../src/next/measure.ts"],"sourcesContent":["import { createMeasurer } from '../core/measure';\nimport { PHASE_PRODUCTION_BUILD, PHASE_PRODUCTION_SERVER } from 'next/constants';\n\nexport const isProd: boolean =\n process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD || process.env.NEXT_PHASE === PHASE_PRODUCTION_SERVER;\n\nexport const measurer: {\n measure: (\n what: string,\n step: string,\n supplemental?: string,\n ...args: any[]\n ) => {\n done: (result?: string, ...args2: any[]) => void;\n fail: (result?: string, ...args2: any[]) => void;\n log: (...args2: any[]) => void;\n };\n important: (str: any) => any;\n subject: (str: any) => any;\n arg: (str: any) => any;\n sup: (str: any) => any;\n ok: (str: any) => any;\n err: (str: any) => any;\n} = createMeasurer({ colors: isProd });\n"],"names":[],"mappings":";;AAGO,MAAM,SACT,QAAQ,IAAI,eAAe,0BAA0B,QAAQ,IAAI,eAAe;AAE7E,MAAM,WAiBT,eAAe,EAAE,QAAQ,OAAQ,CAAA;"}
@@ -1,5 +1,29 @@
1
- export declare function NoSSR({ children, onSSR }: {
1
+ import { FC, JSX } from 'react';
2
+ /**
3
+ * Prefer using Next.js `dynamic()` import with `ssr: false` because this will also remove import from server bundle.
4
+ *
5
+ * ```tsx
6
+ * 'use client';
7
+ *
8
+ * import React from 'react';
9
+ * import dynamic from 'next/dynamic';
10
+ *
11
+ * const PageClient = dynamic(() => import('./pageClient'), { ssr: false });
12
+ *
13
+ * export default function Page() {
14
+ * return (
15
+ * <PageClient />
16
+ * );
17
+ * }
18
+ * ```
19
+ *
20
+ * In other cases this component can be used to just prevent server rendering.
21
+ *
22
+ * @see https://github.com/kadirahq/react-no-ssr/blob/master/src/index.js
23
+ * @see https://nextjs.org/docs/messages/react-hydration-error#solution-1-using-useeffect-to-run-on-the-client-only
24
+ */
25
+ export declare const NoSSR: FC<{
2
26
  children: any;
3
- onSSR?: import("react/jsx-runtime").JSX.Element | undefined;
4
- }): any;
27
+ onSSR?: JSX.Element;
28
+ }>;
5
29
  //# sourceMappingURL=noSSR.d.ts.map