@rockhall/electron-offline-content 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/CHANGELOG.md +384 -0
  2. package/LICENSE +21 -0
  3. package/README.md +794 -0
  4. package/dist/internal/asset-file-name.cjs +13 -0
  5. package/dist/internal/asset-file-name.cjs.map +1 -0
  6. package/dist/internal/asset-file-name.d.cts +6 -0
  7. package/dist/internal/asset-file-name.d.cts.map +1 -0
  8. package/dist/internal/asset-file-name.d.ts +6 -0
  9. package/dist/internal/asset-file-name.d.ts.map +1 -0
  10. package/dist/internal/asset-file-name.js +12 -0
  11. package/dist/internal/asset-file-name.js.map +1 -0
  12. package/dist/internal/asset-key.cjs +30 -0
  13. package/dist/internal/asset-key.cjs.map +1 -0
  14. package/dist/internal/asset-key.d.cts +19 -0
  15. package/dist/internal/asset-key.d.cts.map +1 -0
  16. package/dist/internal/asset-key.d.ts +19 -0
  17. package/dist/internal/asset-key.d.ts.map +1 -0
  18. package/dist/internal/asset-key.js +27 -0
  19. package/dist/internal/asset-key.js.map +1 -0
  20. package/dist/internal/log-format.cjs +98 -0
  21. package/dist/internal/log-format.cjs.map +1 -0
  22. package/dist/internal/log-format.d.cts +10 -0
  23. package/dist/internal/log-format.d.cts.map +1 -0
  24. package/dist/internal/log-format.d.ts +10 -0
  25. package/dist/internal/log-format.d.ts.map +1 -0
  26. package/dist/internal/log-format.js +97 -0
  27. package/dist/internal/log-format.js.map +1 -0
  28. package/dist/internal/media-kind.cjs +46 -0
  29. package/dist/internal/media-kind.cjs.map +1 -0
  30. package/dist/internal/media-kind.d.cts +20 -0
  31. package/dist/internal/media-kind.d.cts.map +1 -0
  32. package/dist/internal/media-kind.d.ts +20 -0
  33. package/dist/internal/media-kind.d.ts.map +1 -0
  34. package/dist/internal/media-kind.js +45 -0
  35. package/dist/internal/media-kind.js.map +1 -0
  36. package/dist/internal/url-warn.cjs +14 -0
  37. package/dist/internal/url-warn.cjs.map +1 -0
  38. package/dist/internal/url-warn.d.cts +10 -0
  39. package/dist/internal/url-warn.d.cts.map +1 -0
  40. package/dist/internal/url-warn.d.ts +10 -0
  41. package/dist/internal/url-warn.d.ts.map +1 -0
  42. package/dist/internal/url-warn.js +13 -0
  43. package/dist/internal/url-warn.js.map +1 -0
  44. package/dist/internal/validation.cjs +222 -0
  45. package/dist/internal/validation.cjs.map +1 -0
  46. package/dist/internal/validation.d.cts +78 -0
  47. package/dist/internal/validation.d.cts.map +1 -0
  48. package/dist/internal/validation.d.ts +78 -0
  49. package/dist/internal/validation.d.ts.map +1 -0
  50. package/dist/internal/validation.js +196 -0
  51. package/dist/internal/validation.js.map +1 -0
  52. package/dist/main/asset-download.cjs +265 -0
  53. package/dist/main/asset-download.cjs.map +1 -0
  54. package/dist/main/asset-download.d.cts +12 -0
  55. package/dist/main/asset-download.d.cts.map +1 -0
  56. package/dist/main/asset-download.d.ts +12 -0
  57. package/dist/main/asset-download.d.ts.map +1 -0
  58. package/dist/main/asset-download.js +263 -0
  59. package/dist/main/asset-download.js.map +1 -0
  60. package/dist/main/database.cjs +473 -0
  61. package/dist/main/database.cjs.map +1 -0
  62. package/dist/main/database.d.cts +81 -0
  63. package/dist/main/database.d.cts.map +1 -0
  64. package/dist/main/database.d.ts +81 -0
  65. package/dist/main/database.d.ts.map +1 -0
  66. package/dist/main/database.js +472 -0
  67. package/dist/main/database.js.map +1 -0
  68. package/dist/main/index.cjs +22 -0
  69. package/dist/main/index.d.cts +7 -0
  70. package/dist/main/index.d.ts +7 -0
  71. package/dist/main/index.js +7 -0
  72. package/dist/main/media-cache.cjs +862 -0
  73. package/dist/main/media-cache.cjs.map +1 -0
  74. package/dist/main/media-cache.d.cts +134 -0
  75. package/dist/main/media-cache.d.cts.map +1 -0
  76. package/dist/main/media-cache.d.ts +134 -0
  77. package/dist/main/media-cache.d.ts.map +1 -0
  78. package/dist/main/media-cache.js +854 -0
  79. package/dist/main/media-cache.js.map +1 -0
  80. package/dist/main/storage-root-lock.cjs +124 -0
  81. package/dist/main/storage-root-lock.cjs.map +1 -0
  82. package/dist/main/storage-root-lock.d.cts +11 -0
  83. package/dist/main/storage-root-lock.d.cts.map +1 -0
  84. package/dist/main/storage-root-lock.d.ts +11 -0
  85. package/dist/main/storage-root-lock.d.ts.map +1 -0
  86. package/dist/main/storage-root-lock.js +120 -0
  87. package/dist/main/storage-root-lock.js.map +1 -0
  88. package/dist/main/store.cjs +197 -0
  89. package/dist/main/store.cjs.map +1 -0
  90. package/dist/main/store.d.cts +83 -0
  91. package/dist/main/store.d.cts.map +1 -0
  92. package/dist/main/store.d.ts +83 -0
  93. package/dist/main/store.d.ts.map +1 -0
  94. package/dist/main/store.js +195 -0
  95. package/dist/main/store.js.map +1 -0
  96. package/dist/preload/index.cjs +36 -0
  97. package/dist/preload/index.cjs.map +1 -0
  98. package/dist/preload/index.d.cts +14 -0
  99. package/dist/preload/index.d.cts.map +1 -0
  100. package/dist/preload/index.d.ts +14 -0
  101. package/dist/preload/index.d.ts.map +1 -0
  102. package/dist/preload/index.js +34 -0
  103. package/dist/preload/index.js.map +1 -0
  104. package/dist/react/index.cjs +199 -0
  105. package/dist/react/index.cjs.map +1 -0
  106. package/dist/react/index.d.cts +50 -0
  107. package/dist/react/index.d.cts.map +1 -0
  108. package/dist/react/index.d.ts +50 -0
  109. package/dist/react/index.d.ts.map +1 -0
  110. package/dist/react/index.js +191 -0
  111. package/dist/react/index.js.map +1 -0
  112. package/dist/renderer/helpers.cjs +36 -0
  113. package/dist/renderer/helpers.cjs.map +1 -0
  114. package/dist/renderer/helpers.d.cts +11 -0
  115. package/dist/renderer/helpers.d.cts.map +1 -0
  116. package/dist/renderer/helpers.d.ts +11 -0
  117. package/dist/renderer/helpers.d.ts.map +1 -0
  118. package/dist/renderer/helpers.js +35 -0
  119. package/dist/renderer/helpers.js.map +1 -0
  120. package/dist/renderer/index.cjs +20 -0
  121. package/dist/renderer/index.cjs.map +1 -0
  122. package/dist/renderer/index.d.cts +14 -0
  123. package/dist/renderer/index.d.cts.map +1 -0
  124. package/dist/renderer/index.d.ts +14 -0
  125. package/dist/renderer/index.d.ts.map +1 -0
  126. package/dist/renderer/index.js +14 -0
  127. package/dist/renderer/index.js.map +1 -0
  128. package/dist/renderer/runtime.cjs +278 -0
  129. package/dist/renderer/runtime.cjs.map +1 -0
  130. package/dist/renderer/runtime.d.cts +35 -0
  131. package/dist/renderer/runtime.d.cts.map +1 -0
  132. package/dist/renderer/runtime.d.ts +35 -0
  133. package/dist/renderer/runtime.d.ts.map +1 -0
  134. package/dist/renderer/runtime.js +273 -0
  135. package/dist/renderer/runtime.js.map +1 -0
  136. package/dist/renderer/window-globals.d.cts +9 -0
  137. package/dist/renderer/window-globals.d.cts.map +1 -0
  138. package/dist/renderer/window-globals.d.ts +9 -0
  139. package/dist/renderer/window-globals.d.ts.map +1 -0
  140. package/dist/shared/errors.cjs +102 -0
  141. package/dist/shared/errors.cjs.map +1 -0
  142. package/dist/shared/errors.d.cts +45 -0
  143. package/dist/shared/errors.d.cts.map +1 -0
  144. package/dist/shared/errors.d.ts +45 -0
  145. package/dist/shared/errors.d.ts.map +1 -0
  146. package/dist/shared/errors.js +93 -0
  147. package/dist/shared/errors.js.map +1 -0
  148. package/dist/shared/ipc.cjs +14 -0
  149. package/dist/shared/ipc.cjs.map +1 -0
  150. package/dist/shared/ipc.d.cts +12 -0
  151. package/dist/shared/ipc.d.cts.map +1 -0
  152. package/dist/shared/ipc.d.ts +12 -0
  153. package/dist/shared/ipc.d.ts.map +1 -0
  154. package/dist/shared/ipc.js +13 -0
  155. package/dist/shared/ipc.js.map +1 -0
  156. package/dist/shared/normalize.cjs +19 -0
  157. package/dist/shared/normalize.cjs.map +1 -0
  158. package/dist/shared/normalize.d.cts +11 -0
  159. package/dist/shared/normalize.d.cts.map +1 -0
  160. package/dist/shared/normalize.d.ts +11 -0
  161. package/dist/shared/normalize.d.ts.map +1 -0
  162. package/dist/shared/normalize.js +18 -0
  163. package/dist/shared/normalize.js.map +1 -0
  164. package/dist/shared/pagination.cjs +32 -0
  165. package/dist/shared/pagination.cjs.map +1 -0
  166. package/dist/shared/pagination.d.cts +14 -0
  167. package/dist/shared/pagination.d.cts.map +1 -0
  168. package/dist/shared/pagination.d.ts +14 -0
  169. package/dist/shared/pagination.d.ts.map +1 -0
  170. package/dist/shared/pagination.js +28 -0
  171. package/dist/shared/pagination.js.map +1 -0
  172. package/dist/shared/stem.cjs +16 -0
  173. package/dist/shared/stem.cjs.map +1 -0
  174. package/dist/shared/stem.d.cts +6 -0
  175. package/dist/shared/stem.d.cts.map +1 -0
  176. package/dist/shared/stem.d.ts +6 -0
  177. package/dist/shared/stem.d.ts.map +1 -0
  178. package/dist/shared/stem.js +14 -0
  179. package/dist/shared/stem.js.map +1 -0
  180. package/dist/shared/types.cjs +15 -0
  181. package/dist/shared/types.cjs.map +1 -0
  182. package/dist/shared/types.d.cts +234 -0
  183. package/dist/shared/types.d.cts.map +1 -0
  184. package/dist/shared/types.d.ts +234 -0
  185. package/dist/shared/types.d.ts.map +1 -0
  186. package/dist/shared/types.js +14 -0
  187. package/dist/shared/types.js.map +1 -0
  188. package/package.json +120 -0
  189. package/skills/authenticated-downloads/SKILL.md +203 -0
  190. package/skills/cache-configuration/SKILL.md +357 -0
  191. package/skills/cache-configuration/references/options.md +356 -0
  192. package/skills/getting-started/SKILL.md +407 -0
  193. package/skills/production-checklist/SKILL.md +397 -0
  194. package/skills/react-rendering/SKILL.md +424 -0
  195. package/skills/react-rendering/references/hooks.md +443 -0
  196. package/skills/store-authoring/SKILL.md +369 -0
@@ -0,0 +1,36 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_shared_ipc = require("../shared/ipc.cjs");
3
+ let electron = require("electron");
4
+ //#region src/preload/index.ts
5
+ /**
6
+ * Builds a {@link import("../shared/types.js").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.
7
+ */
8
+ function createMediaCacheBridge() {
9
+ return {
10
+ getStatus: () => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.getStatus),
11
+ syncNow: () => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.syncNow),
12
+ getAsset: (key) => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.getAsset, key),
13
+ listByIndex: (indexName, value, pagination) => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.listByIndex, indexName, value, pagination),
14
+ findByFileStem: (stem, pagination) => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.findByFileStem, stem, pagination),
15
+ subscribeStatus: (listener) => {
16
+ const wrapped = (_event, status) => listener(status);
17
+ electron.ipcRenderer.on(require_shared_ipc.MEDIA_CACHE_IPC.statusChanged, wrapped);
18
+ return () => {
19
+ electron.ipcRenderer.removeListener(require_shared_ipc.MEDIA_CACHE_IPC.statusChanged, wrapped);
20
+ };
21
+ }
22
+ };
23
+ }
24
+ /**
25
+ * Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.
26
+ */
27
+ function exposeMediaCacheBridge(options) {
28
+ const bridge = createMediaCacheBridge();
29
+ electron.contextBridge.exposeInMainWorld(options?.key ?? "mediaCache", bridge);
30
+ return bridge;
31
+ }
32
+ //#endregion
33
+ exports.createMediaCacheBridge = createMediaCacheBridge;
34
+ exports.exposeMediaCacheBridge = exposeMediaCacheBridge;
35
+
36
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["ipcRenderer","MEDIA_CACHE_IPC"],"sources":["../../src/preload/index.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from \"electron\";\nimport { MEDIA_CACHE_IPC } from \"../shared/ipc.js\";\nimport type { MediaCacheBridge, PaginationInput, PreloadExposeOptions } from \"../shared/types.js\";\n\n/**\n * Builds a {@link import(\"../shared/types.js\").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.\n */\nexport function createMediaCacheBridge(): MediaCacheBridge {\n return {\n getStatus: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.getStatus),\n syncNow: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.syncNow),\n getAsset: (key) => ipcRenderer.invoke(MEDIA_CACHE_IPC.getAsset, key),\n listByIndex: (indexName, value, pagination?: PaginationInput) =>\n ipcRenderer.invoke(MEDIA_CACHE_IPC.listByIndex, indexName, value, pagination),\n findByFileStem: (stem, pagination?: PaginationInput) =>\n ipcRenderer.invoke(MEDIA_CACHE_IPC.findByFileStem, stem, pagination),\n subscribeStatus: (listener) => {\n const wrapped = (\n _event: Electron.IpcRendererEvent,\n status: Awaited<ReturnType<MediaCacheBridge[\"getStatus\"]>>,\n ) => listener(status);\n ipcRenderer.on(MEDIA_CACHE_IPC.statusChanged, wrapped);\n return () => {\n ipcRenderer.removeListener(MEDIA_CACHE_IPC.statusChanged, wrapped);\n };\n },\n };\n}\n\n/**\n * Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.\n */\nexport function exposeMediaCacheBridge(options?: PreloadExposeOptions): MediaCacheBridge {\n const bridge = createMediaCacheBridge();\n contextBridge.exposeInMainWorld(options?.key ?? \"mediaCache\", bridge);\n return bridge;\n}\n\nexport type { MediaCacheBridge } from \"../shared/types.js\";\n"],"mappings":";;;;;;;AAOA,SAAgB,yBAA2C;CACzD,OAAO;EACL,iBAAiBA,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,UAAU;EAC9D,eAAeD,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,QAAQ;EAC1D,WAAW,QAAQD,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,UAAU,IAAI;EACpE,cAAc,WAAW,OAAO,eAC9BD,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,aAAa,WAAW,OAAO,WAAW;EAC/E,iBAAiB,MAAM,eACrBD,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,gBAAgB,MAAM,WAAW;EACtE,kBAAkB,aAAa;GAC7B,MAAM,WACJ,QACA,WACG,SAAS,OAAO;GACrB,SAAA,YAAY,GAAGA,mBAAAA,gBAAgB,eAAe,QAAQ;GACtD,aAAa;IACX,SAAA,YAAY,eAAeA,mBAAAA,gBAAgB,eAAe,QAAQ;;;EAGvE;;;;;AAMH,SAAgB,uBAAuB,SAAkD;CACvF,MAAM,SAAS,wBAAwB;CACvC,SAAA,cAAc,kBAAkB,SAAS,OAAO,cAAc,OAAO;CACrE,OAAO"}
@@ -0,0 +1,14 @@
1
+ import { MediaCacheBridge, PreloadExposeOptions } from "../shared/types.cjs";
2
+
3
+ //#region src/preload/index.d.ts
4
+ /**
5
+ * Builds a {@link import("../shared/types.js").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.
6
+ */
7
+ declare function createMediaCacheBridge(): MediaCacheBridge;
8
+ /**
9
+ * Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.
10
+ */
11
+ declare function exposeMediaCacheBridge(options?: PreloadExposeOptions): MediaCacheBridge;
12
+ //#endregion
13
+ export { type MediaCacheBridge, createMediaCacheBridge, exposeMediaCacheBridge };
14
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/preload/index.ts"],"mappings":";;;;;AAOA;iBAAgB,sBAAA,CAAA,GAA0B,gBAAA;;;;iBAyB1B,sBAAA,CAAuB,OAAA,GAAU,oBAAA,GAAuB,gBAAA"}
@@ -0,0 +1,14 @@
1
+ import { MediaCacheBridge, PreloadExposeOptions } from "../shared/types.js";
2
+
3
+ //#region src/preload/index.d.ts
4
+ /**
5
+ * Builds a {@link import("../shared/types.js").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.
6
+ */
7
+ declare function createMediaCacheBridge(): MediaCacheBridge;
8
+ /**
9
+ * Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.
10
+ */
11
+ declare function exposeMediaCacheBridge(options?: PreloadExposeOptions): MediaCacheBridge;
12
+ //#endregion
13
+ export { type MediaCacheBridge, createMediaCacheBridge, exposeMediaCacheBridge };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/preload/index.ts"],"mappings":";;;;;AAOA;iBAAgB,sBAAA,CAAA,GAA0B,gBAAA;;;;iBAyB1B,sBAAA,CAAuB,OAAA,GAAU,oBAAA,GAAuB,gBAAA"}
@@ -0,0 +1,34 @@
1
+ import { MEDIA_CACHE_IPC } from "../shared/ipc.js";
2
+ import { contextBridge, ipcRenderer } from "electron";
3
+ //#region src/preload/index.ts
4
+ /**
5
+ * Builds a {@link import("../shared/types.js").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.
6
+ */
7
+ function createMediaCacheBridge() {
8
+ return {
9
+ getStatus: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.getStatus),
10
+ syncNow: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.syncNow),
11
+ getAsset: (key) => ipcRenderer.invoke(MEDIA_CACHE_IPC.getAsset, key),
12
+ listByIndex: (indexName, value, pagination) => ipcRenderer.invoke(MEDIA_CACHE_IPC.listByIndex, indexName, value, pagination),
13
+ findByFileStem: (stem, pagination) => ipcRenderer.invoke(MEDIA_CACHE_IPC.findByFileStem, stem, pagination),
14
+ subscribeStatus: (listener) => {
15
+ const wrapped = (_event, status) => listener(status);
16
+ ipcRenderer.on(MEDIA_CACHE_IPC.statusChanged, wrapped);
17
+ return () => {
18
+ ipcRenderer.removeListener(MEDIA_CACHE_IPC.statusChanged, wrapped);
19
+ };
20
+ }
21
+ };
22
+ }
23
+ /**
24
+ * Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.
25
+ */
26
+ function exposeMediaCacheBridge(options) {
27
+ const bridge = createMediaCacheBridge();
28
+ contextBridge.exposeInMainWorld(options?.key ?? "mediaCache", bridge);
29
+ return bridge;
30
+ }
31
+ //#endregion
32
+ export { createMediaCacheBridge, exposeMediaCacheBridge };
33
+
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/preload/index.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from \"electron\";\nimport { MEDIA_CACHE_IPC } from \"../shared/ipc.js\";\nimport type { MediaCacheBridge, PaginationInput, PreloadExposeOptions } from \"../shared/types.js\";\n\n/**\n * Builds a {@link import(\"../shared/types.js\").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.\n */\nexport function createMediaCacheBridge(): MediaCacheBridge {\n return {\n getStatus: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.getStatus),\n syncNow: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.syncNow),\n getAsset: (key) => ipcRenderer.invoke(MEDIA_CACHE_IPC.getAsset, key),\n listByIndex: (indexName, value, pagination?: PaginationInput) =>\n ipcRenderer.invoke(MEDIA_CACHE_IPC.listByIndex, indexName, value, pagination),\n findByFileStem: (stem, pagination?: PaginationInput) =>\n ipcRenderer.invoke(MEDIA_CACHE_IPC.findByFileStem, stem, pagination),\n subscribeStatus: (listener) => {\n const wrapped = (\n _event: Electron.IpcRendererEvent,\n status: Awaited<ReturnType<MediaCacheBridge[\"getStatus\"]>>,\n ) => listener(status);\n ipcRenderer.on(MEDIA_CACHE_IPC.statusChanged, wrapped);\n return () => {\n ipcRenderer.removeListener(MEDIA_CACHE_IPC.statusChanged, wrapped);\n };\n },\n };\n}\n\n/**\n * Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.\n */\nexport function exposeMediaCacheBridge(options?: PreloadExposeOptions): MediaCacheBridge {\n const bridge = createMediaCacheBridge();\n contextBridge.exposeInMainWorld(options?.key ?? \"mediaCache\", bridge);\n return bridge;\n}\n\nexport type { MediaCacheBridge } from \"../shared/types.js\";\n"],"mappings":";;;;;;AAOA,SAAgB,yBAA2C;CACzD,OAAO;EACL,iBAAiB,YAAY,OAAO,gBAAgB,UAAU;EAC9D,eAAe,YAAY,OAAO,gBAAgB,QAAQ;EAC1D,WAAW,QAAQ,YAAY,OAAO,gBAAgB,UAAU,IAAI;EACpE,cAAc,WAAW,OAAO,eAC9B,YAAY,OAAO,gBAAgB,aAAa,WAAW,OAAO,WAAW;EAC/E,iBAAiB,MAAM,eACrB,YAAY,OAAO,gBAAgB,gBAAgB,MAAM,WAAW;EACtE,kBAAkB,aAAa;GAC7B,MAAM,WACJ,QACA,WACG,SAAS,OAAO;GACrB,YAAY,GAAG,gBAAgB,eAAe,QAAQ;GACtD,aAAa;IACX,YAAY,eAAe,gBAAgB,eAAe,QAAQ;;;EAGvE;;;;;AAMH,SAAgB,uBAAuB,SAAkD;CACvF,MAAM,SAAS,wBAAwB;CACvC,cAAc,kBAAkB,SAAS,OAAO,cAAc,OAAO;CACrE,OAAO"}
@@ -0,0 +1,199 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_runtime = require("../renderer/runtime.cjs");
3
+ const require_helpers = require("../renderer/helpers.cjs");
4
+ let react = require("react");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ //#region src/react/index.tsx
7
+ const MediaCacheContext = (0, react.createContext)(null);
8
+ let nextQueryErrorId = 0;
9
+ function MediaCacheProvider({ bridge, children }) {
10
+ const valueBridge = (0, react.useMemo)(() => bridge ?? window.mediaCache ?? null, [bridge]);
11
+ const statusController = (0, react.useMemo)(() => require_runtime.createMediaCacheStatusController(valueBridge, valueBridge !== null), [valueBridge]);
12
+ (0, react.useEffect)(() => () => statusController.dispose(), [statusController]);
13
+ const [queryErrorsById, setQueryErrorsById] = (0, react.useState)(() => /* @__PURE__ */ new Map());
14
+ const reportQueryError = (0, react.useCallback)((id, error) => {
15
+ setQueryErrorsById((previous) => {
16
+ if (error === null) {
17
+ if (!previous.has(id)) return previous;
18
+ const next = new Map(previous);
19
+ next.delete(id);
20
+ return next;
21
+ }
22
+ if (previous.get(id) === error) return previous;
23
+ const next = new Map(previous);
24
+ next.set(id, error);
25
+ return next;
26
+ });
27
+ }, []);
28
+ const queryErrors = (0, react.useMemo)(() => Array.from(queryErrorsById.values()), [queryErrorsById]);
29
+ const value = (0, react.useMemo)(() => ({
30
+ bridge: valueBridge,
31
+ statusController,
32
+ queryErrors,
33
+ reportQueryError
34
+ }), [
35
+ valueBridge,
36
+ statusController,
37
+ queryErrors,
38
+ reportQueryError
39
+ ]);
40
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MediaCacheContext.Provider, {
41
+ value,
42
+ children
43
+ });
44
+ }
45
+ function useMediaBridge() {
46
+ const { bridge, status, queryErrors } = useMediaCacheRuntime();
47
+ const errors = (0, react.useMemo)(() => require_helpers.aggregateMediaCacheErrors(status, queryErrors), [status, queryErrors]);
48
+ return (0, react.useMemo)(() => ({
49
+ ...bridge,
50
+ status,
51
+ phase: require_runtime.deriveMediaCachePhase(status),
52
+ errors
53
+ }), [
54
+ bridge,
55
+ status,
56
+ errors
57
+ ]);
58
+ }
59
+ function useMediaCacheStatus() {
60
+ const status = useMediaCacheRuntime().status;
61
+ return (0, react.useMemo)(() => ({
62
+ ...status,
63
+ phase: require_runtime.deriveMediaCachePhase(status)
64
+ }), [status]);
65
+ }
66
+ /**
67
+ * Fetches a single asset by key.
68
+ *
69
+ * @param key - The asset key to look up. A string or array of string segments.
70
+ * @param options - Optional sync-triggered refetch behavior.
71
+ */
72
+ function useMediaAsset(key, options) {
73
+ const { bridge, statusController } = useMediaCacheRuntime();
74
+ return useAsyncResource(() => bridge.getAsset(key), [bridge, typeof key === "string" ? key : key.join("\0")], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
75
+ }
76
+ /**
77
+ * Lists assets matching a secondary index value.
78
+ *
79
+ * @param indexName - The index to query (e.g. `"mimeType"`, a user-defined index name).
80
+ * @param value - The index value to match.
81
+ * @param options - Optional pagination and sync-triggered refetch behavior.
82
+ */
83
+ function useMediaByIndex(indexName, value, options) {
84
+ const { bridge, statusController } = useMediaCacheRuntime();
85
+ const cursor = options?.cursor;
86
+ const limit = options?.limit;
87
+ return useAsyncResource(() => bridge.listByIndex(indexName, value, {
88
+ cursor,
89
+ limit
90
+ }), [
91
+ bridge,
92
+ indexName,
93
+ value,
94
+ cursor,
95
+ limit
96
+ ], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
97
+ }
98
+ /**
99
+ * Searches assets by normalized file stem (file name without extension).
100
+ *
101
+ * @param stem - Normalized file stem to search for.
102
+ * @param options - Optional pagination and sync-triggered refetch behavior.
103
+ */
104
+ function useFileStemMatch(stem, options) {
105
+ const { bridge, statusController } = useMediaCacheRuntime();
106
+ const cursor = options?.cursor;
107
+ const limit = options?.limit;
108
+ return useAsyncResource(() => bridge.findByFileStem(stem, {
109
+ cursor,
110
+ limit
111
+ }), [
112
+ bridge,
113
+ stem,
114
+ cursor,
115
+ limit
116
+ ], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
117
+ }
118
+ function useMediaCacheReady() {
119
+ const status = useMediaCacheStatus();
120
+ return {
121
+ data: require_helpers.mediaCacheReadyFromStatus(status.data ?? void 0),
122
+ loading: status.loading,
123
+ error: status.error,
124
+ refresh: status.refresh
125
+ };
126
+ }
127
+ function useMediaCacheErrors() {
128
+ const { status, queryErrors } = useMediaCacheRuntime();
129
+ return require_helpers.aggregateMediaCacheErrors(status, queryErrors);
130
+ }
131
+ function useAsyncResource(loader, refreshDeps, statusController, options) {
132
+ const latestLoader = (0, react.useRef)(loader);
133
+ latestLoader.current = loader;
134
+ const watcherRef = (0, react.useRef)(null);
135
+ const [, forceRender] = (0, react.useReducer)((count) => count + 1, 0);
136
+ (0, react.useLayoutEffect)(() => {
137
+ const instance = require_runtime.createMediaQueryWatcherInstance({
138
+ status: statusController,
139
+ getLoader: () => latestLoader.current,
140
+ refetchOnSyncComplete: options?.refetchOnSyncComplete ?? true,
141
+ listener: () => forceRender()
142
+ });
143
+ watcherRef.current = instance;
144
+ instance.syncDeps(refreshDeps);
145
+ forceRender();
146
+ return () => {
147
+ instance.dispose();
148
+ watcherRef.current = null;
149
+ };
150
+ }, [statusController, options?.refetchOnSyncComplete]);
151
+ (0, react.useEffect)(() => {
152
+ watcherRef.current?.syncDeps(refreshDeps);
153
+ });
154
+ const snapshot = watcherRef.current?.getSnapshot() ?? {
155
+ data: null,
156
+ loading: true,
157
+ error: null,
158
+ refresh: async () => {
159
+ await watcherRef.current?.refresh();
160
+ }
161
+ };
162
+ useQueryErrorRegistration(snapshot.error);
163
+ return snapshot;
164
+ }
165
+ function useMediaCacheRuntime() {
166
+ const runtime = (0, react.useContext)(MediaCacheContext);
167
+ const bridge = runtime?.bridge;
168
+ const statusController = runtime?.statusController;
169
+ if (!bridge || !statusController) throw new Error(require_runtime.MISSING_BRIDGE_ERROR);
170
+ return {
171
+ bridge,
172
+ status: (0, react.useSyncExternalStore)(statusController.subscribe, statusController.getSnapshot, statusController.getSnapshot),
173
+ statusController,
174
+ queryErrors: runtime.queryErrors
175
+ };
176
+ }
177
+ function useQueryErrorRegistration(error) {
178
+ const runtime = (0, react.useContext)(MediaCacheContext);
179
+ const queryErrorId = (0, react.useRef)(null);
180
+ if (queryErrorId.current === null) queryErrorId.current = `query-error-${nextQueryErrorId++}`;
181
+ (0, react.useEffect)(() => {
182
+ if (!runtime) return;
183
+ runtime.reportQueryError(queryErrorId.current, error);
184
+ return () => {
185
+ runtime.reportQueryError(queryErrorId.current, null);
186
+ };
187
+ }, [runtime, error]);
188
+ }
189
+ //#endregion
190
+ exports.MediaCacheProvider = MediaCacheProvider;
191
+ exports.useFileStemMatch = useFileStemMatch;
192
+ exports.useMediaAsset = useMediaAsset;
193
+ exports.useMediaBridge = useMediaBridge;
194
+ exports.useMediaByIndex = useMediaByIndex;
195
+ exports.useMediaCacheErrors = useMediaCacheErrors;
196
+ exports.useMediaCacheReady = useMediaCacheReady;
197
+ exports.useMediaCacheStatus = useMediaCacheStatus;
198
+
199
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["createMediaCacheStatusController","aggregateMediaCacheErrors","deriveMediaCachePhase","mediaCacheReadyFromStatus","createMediaQueryWatcherInstance","MISSING_BRIDGE_ERROR"],"sources":["../../src/react/index.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n useSyncExternalStore,\n type PropsWithChildren,\n} from \"react\";\nimport type {\n AssetKeyInput,\n FileStemMatch,\n MediaCacheBridge,\n MediaCacheErrors,\n MediaCachePhase,\n MediaCacheReadyState,\n MediaCacheStatus,\n PaginationInput,\n PaginationResult,\n MediaQuerySyncOptions,\n ResolvedMediaAsset,\n} from \"../shared/types.js\";\nimport \"../renderer/window-globals.js\";\nimport {\n type MediaAsyncState,\n type MediaCacheStatusController,\n MISSING_BRIDGE_ERROR,\n createMediaCacheStatusController,\n createMediaQueryWatcherInstance,\n deriveMediaCachePhase,\n} from \"../renderer/runtime.js\";\nimport { aggregateMediaCacheErrors, mediaCacheReadyFromStatus } from \"../renderer/helpers.js\";\n\ntype AsyncState<T> = MediaAsyncState<T>;\n\ninterface MediaCacheContextValue {\n bridge: MediaCacheBridge | null;\n statusController: MediaCacheStatusController | null;\n queryErrors: Error[];\n reportQueryError: (id: string, error: Error | null) => void;\n}\n\nexport interface UseMediaBridgeResult extends MediaCacheBridge {\n status: AsyncState<MediaCacheStatus>;\n phase: MediaCachePhase;\n errors: MediaCacheErrors;\n}\n\nexport interface UseMediaCacheStatusResult extends AsyncState<MediaCacheStatus> {\n phase: MediaCachePhase;\n}\n\nconst MediaCacheContext = createContext<MediaCacheContextValue | null>(null);\nlet nextQueryErrorId = 0;\n\nexport function MediaCacheProvider({\n bridge,\n children,\n}: PropsWithChildren<{ bridge?: MediaCacheBridge }>) {\n const valueBridge = useMemo(() => bridge ?? window.mediaCache ?? null, [bridge]);\n const statusController = useMemo(\n () => createMediaCacheStatusController(valueBridge, valueBridge !== null),\n [valueBridge],\n );\n\n useEffect(() => () => statusController.dispose(), [statusController]);\n\n const [queryErrorsById, setQueryErrorsById] = useState<Map<string, Error>>(() => new Map());\n\n const reportQueryError = useCallback((id: string, error: Error | null) => {\n setQueryErrorsById((previous: Map<string, Error>) => {\n if (error === null) {\n if (!previous.has(id)) {\n return previous;\n }\n const next = new Map(previous);\n next.delete(id);\n return next;\n }\n\n if (previous.get(id) === error) {\n return previous;\n }\n\n const next = new Map(previous);\n next.set(id, error);\n return next;\n });\n }, []);\n\n const queryErrors = useMemo(() => Array.from(queryErrorsById.values()), [queryErrorsById]);\n const value = useMemo(\n () => ({\n bridge: valueBridge,\n statusController,\n queryErrors,\n reportQueryError,\n }),\n [valueBridge, statusController, queryErrors, reportQueryError],\n );\n\n return <MediaCacheContext.Provider value={value}>{children}</MediaCacheContext.Provider>;\n}\n\nexport function useMediaBridge(): UseMediaBridgeResult {\n const { bridge, status, queryErrors } = useMediaCacheRuntime();\n const errors = useMemo(\n () => aggregateMediaCacheErrors(status, queryErrors),\n [status, queryErrors],\n );\n\n return useMemo(\n () => ({\n ...bridge,\n status,\n phase: deriveMediaCachePhase(status),\n errors,\n }),\n [bridge, status, errors],\n );\n}\n\nexport function useMediaCacheStatus(): UseMediaCacheStatusResult {\n const status = useMediaCacheRuntime().status;\n return useMemo(() => ({ ...status, phase: deriveMediaCachePhase(status) }), [status]);\n}\n\n/**\n * Fetches a single asset by key.\n *\n * @param key - The asset key to look up. A string or array of string segments.\n * @param options - Optional sync-triggered refetch behavior.\n */\nexport function useMediaAsset(\n key: AssetKeyInput,\n options?: MediaQuerySyncOptions,\n): AsyncState<ResolvedMediaAsset | null> {\n const { bridge, statusController } = useMediaCacheRuntime();\n const stableKey = typeof key === \"string\" ? key : key.join(\"\\0\");\n return useAsyncResource(() => bridge.getAsset(key), [bridge, stableKey], statusController, {\n refetchOnSyncComplete: options?.refetchOnSyncComplete,\n });\n}\n\n/**\n * Lists assets matching a secondary index value.\n *\n * @param indexName - The index to query (e.g. `\"mimeType\"`, a user-defined index name).\n * @param value - The index value to match.\n * @param options - Optional pagination and sync-triggered refetch behavior.\n */\nexport function useMediaByIndex(\n indexName: string,\n value: string,\n options?: PaginationInput & MediaQuerySyncOptions,\n): AsyncState<PaginationResult<ResolvedMediaAsset>> {\n const { bridge, statusController } = useMediaCacheRuntime();\n const cursor = options?.cursor;\n const limit = options?.limit;\n return useAsyncResource(\n () => bridge.listByIndex(indexName, value, { cursor, limit }),\n [bridge, indexName, value, cursor, limit],\n statusController,\n { refetchOnSyncComplete: options?.refetchOnSyncComplete },\n );\n}\n\n/**\n * Searches assets by normalized file stem (file name without extension).\n *\n * @param stem - Normalized file stem to search for.\n * @param options - Optional pagination and sync-triggered refetch behavior.\n */\nexport function useFileStemMatch(\n stem: string,\n options?: PaginationInput & MediaQuerySyncOptions,\n): AsyncState<PaginationResult<FileStemMatch>> {\n const { bridge, statusController } = useMediaCacheRuntime();\n const cursor = options?.cursor;\n const limit = options?.limit;\n return useAsyncResource(\n () => bridge.findByFileStem(stem, { cursor, limit }),\n [bridge, stem, cursor, limit],\n statusController,\n { refetchOnSyncComplete: options?.refetchOnSyncComplete },\n );\n}\n\nexport function useMediaCacheReady(): AsyncState<MediaCacheReadyState> {\n const status = useMediaCacheStatus();\n\n return {\n data: mediaCacheReadyFromStatus(status.data ?? undefined),\n loading: status.loading,\n error: status.error,\n refresh: status.refresh,\n };\n}\n\nexport function useMediaCacheErrors(): MediaCacheErrors {\n const { status, queryErrors } = useMediaCacheRuntime();\n return aggregateMediaCacheErrors(status, queryErrors);\n}\n\nfunction useAsyncResource<T>(\n loader: () => Promise<T>,\n refreshDeps: ReadonlyArray<unknown>,\n statusController: MediaCacheStatusController,\n options?: MediaQuerySyncOptions,\n): AsyncState<T> {\n const latestLoader = useRef(loader);\n latestLoader.current = loader;\n\n const watcherRef = useRef<ReturnType<typeof createMediaQueryWatcherInstance<T>> | null>(null);\n const [, forceRender] = useReducer((count: number) => count + 1, 0);\n\n useLayoutEffect(() => {\n const instance = createMediaQueryWatcherInstance({\n status: statusController,\n getLoader: () => latestLoader.current,\n refetchOnSyncComplete: options?.refetchOnSyncComplete ?? true,\n listener: () => forceRender(),\n });\n watcherRef.current = instance;\n instance.syncDeps(refreshDeps);\n forceRender();\n return () => {\n instance.dispose();\n watcherRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- deps compared imperatively via syncDeps\n }, [statusController, options?.refetchOnSyncComplete]);\n\n useEffect(() => {\n watcherRef.current?.syncDeps(refreshDeps);\n });\n\n const snapshot =\n watcherRef.current?.getSnapshot() ??\n ({\n data: null,\n loading: true,\n error: null,\n refresh: async () => {\n await watcherRef.current?.refresh();\n },\n } as AsyncState<T>);\n\n useQueryErrorRegistration(snapshot.error);\n\n return snapshot;\n}\n\nfunction useMediaCacheRuntime(): {\n bridge: MediaCacheBridge;\n status: AsyncState<MediaCacheStatus>;\n statusController: MediaCacheStatusController;\n queryErrors: Error[];\n} {\n const runtime = useContext(MediaCacheContext);\n const bridge = runtime?.bridge;\n const statusController = runtime?.statusController;\n\n if (!bridge || !statusController) {\n throw new Error(MISSING_BRIDGE_ERROR);\n }\n\n const status = useSyncExternalStore(\n statusController.subscribe,\n statusController.getSnapshot,\n statusController.getSnapshot,\n );\n\n return {\n bridge,\n status,\n statusController,\n queryErrors: runtime.queryErrors,\n };\n}\n\nfunction useQueryErrorRegistration(error: Error | null): void {\n const runtime = useContext(MediaCacheContext);\n const queryErrorId = useRef<string | null>(null);\n\n if (queryErrorId.current === null) {\n queryErrorId.current = `query-error-${nextQueryErrorId++}`;\n }\n\n useEffect(() => {\n if (!runtime) {\n return;\n }\n\n runtime.reportQueryError(queryErrorId.current!, error);\n\n return () => {\n runtime.reportQueryError(queryErrorId.current!, null);\n };\n }, [runtime, error]);\n}\n\nexport type {\n AssetKeyInput,\n FileStemMatch,\n MediaCacheBridge,\n MediaCacheErrors,\n MediaCachePhase,\n MediaCacheReadyState,\n MediaCacheStatus,\n MediaQuerySyncOptions,\n ResolvedMediaAsset,\n} from \"../shared/types.js\";\n"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { AssetKeyInput, FileStemMatch, MediaCacheBridge, MediaCacheErrors, MediaCachePhase, MediaCacheReadyState, MediaCacheStatus, MediaQuerySyncOptions, PaginationInput, PaginationResult, ResolvedMediaAsset } from "../shared/types.cjs";
2
+ import { MediaAsyncState } from "../renderer/runtime.cjs";
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
+ import { PropsWithChildren } from "react";
5
+
6
+ //#region src/react/index.d.ts
7
+ type AsyncState<T> = MediaAsyncState<T>;
8
+ interface UseMediaBridgeResult extends MediaCacheBridge {
9
+ status: AsyncState<MediaCacheStatus>;
10
+ phase: MediaCachePhase;
11
+ errors: MediaCacheErrors;
12
+ }
13
+ interface UseMediaCacheStatusResult extends AsyncState<MediaCacheStatus> {
14
+ phase: MediaCachePhase;
15
+ }
16
+ declare function MediaCacheProvider({
17
+ bridge,
18
+ children
19
+ }: PropsWithChildren<{
20
+ bridge?: MediaCacheBridge;
21
+ }>): _$react_jsx_runtime0.JSX.Element;
22
+ declare function useMediaBridge(): UseMediaBridgeResult;
23
+ declare function useMediaCacheStatus(): UseMediaCacheStatusResult;
24
+ /**
25
+ * Fetches a single asset by key.
26
+ *
27
+ * @param key - The asset key to look up. A string or array of string segments.
28
+ * @param options - Optional sync-triggered refetch behavior.
29
+ */
30
+ declare function useMediaAsset(key: AssetKeyInput, options?: MediaQuerySyncOptions): AsyncState<ResolvedMediaAsset | null>;
31
+ /**
32
+ * Lists assets matching a secondary index value.
33
+ *
34
+ * @param indexName - The index to query (e.g. `"mimeType"`, a user-defined index name).
35
+ * @param value - The index value to match.
36
+ * @param options - Optional pagination and sync-triggered refetch behavior.
37
+ */
38
+ declare function useMediaByIndex(indexName: string, value: string, options?: PaginationInput & MediaQuerySyncOptions): AsyncState<PaginationResult<ResolvedMediaAsset>>;
39
+ /**
40
+ * Searches assets by normalized file stem (file name without extension).
41
+ *
42
+ * @param stem - Normalized file stem to search for.
43
+ * @param options - Optional pagination and sync-triggered refetch behavior.
44
+ */
45
+ declare function useFileStemMatch(stem: string, options?: PaginationInput & MediaQuerySyncOptions): AsyncState<PaginationResult<FileStemMatch>>;
46
+ declare function useMediaCacheReady(): AsyncState<MediaCacheReadyState>;
47
+ declare function useMediaCacheErrors(): MediaCacheErrors;
48
+ //#endregion
49
+ export { type AssetKeyInput, type FileStemMatch, type MediaCacheBridge, type MediaCacheErrors, type MediaCachePhase, MediaCacheProvider, type MediaCacheReadyState, type MediaCacheStatus, type MediaQuerySyncOptions, type ResolvedMediaAsset, UseMediaBridgeResult, UseMediaCacheStatusResult, useFileStemMatch, useMediaAsset, useMediaBridge, useMediaByIndex, useMediaCacheErrors, useMediaCacheReady, useMediaCacheStatus };
50
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/react/index.tsx"],"mappings":";;;;;;KAqCK,UAAA,MAAgB,eAAA,CAAgB,CAAA;AAAA,UASpB,oBAAA,SAA6B,gBAAA;EAC5C,MAAA,EAAQ,UAAA,CAAW,gBAAA;EACnB,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,gBAAA;AAAA;AAAA,UAGO,yBAAA,SAAkC,UAAA,CAAW,gBAAA;EAC5D,KAAA,EAAO,eAAA;AAAA;AAAA,iBAMO,kBAAA,CAAA;EACd,MAAA;EACA;AAAA,GACC,iBAAA;EAAoB,MAAA,GAAS,gBAAA;AAAA,KAAmB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA8CnC,cAAA,CAAA,GAAkB,oBAAA;AAAA,iBAkBlB,mBAAA,CAAA,GAAuB,yBAAA;;;;;;;iBAWvB,aAAA,CACd,GAAA,EAAK,aAAA,EACL,OAAA,GAAU,qBAAA,GACT,UAAA,CAAW,kBAAA;;;;;;;;iBAeE,eAAA,CACd,SAAA,UACA,KAAA,UACA,OAAA,GAAU,eAAA,GAAkB,qBAAA,GAC3B,UAAA,CAAW,gBAAA,CAAiB,kBAAA;;;;AA3G/B;;;iBA6HgB,gBAAA,CACd,IAAA,UACA,OAAA,GAAU,eAAA,GAAkB,qBAAA,GAC3B,UAAA,CAAW,gBAAA,CAAiB,aAAA;AAAA,iBAYf,kBAAA,CAAA,GAAsB,UAAA,CAAW,oBAAA;AAAA,iBAWjC,mBAAA,CAAA,GAAuB,gBAAA"}
@@ -0,0 +1,50 @@
1
+ import { AssetKeyInput, FileStemMatch, MediaCacheBridge, MediaCacheErrors, MediaCachePhase, MediaCacheReadyState, MediaCacheStatus, MediaQuerySyncOptions, PaginationInput, PaginationResult, ResolvedMediaAsset } from "../shared/types.js";
2
+ import { MediaAsyncState } from "../renderer/runtime.js";
3
+ import { PropsWithChildren } from "react";
4
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
+
6
+ //#region src/react/index.d.ts
7
+ type AsyncState<T> = MediaAsyncState<T>;
8
+ interface UseMediaBridgeResult extends MediaCacheBridge {
9
+ status: AsyncState<MediaCacheStatus>;
10
+ phase: MediaCachePhase;
11
+ errors: MediaCacheErrors;
12
+ }
13
+ interface UseMediaCacheStatusResult extends AsyncState<MediaCacheStatus> {
14
+ phase: MediaCachePhase;
15
+ }
16
+ declare function MediaCacheProvider({
17
+ bridge,
18
+ children
19
+ }: PropsWithChildren<{
20
+ bridge?: MediaCacheBridge;
21
+ }>): _$react_jsx_runtime0.JSX.Element;
22
+ declare function useMediaBridge(): UseMediaBridgeResult;
23
+ declare function useMediaCacheStatus(): UseMediaCacheStatusResult;
24
+ /**
25
+ * Fetches a single asset by key.
26
+ *
27
+ * @param key - The asset key to look up. A string or array of string segments.
28
+ * @param options - Optional sync-triggered refetch behavior.
29
+ */
30
+ declare function useMediaAsset(key: AssetKeyInput, options?: MediaQuerySyncOptions): AsyncState<ResolvedMediaAsset | null>;
31
+ /**
32
+ * Lists assets matching a secondary index value.
33
+ *
34
+ * @param indexName - The index to query (e.g. `"mimeType"`, a user-defined index name).
35
+ * @param value - The index value to match.
36
+ * @param options - Optional pagination and sync-triggered refetch behavior.
37
+ */
38
+ declare function useMediaByIndex(indexName: string, value: string, options?: PaginationInput & MediaQuerySyncOptions): AsyncState<PaginationResult<ResolvedMediaAsset>>;
39
+ /**
40
+ * Searches assets by normalized file stem (file name without extension).
41
+ *
42
+ * @param stem - Normalized file stem to search for.
43
+ * @param options - Optional pagination and sync-triggered refetch behavior.
44
+ */
45
+ declare function useFileStemMatch(stem: string, options?: PaginationInput & MediaQuerySyncOptions): AsyncState<PaginationResult<FileStemMatch>>;
46
+ declare function useMediaCacheReady(): AsyncState<MediaCacheReadyState>;
47
+ declare function useMediaCacheErrors(): MediaCacheErrors;
48
+ //#endregion
49
+ export { type AssetKeyInput, type FileStemMatch, type MediaCacheBridge, type MediaCacheErrors, type MediaCachePhase, MediaCacheProvider, type MediaCacheReadyState, type MediaCacheStatus, type MediaQuerySyncOptions, type ResolvedMediaAsset, UseMediaBridgeResult, UseMediaCacheStatusResult, useFileStemMatch, useMediaAsset, useMediaBridge, useMediaByIndex, useMediaCacheErrors, useMediaCacheReady, useMediaCacheStatus };
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/react/index.tsx"],"mappings":";;;;;;KAqCK,UAAA,MAAgB,eAAA,CAAgB,CAAA;AAAA,UASpB,oBAAA,SAA6B,gBAAA;EAC5C,MAAA,EAAQ,UAAA,CAAW,gBAAA;EACnB,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,gBAAA;AAAA;AAAA,UAGO,yBAAA,SAAkC,UAAA,CAAW,gBAAA;EAC5D,KAAA,EAAO,eAAA;AAAA;AAAA,iBAMO,kBAAA,CAAA;EACd,MAAA;EACA;AAAA,GACC,iBAAA;EAAoB,MAAA,GAAS,gBAAA;AAAA,KAAmB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA8CnC,cAAA,CAAA,GAAkB,oBAAA;AAAA,iBAkBlB,mBAAA,CAAA,GAAuB,yBAAA;;;;;;;iBAWvB,aAAA,CACd,GAAA,EAAK,aAAA,EACL,OAAA,GAAU,qBAAA,GACT,UAAA,CAAW,kBAAA;;;;;;;;iBAeE,eAAA,CACd,SAAA,UACA,KAAA,UACA,OAAA,GAAU,eAAA,GAAkB,qBAAA,GAC3B,UAAA,CAAW,gBAAA,CAAiB,kBAAA;;;;AA3G/B;;;iBA6HgB,gBAAA,CACd,IAAA,UACA,OAAA,GAAU,eAAA,GAAkB,qBAAA,GAC3B,UAAA,CAAW,gBAAA,CAAiB,aAAA;AAAA,iBAYf,kBAAA,CAAA,GAAsB,UAAA,CAAW,oBAAA;AAAA,iBAWjC,mBAAA,CAAA,GAAuB,gBAAA"}
@@ -0,0 +1,191 @@
1
+ import { MISSING_BRIDGE_ERROR, createMediaCacheStatusController, createMediaQueryWatcherInstance, deriveMediaCachePhase } from "../renderer/runtime.js";
2
+ import { aggregateMediaCacheErrors, mediaCacheReadyFromStatus } from "../renderer/helpers.js";
3
+ import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/react/index.tsx
6
+ const MediaCacheContext = createContext(null);
7
+ let nextQueryErrorId = 0;
8
+ function MediaCacheProvider({ bridge, children }) {
9
+ const valueBridge = useMemo(() => bridge ?? window.mediaCache ?? null, [bridge]);
10
+ const statusController = useMemo(() => createMediaCacheStatusController(valueBridge, valueBridge !== null), [valueBridge]);
11
+ useEffect(() => () => statusController.dispose(), [statusController]);
12
+ const [queryErrorsById, setQueryErrorsById] = useState(() => /* @__PURE__ */ new Map());
13
+ const reportQueryError = useCallback((id, error) => {
14
+ setQueryErrorsById((previous) => {
15
+ if (error === null) {
16
+ if (!previous.has(id)) return previous;
17
+ const next = new Map(previous);
18
+ next.delete(id);
19
+ return next;
20
+ }
21
+ if (previous.get(id) === error) return previous;
22
+ const next = new Map(previous);
23
+ next.set(id, error);
24
+ return next;
25
+ });
26
+ }, []);
27
+ const queryErrors = useMemo(() => Array.from(queryErrorsById.values()), [queryErrorsById]);
28
+ const value = useMemo(() => ({
29
+ bridge: valueBridge,
30
+ statusController,
31
+ queryErrors,
32
+ reportQueryError
33
+ }), [
34
+ valueBridge,
35
+ statusController,
36
+ queryErrors,
37
+ reportQueryError
38
+ ]);
39
+ return /* @__PURE__ */ jsx(MediaCacheContext.Provider, {
40
+ value,
41
+ children
42
+ });
43
+ }
44
+ function useMediaBridge() {
45
+ const { bridge, status, queryErrors } = useMediaCacheRuntime();
46
+ const errors = useMemo(() => aggregateMediaCacheErrors(status, queryErrors), [status, queryErrors]);
47
+ return useMemo(() => ({
48
+ ...bridge,
49
+ status,
50
+ phase: deriveMediaCachePhase(status),
51
+ errors
52
+ }), [
53
+ bridge,
54
+ status,
55
+ errors
56
+ ]);
57
+ }
58
+ function useMediaCacheStatus() {
59
+ const status = useMediaCacheRuntime().status;
60
+ return useMemo(() => ({
61
+ ...status,
62
+ phase: deriveMediaCachePhase(status)
63
+ }), [status]);
64
+ }
65
+ /**
66
+ * Fetches a single asset by key.
67
+ *
68
+ * @param key - The asset key to look up. A string or array of string segments.
69
+ * @param options - Optional sync-triggered refetch behavior.
70
+ */
71
+ function useMediaAsset(key, options) {
72
+ const { bridge, statusController } = useMediaCacheRuntime();
73
+ return useAsyncResource(() => bridge.getAsset(key), [bridge, typeof key === "string" ? key : key.join("\0")], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
74
+ }
75
+ /**
76
+ * Lists assets matching a secondary index value.
77
+ *
78
+ * @param indexName - The index to query (e.g. `"mimeType"`, a user-defined index name).
79
+ * @param value - The index value to match.
80
+ * @param options - Optional pagination and sync-triggered refetch behavior.
81
+ */
82
+ function useMediaByIndex(indexName, value, options) {
83
+ const { bridge, statusController } = useMediaCacheRuntime();
84
+ const cursor = options?.cursor;
85
+ const limit = options?.limit;
86
+ return useAsyncResource(() => bridge.listByIndex(indexName, value, {
87
+ cursor,
88
+ limit
89
+ }), [
90
+ bridge,
91
+ indexName,
92
+ value,
93
+ cursor,
94
+ limit
95
+ ], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
96
+ }
97
+ /**
98
+ * Searches assets by normalized file stem (file name without extension).
99
+ *
100
+ * @param stem - Normalized file stem to search for.
101
+ * @param options - Optional pagination and sync-triggered refetch behavior.
102
+ */
103
+ function useFileStemMatch(stem, options) {
104
+ const { bridge, statusController } = useMediaCacheRuntime();
105
+ const cursor = options?.cursor;
106
+ const limit = options?.limit;
107
+ return useAsyncResource(() => bridge.findByFileStem(stem, {
108
+ cursor,
109
+ limit
110
+ }), [
111
+ bridge,
112
+ stem,
113
+ cursor,
114
+ limit
115
+ ], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
116
+ }
117
+ function useMediaCacheReady() {
118
+ const status = useMediaCacheStatus();
119
+ return {
120
+ data: mediaCacheReadyFromStatus(status.data ?? void 0),
121
+ loading: status.loading,
122
+ error: status.error,
123
+ refresh: status.refresh
124
+ };
125
+ }
126
+ function useMediaCacheErrors() {
127
+ const { status, queryErrors } = useMediaCacheRuntime();
128
+ return aggregateMediaCacheErrors(status, queryErrors);
129
+ }
130
+ function useAsyncResource(loader, refreshDeps, statusController, options) {
131
+ const latestLoader = useRef(loader);
132
+ latestLoader.current = loader;
133
+ const watcherRef = useRef(null);
134
+ const [, forceRender] = useReducer((count) => count + 1, 0);
135
+ useLayoutEffect(() => {
136
+ const instance = createMediaQueryWatcherInstance({
137
+ status: statusController,
138
+ getLoader: () => latestLoader.current,
139
+ refetchOnSyncComplete: options?.refetchOnSyncComplete ?? true,
140
+ listener: () => forceRender()
141
+ });
142
+ watcherRef.current = instance;
143
+ instance.syncDeps(refreshDeps);
144
+ forceRender();
145
+ return () => {
146
+ instance.dispose();
147
+ watcherRef.current = null;
148
+ };
149
+ }, [statusController, options?.refetchOnSyncComplete]);
150
+ useEffect(() => {
151
+ watcherRef.current?.syncDeps(refreshDeps);
152
+ });
153
+ const snapshot = watcherRef.current?.getSnapshot() ?? {
154
+ data: null,
155
+ loading: true,
156
+ error: null,
157
+ refresh: async () => {
158
+ await watcherRef.current?.refresh();
159
+ }
160
+ };
161
+ useQueryErrorRegistration(snapshot.error);
162
+ return snapshot;
163
+ }
164
+ function useMediaCacheRuntime() {
165
+ const runtime = useContext(MediaCacheContext);
166
+ const bridge = runtime?.bridge;
167
+ const statusController = runtime?.statusController;
168
+ if (!bridge || !statusController) throw new Error(MISSING_BRIDGE_ERROR);
169
+ return {
170
+ bridge,
171
+ status: useSyncExternalStore(statusController.subscribe, statusController.getSnapshot, statusController.getSnapshot),
172
+ statusController,
173
+ queryErrors: runtime.queryErrors
174
+ };
175
+ }
176
+ function useQueryErrorRegistration(error) {
177
+ const runtime = useContext(MediaCacheContext);
178
+ const queryErrorId = useRef(null);
179
+ if (queryErrorId.current === null) queryErrorId.current = `query-error-${nextQueryErrorId++}`;
180
+ useEffect(() => {
181
+ if (!runtime) return;
182
+ runtime.reportQueryError(queryErrorId.current, error);
183
+ return () => {
184
+ runtime.reportQueryError(queryErrorId.current, null);
185
+ };
186
+ }, [runtime, error]);
187
+ }
188
+ //#endregion
189
+ export { MediaCacheProvider, useFileStemMatch, useMediaAsset, useMediaBridge, useMediaByIndex, useMediaCacheErrors, useMediaCacheReady, useMediaCacheStatus };
190
+
191
+ //# sourceMappingURL=index.js.map