@dxos/plugin-wnfs 0.8.4-main.f9ba587 → 0.8.4-main.fcfe5033a5

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 (176) hide show
  1. package/dist/lib/browser/chunk-BM3MEFES.mjs +69 -0
  2. package/dist/lib/browser/chunk-BM3MEFES.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-VRRXG6IB.mjs → chunk-N6Y4QPNF.mjs} +24 -33
  4. package/dist/lib/browser/chunk-N6Y4QPNF.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-VXUCZHVZ.mjs +69 -0
  6. package/dist/lib/browser/chunk-VXUCZHVZ.mjs.map +7 -0
  7. package/dist/lib/browser/create-NOHKWE67.mjs +24 -0
  8. package/dist/lib/browser/create-NOHKWE67.mjs.map +7 -0
  9. package/dist/lib/browser/create-file-N7ADCFOF.mjs +49 -0
  10. package/dist/lib/browser/create-file-N7ADCFOF.mjs.map +7 -0
  11. package/dist/lib/browser/index.mjs +92 -91
  12. package/dist/lib/browser/index.mjs.map +4 -4
  13. package/dist/lib/browser/meta.json +1 -1
  14. package/dist/lib/browser/operations/index.mjs +13 -0
  15. package/dist/lib/browser/operations/index.mjs.map +7 -0
  16. package/dist/lib/browser/types/index.mjs +7 -6
  17. package/dist/lib/browser/upload-DA7GBOXF.mjs +42 -0
  18. package/dist/lib/browser/upload-DA7GBOXF.mjs.map +7 -0
  19. package/dist/types/src/WnfsPlugin.d.ts +2 -1
  20. package/dist/types/src/WnfsPlugin.d.ts.map +1 -1
  21. package/dist/types/src/capabilities/blockstore.d.ts +3 -2
  22. package/dist/types/src/capabilities/blockstore.d.ts.map +1 -1
  23. package/dist/types/src/capabilities/file-uploader.d.ts +4 -2
  24. package/dist/types/src/capabilities/file-uploader.d.ts.map +1 -1
  25. package/dist/types/src/capabilities/index.d.ts +7 -6
  26. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  27. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  28. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  29. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  30. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  31. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  32. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  33. package/dist/types/src/components/{FileInput.d.ts → FileInput/FileInput.d.ts} +1 -1
  34. package/dist/types/src/components/FileInput/FileInput.d.ts.map +1 -0
  35. package/dist/types/src/components/FileInput/index.d.ts +2 -0
  36. package/dist/types/src/components/FileInput/index.d.ts.map +1 -0
  37. package/dist/types/src/components/FilePreview/FilePreview.d.ts +12 -0
  38. package/dist/types/src/components/FilePreview/FilePreview.d.ts.map +1 -0
  39. package/dist/types/src/components/FilePreview/index.d.ts +2 -0
  40. package/dist/types/src/components/FilePreview/index.d.ts.map +1 -0
  41. package/dist/types/src/components/index.d.ts +1 -1
  42. package/dist/types/src/components/index.d.ts.map +1 -1
  43. package/dist/types/src/containers/FileContainer/FileContainer.d.ts +7 -0
  44. package/dist/types/src/containers/FileContainer/FileContainer.d.ts.map +1 -0
  45. package/dist/types/src/containers/FileContainer/index.d.ts +2 -0
  46. package/dist/types/src/containers/FileContainer/index.d.ts.map +1 -0
  47. package/dist/types/src/containers/index.d.ts +3 -0
  48. package/dist/types/src/containers/index.d.ts.map +1 -0
  49. package/dist/types/src/extensions/image.d.ts +1 -1
  50. package/dist/types/src/extensions/image.d.ts.map +1 -1
  51. package/dist/types/src/extensions/image.stories.d.ts +5 -4
  52. package/dist/types/src/extensions/image.stories.d.ts.map +1 -1
  53. package/dist/types/src/helpers/load.d.ts +2 -2
  54. package/dist/types/src/helpers/load.d.ts.map +1 -1
  55. package/dist/types/src/helpers/upload.d.ts +1 -1
  56. package/dist/types/src/helpers/upload.d.ts.map +1 -1
  57. package/dist/types/src/index.d.ts +1 -1
  58. package/dist/types/src/index.d.ts.map +1 -1
  59. package/dist/types/src/meta.d.ts +2 -3
  60. package/dist/types/src/meta.d.ts.map +1 -1
  61. package/dist/types/src/operations/create-file.d.ts +5 -0
  62. package/dist/types/src/operations/create-file.d.ts.map +1 -0
  63. package/dist/types/src/operations/create.d.ts +5 -0
  64. package/dist/types/src/operations/create.d.ts.map +1 -0
  65. package/dist/types/src/operations/definitions.d.ts +38 -0
  66. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  67. package/dist/types/src/operations/index.d.ts +4 -0
  68. package/dist/types/src/operations/index.d.ts.map +1 -0
  69. package/dist/types/src/operations/upload.d.ts +5 -0
  70. package/dist/types/src/operations/upload.d.ts.map +1 -0
  71. package/dist/types/src/translations.d.ts +14 -8
  72. package/dist/types/src/translations.d.ts.map +1 -1
  73. package/dist/types/src/types/File.d.ts +16 -0
  74. package/dist/types/src/types/File.d.ts.map +1 -0
  75. package/dist/types/src/{capabilities → types}/capabilities.d.ts +3 -2
  76. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  77. package/dist/types/src/types/index.d.ts +2 -1
  78. package/dist/types/src/types/index.d.ts.map +1 -1
  79. package/dist/types/src/types/types.d.ts +4 -46
  80. package/dist/types/src/types/types.d.ts.map +1 -1
  81. package/dist/types/tsconfig.tsbuildinfo +1 -1
  82. package/package.json +64 -40
  83. package/src/WnfsPlugin.tsx +65 -83
  84. package/src/blockstore.ts +3 -3
  85. package/src/capabilities/blockstore.ts +15 -10
  86. package/src/capabilities/file-uploader.ts +25 -15
  87. package/src/capabilities/index.ts +10 -8
  88. package/src/capabilities/markdown.ts +23 -14
  89. package/src/capabilities/operation-handler.ts +16 -0
  90. package/src/capabilities/react-surface.tsx +44 -35
  91. package/src/components/{FileInput.tsx → FileInput/FileInput.tsx} +8 -8
  92. package/src/components/FileInput/index.ts +5 -0
  93. package/src/components/FilePreview/FilePreview.tsx +43 -0
  94. package/src/components/FilePreview/index.ts +5 -0
  95. package/src/components/index.ts +1 -4
  96. package/src/containers/FileContainer/FileContainer.tsx +57 -0
  97. package/src/containers/FileContainer/index.ts +5 -0
  98. package/src/containers/index.ts +7 -0
  99. package/src/extensions/image.stories.tsx +22 -19
  100. package/src/extensions/image.tsx +10 -9
  101. package/src/helpers/load.ts +14 -8
  102. package/src/helpers/upload.ts +6 -2
  103. package/src/index.ts +1 -1
  104. package/src/meta.ts +9 -6
  105. package/src/operations/create-file.ts +31 -0
  106. package/src/operations/create.ts +22 -0
  107. package/src/operations/definitions.ts +41 -0
  108. package/src/operations/index.ts +13 -0
  109. package/src/operations/upload.ts +29 -0
  110. package/src/translations.ts +14 -8
  111. package/src/types/File.ts +28 -0
  112. package/src/{capabilities → types}/capabilities.ts +4 -4
  113. package/src/types/index.ts +2 -1
  114. package/src/types/types.ts +3 -19
  115. package/dist/lib/browser/FileContainer-Q4GUPBVD.mjs +0 -107
  116. package/dist/lib/browser/FileContainer-Q4GUPBVD.mjs.map +0 -7
  117. package/dist/lib/browser/blockstore-KQO2NTVM.mjs +0 -191
  118. package/dist/lib/browser/blockstore-KQO2NTVM.mjs.map +0 -7
  119. package/dist/lib/browser/chunk-BANMVVJV.mjs +0 -16
  120. package/dist/lib/browser/chunk-BANMVVJV.mjs.map +0 -7
  121. package/dist/lib/browser/chunk-GVBV2QWA.mjs +0 -64
  122. package/dist/lib/browser/chunk-GVBV2QWA.mjs.map +0 -7
  123. package/dist/lib/browser/chunk-KZANQHJY.mjs +0 -16
  124. package/dist/lib/browser/chunk-KZANQHJY.mjs.map +0 -7
  125. package/dist/lib/browser/chunk-VDDGZWAY.mjs +0 -15
  126. package/dist/lib/browser/chunk-VDDGZWAY.mjs.map +0 -7
  127. package/dist/lib/browser/chunk-VRRXG6IB.mjs.map +0 -7
  128. package/dist/lib/browser/file-uploader-JA55DPMW.mjs +0 -29
  129. package/dist/lib/browser/file-uploader-JA55DPMW.mjs.map +0 -7
  130. package/dist/lib/browser/intent-resolver-YM6QRFIH.mjs +0 -49
  131. package/dist/lib/browser/intent-resolver-YM6QRFIH.mjs.map +0 -7
  132. package/dist/lib/browser/markdown-6VH477GB.mjs +0 -196
  133. package/dist/lib/browser/markdown-6VH477GB.mjs.map +0 -7
  134. package/dist/lib/browser/react-surface-XAHVMWIH.mjs +0 -88
  135. package/dist/lib/browser/react-surface-XAHVMWIH.mjs.map +0 -7
  136. package/dist/lib/node-esm/FileContainer-22IPNDDA.mjs +0 -108
  137. package/dist/lib/node-esm/FileContainer-22IPNDDA.mjs.map +0 -7
  138. package/dist/lib/node-esm/blockstore-7KQTFHK5.mjs +0 -192
  139. package/dist/lib/node-esm/blockstore-7KQTFHK5.mjs.map +0 -7
  140. package/dist/lib/node-esm/chunk-47QYKNA6.mjs +0 -17
  141. package/dist/lib/node-esm/chunk-47QYKNA6.mjs.map +0 -7
  142. package/dist/lib/node-esm/chunk-BM37ZAHF.mjs +0 -65
  143. package/dist/lib/node-esm/chunk-BM37ZAHF.mjs.map +0 -7
  144. package/dist/lib/node-esm/chunk-CGW32EZB.mjs +0 -161
  145. package/dist/lib/node-esm/chunk-CGW32EZB.mjs.map +0 -7
  146. package/dist/lib/node-esm/chunk-DWYM7FD7.mjs +0 -18
  147. package/dist/lib/node-esm/chunk-DWYM7FD7.mjs.map +0 -7
  148. package/dist/lib/node-esm/chunk-YTWL64Z6.mjs +0 -17
  149. package/dist/lib/node-esm/chunk-YTWL64Z6.mjs.map +0 -7
  150. package/dist/lib/node-esm/file-uploader-WGDG2YV5.mjs +0 -30
  151. package/dist/lib/node-esm/file-uploader-WGDG2YV5.mjs.map +0 -7
  152. package/dist/lib/node-esm/index.mjs +0 -117
  153. package/dist/lib/node-esm/index.mjs.map +0 -7
  154. package/dist/lib/node-esm/intent-resolver-5QOT2SLD.mjs +0 -50
  155. package/dist/lib/node-esm/intent-resolver-5QOT2SLD.mjs.map +0 -7
  156. package/dist/lib/node-esm/markdown-R4PBXDJO.mjs +0 -197
  157. package/dist/lib/node-esm/markdown-R4PBXDJO.mjs.map +0 -7
  158. package/dist/lib/node-esm/meta.json +0 -1
  159. package/dist/lib/node-esm/react-surface-HAOUJUXJ.mjs +0 -89
  160. package/dist/lib/node-esm/react-surface-HAOUJUXJ.mjs.map +0 -7
  161. package/dist/lib/node-esm/types/index.mjs +0 -11
  162. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  163. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  164. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  165. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  166. package/dist/types/src/components/FileContainer.d.ts +0 -9
  167. package/dist/types/src/components/FileContainer.d.ts.map +0 -1
  168. package/dist/types/src/components/FileInput.d.ts.map +0 -1
  169. package/dist/types/src/components/FilePreview.d.ts +0 -11
  170. package/dist/types/src/components/FilePreview.d.ts.map +0 -1
  171. package/dist/types/src/types/file.d.ts +0 -16
  172. package/dist/types/src/types/file.d.ts.map +0 -1
  173. package/src/capabilities/intent-resolver.ts +0 -32
  174. package/src/components/FileContainer.tsx +0 -51
  175. package/src/components/FilePreview.tsx +0 -23
  176. package/src/types/file.ts +0 -17
@@ -1,196 +0,0 @@
1
- import {
2
- getBlobUrl,
3
- getPathFromUrl,
4
- loadWnfs
5
- } from "./chunk-VRRXG6IB.mjs";
6
- import {
7
- WnfsCapabilities
8
- } from "./chunk-KZANQHJY.mjs";
9
- import "./chunk-VDDGZWAY.mjs";
10
-
11
- // src/capabilities/markdown.ts
12
- import { contributes } from "@dxos/app-framework";
13
- import { MarkdownCapabilities } from "@dxos/plugin-markdown";
14
- import { getSpace } from "@dxos/react-client/echo";
15
-
16
- // src/extensions/image.tsx
17
- import { syntaxTree } from "@codemirror/language";
18
- import { StateField } from "@codemirror/state";
19
- import { Decoration, EditorView, WidgetType } from "@codemirror/view";
20
- import React from "react";
21
- import { createRoot } from "react-dom/client";
22
- import { Status, ThemeProvider } from "@dxos/react-ui";
23
- import { focusField } from "@dxos/react-ui-editor";
24
- import { defaultTx } from "@dxos/react-ui-theme";
25
- var WAIT_UNTIL_LOADER = 1500;
26
- var image = (options) => {
27
- const blobUrlCache = {};
28
- const preloaded = /* @__PURE__ */ new Set();
29
- const preload = (url) => {
30
- if (!preloaded.has(url)) {
31
- const img = document.createElement("img");
32
- img.src = url;
33
- preloaded.add(url);
34
- }
35
- };
36
- return [
37
- StateField.define({
38
- create: (state) => {
39
- return Decoration.set(buildDecorations({
40
- from: 0,
41
- to: state.doc.length,
42
- state,
43
- blobUrlCache,
44
- preload,
45
- options
46
- }));
47
- },
48
- update: (value, tr) => {
49
- if (!tr.docChanged && !tr.selection) {
50
- return value;
51
- }
52
- const cursor = tr.state.selection.main.head;
53
- const oldCursor = tr.changes.mapPos(tr.startState.selection.main.head);
54
- let from = Math.min(cursor, oldCursor);
55
- let to = Math.max(cursor, oldCursor);
56
- tr.changes.iterChangedRanges((fromA, toA, fromB, toB) => {
57
- from = Math.min(from, fromB);
58
- to = Math.max(to, toB);
59
- });
60
- from = tr.state.doc.lineAt(from).from;
61
- to = tr.state.doc.lineAt(to).to;
62
- return value.map(tr.changes).update({
63
- filterFrom: from,
64
- filterTo: to,
65
- filter: () => false,
66
- add: buildDecorations({
67
- from,
68
- to,
69
- state: tr.state,
70
- blobUrlCache,
71
- preload,
72
- options
73
- })
74
- });
75
- },
76
- provide: (field) => EditorView.decorations.from(field)
77
- })
78
- ];
79
- };
80
- var buildDecorations = ({ from, to, state, blobUrlCache, preload, options: { blockstore, instances, space } }) => {
81
- const decorations = [];
82
- const cursor = state.selection.main.head;
83
- syntaxTree(state).iterate({
84
- enter: (node) => {
85
- if (node.name !== "Image") {
86
- return;
87
- }
88
- const urlNode = node.node.getChild("URL");
89
- if (!urlNode) {
90
- return;
91
- }
92
- const hide = state.readOnly || cursor < node.from || cursor > node.to;
93
- const wnfsUrl = state.sliceDoc(urlNode.from, urlNode.to);
94
- if (!wnfsUrl.startsWith("wnfs://")) {
95
- return;
96
- }
97
- const path = getPathFromUrl(wnfsUrl);
98
- const spaceId = path[1];
99
- if (spaceId !== space.id) {
100
- return;
101
- }
102
- const blobUrlPromise = (async () => {
103
- const { directory, forest } = await loadWnfs({
104
- blockstore,
105
- instances,
106
- space
107
- });
108
- const url = await getBlobUrl({
109
- wnfsUrl,
110
- blockstore,
111
- directory,
112
- forest
113
- });
114
- blobUrlCache[path.join("/")] = url;
115
- preload(url);
116
- return url;
117
- })();
118
- decorations.push(Decoration.replace({
119
- block: true,
120
- widget: new WnfsImageWidget(wnfsUrl, blobUrlCache[path.join("/")] ?? blobUrlPromise)
121
- }).range(hide ? node.from : node.to, node.to));
122
- },
123
- from,
124
- to
125
- });
126
- return decorations;
127
- };
128
- var createImg = (view, url) => {
129
- const img = document.createElement("img");
130
- img.setAttribute("src", url);
131
- img.setAttribute("class", "cm-image-with-loader");
132
- if (view.state.field(focusField)) {
133
- img.onload = () => img.classList.add("cm-loaded-image");
134
- } else {
135
- img.classList.add("cm-loaded-image");
136
- }
137
- return img;
138
- };
139
- var WnfsImageWidget = class extends WidgetType {
140
- constructor(_wnfsUrl, _url) {
141
- super(), this._wnfsUrl = _wnfsUrl, this._url = _url;
142
- }
143
- eq(other) {
144
- return this._wnfsUrl === other._wnfsUrl;
145
- }
146
- toDOM(view) {
147
- if (typeof this._url === "string") {
148
- return createImg(view, this._url);
149
- }
150
- const widget = document.createElement("div");
151
- widget.className = "cm-image-wrapper";
152
- const loader = document.createElement("div");
153
- loader.className = "mx-auto transition-opacity";
154
- let loaderAdded = false;
155
- const timeout = setTimeout(() => {
156
- const root = createRoot(loader);
157
- root.render(/* @__PURE__ */ React.createElement(ThemeProvider, {
158
- tx: defaultTx
159
- }, /* @__PURE__ */ React.createElement(Status, {
160
- indeterminate: true
161
- })));
162
- widget.appendChild(loader);
163
- loaderAdded = true;
164
- }, WAIT_UNTIL_LOADER);
165
- void this._url.then((url) => {
166
- clearTimeout(timeout);
167
- const img = createImg(view, url);
168
- loaderAdded && widget.removeChild(loader);
169
- widget.appendChild(img);
170
- });
171
- return widget;
172
- }
173
- };
174
-
175
- // src/capabilities/markdown.ts
176
- var markdown_default = (context) => contributes(MarkdownCapabilities.Extensions, [
177
- ({ document: document2 }) => {
178
- const blockstore = context.getCapability(WnfsCapabilities.Blockstore);
179
- const instances = context.getCapability(WnfsCapabilities.Instances);
180
- if (document2) {
181
- const space = getSpace(document2);
182
- return space ? [
183
- image({
184
- blockstore,
185
- instances,
186
- space
187
- })
188
- ] : [];
189
- }
190
- return [];
191
- }
192
- ]);
193
- export {
194
- markdown_default as default
195
- };
196
- //# sourceMappingURL=markdown-6VH477GB.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/markdown.ts", "../../../src/extensions/image.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes, type PluginContext } from '@dxos/app-framework';\nimport { MarkdownCapabilities } from '@dxos/plugin-markdown';\nimport { getSpace } from '@dxos/react-client/echo';\n\nimport { WnfsCapabilities } from './capabilities';\nimport { image } from '../extensions';\n\nexport default (context: PluginContext) =>\n contributes(MarkdownCapabilities.Extensions, [\n ({ document }) => {\n const blockstore = context.getCapability(WnfsCapabilities.Blockstore);\n const instances = context.getCapability(WnfsCapabilities.Instances);\n\n if (document) {\n const space = getSpace(document);\n return space ? [image({ blockstore, instances, space })] : [];\n }\n\n return [];\n },\n ]);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type EditorState, type Extension, StateField, type Range } from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\nimport type { Blockstore } from 'interface-blockstore';\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { type Space } from '@dxos/react-client/echo';\nimport { Status, ThemeProvider } from '@dxos/react-ui';\nimport { focusField } from '@dxos/react-ui-editor';\nimport { defaultTx } from '@dxos/react-ui-theme';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { type WnfsCapabilities } from '../capabilities';\nimport { getBlobUrl, getPathFromUrl, loadWnfs } from '../helpers';\n\nconst WAIT_UNTIL_LOADER = 1500;\n\nexport type ImageOptions = {\n blockstore: Blockstore;\n instances: WnfsCapabilities.Instances;\n space: Space;\n};\n\n/**\n * Create WNFS image decorations.\n */\nexport const image = (options: ImageOptions): Extension[] => {\n const blobUrlCache: Record<string, string> = {};\n const preloaded = new Set<string>();\n\n const preload = (url: string) => {\n if (!preloaded.has(url)) {\n const img = document.createElement('img');\n img.src = url;\n preloaded.add(url);\n }\n };\n\n return [\n StateField.define({\n create: (state) => {\n return Decoration.set(\n buildDecorations({ from: 0, to: state.doc.length, state, blobUrlCache, preload, options }),\n );\n },\n update: (value, tr) => {\n if (!tr.docChanged && !tr.selection) {\n return value;\n }\n\n // Find range of changes and cursor changes.\n const cursor = tr.state.selection.main.head;\n const oldCursor = tr.changes.mapPos(tr.startState.selection.main.head);\n let from = Math.min(cursor, oldCursor);\n let to = Math.max(cursor, oldCursor);\n tr.changes.iterChangedRanges((fromA, toA, fromB, toB) => {\n from = Math.min(from, fromB);\n to = Math.max(to, toB);\n });\n\n // Expand to cover lines.\n from = tr.state.doc.lineAt(from).from;\n to = tr.state.doc.lineAt(to).to;\n\n return value.map(tr.changes).update({\n filterFrom: from,\n filterTo: to,\n filter: () => false,\n add: buildDecorations({ from, to, state: tr.state, blobUrlCache, preload, options }),\n });\n },\n provide: (field) => EditorView.decorations.from(field),\n }),\n ];\n};\n\nconst buildDecorations = ({\n from,\n to,\n state,\n blobUrlCache,\n preload,\n options: { blockstore, instances, space },\n}: {\n from: number;\n to: number;\n state: EditorState;\n blobUrlCache: Record<string, string>;\n preload: (url: string) => void;\n options: ImageOptions;\n}) => {\n const decorations: Range<Decoration>[] = [];\n const cursor = state.selection.main.head;\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name !== 'Image') {\n return;\n }\n\n const urlNode = node.node.getChild('URL');\n if (!urlNode) {\n return;\n }\n\n const hide = state.readOnly || cursor < node.from || cursor > node.to;\n const wnfsUrl = state.sliceDoc(urlNode.from, urlNode.to);\n if (!wnfsUrl.startsWith('wnfs://')) {\n return;\n }\n\n const path = getPathFromUrl(wnfsUrl);\n\n // Cannot load images from other spaces\n const spaceId = path[1];\n if (spaceId !== space.id) {\n return;\n }\n\n // Load image contents into memory blob\n const blobUrlPromise = (async () => {\n const { directory, forest } = await loadWnfs({ blockstore, instances, space });\n const url = await getBlobUrl({ wnfsUrl, blockstore, directory, forest });\n blobUrlCache[path.join('/')] = url;\n preload(url);\n return url;\n })();\n\n decorations.push(\n Decoration.replace({\n block: true, // Prevent cursor from entering.\n widget: new WnfsImageWidget(wnfsUrl, blobUrlCache[path.join('/')] ?? blobUrlPromise),\n }).range(hide ? node.from : node.to, node.to),\n );\n },\n from,\n to,\n });\n\n return decorations;\n};\n\nconst createImg = (view: EditorView, url: string) => {\n const img = document.createElement('img');\n img.setAttribute('src', url);\n img.setAttribute('class', 'cm-image-with-loader');\n // If focused, hide image until successfully loaded to avoid flickering effects.\n if (view.state.field(focusField)) {\n img.onload = () => img.classList.add('cm-loaded-image');\n } else {\n img.classList.add('cm-loaded-image');\n }\n return img;\n};\n\nclass WnfsImageWidget extends WidgetType {\n constructor(\n readonly _wnfsUrl: string,\n readonly _url: MaybePromise<string>,\n ) {\n super();\n }\n\n override eq(other: this): boolean {\n return this._wnfsUrl === (other as any as WnfsImageWidget)._wnfsUrl;\n }\n\n override toDOM(view: EditorView): HTMLDivElement {\n if (typeof this._url === 'string') {\n return createImg(view, this._url);\n }\n\n const widget = document.createElement('div');\n widget.className = 'cm-image-wrapper';\n const loader = document.createElement('div');\n loader.className = 'mx-auto transition-opacity';\n let loaderAdded = false;\n\n const timeout = setTimeout(() => {\n const root = createRoot(loader);\n root.render(\n <ThemeProvider tx={defaultTx}>\n <Status indeterminate />\n </ThemeProvider>,\n );\n widget.appendChild(loader);\n loaderAdded = true;\n }, WAIT_UNTIL_LOADER);\n\n void this._url.then((url) => {\n clearTimeout(timeout);\n const img = createImg(view, url);\n loaderAdded && widget.removeChild(loader);\n widget.appendChild(img);\n });\n\n return widget;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["contributes", "MarkdownCapabilities", "getSpace", "syntaxTree", "StateField", "Decoration", "EditorView", "WidgetType", "React", "createRoot", "Status", "ThemeProvider", "focusField", "defaultTx", "WAIT_UNTIL_LOADER", "image", "options", "blobUrlCache", "preloaded", "Set", "preload", "url", "has", "img", "document", "createElement", "src", "add", "StateField", "define", "create", "state", "Decoration", "set", "buildDecorations", "from", "to", "doc", "length", "update", "value", "tr", "docChanged", "selection", "cursor", "main", "head", "oldCursor", "changes", "mapPos", "startState", "Math", "min", "max", "iterChangedRanges", "fromA", "toA", "fromB", "toB", "lineAt", "map", "filterFrom", "filterTo", "filter", "provide", "field", "EditorView", "decorations", "blockstore", "instances", "space", "syntaxTree", "iterate", "enter", "node", "name", "urlNode", "getChild", "hide", "readOnly", "wnfsUrl", "sliceDoc", "startsWith", "path", "getPathFromUrl", "spaceId", "id", "blobUrlPromise", "directory", "forest", "loadWnfs", "getBlobUrl", "join", "push", "replace", "block", "widget", "WnfsImageWidget", "range", "createImg", "view", "setAttribute", "focusField", "onload", "classList", "WidgetType", "_wnfsUrl", "_url", "eq", "other", "toDOM", "className", "loader", "loaderAdded", "timeout", "setTimeout", "root", "createRoot", "render", "ThemeProvider", "tx", "defaultTx", "Status", "indeterminate", "appendChild", "then", "clearTimeout", "removeChild", "context", "contributes", "MarkdownCapabilities", "Extensions", "document", "blockstore", "getCapability", "WnfsCapabilities", "Blockstore", "instances", "Instances", "space", "getSpace", "image"]
7
- }
@@ -1,88 +0,0 @@
1
- import {
2
- FileType,
3
- WnfsAction
4
- } from "./chunk-GVBV2QWA.mjs";
5
- import {
6
- WNFS_PLUGIN
7
- } from "./chunk-VDDGZWAY.mjs";
8
-
9
- // src/capabilities/react-surface.tsx
10
- import React2, { useCallback as useCallback2 } from "react";
11
- import { contributes, Capabilities, createSurface } from "@dxos/app-framework";
12
- import { Obj } from "@dxos/echo";
13
- import { findAnnotation as findAnnotation2 } from "@dxos/effect";
14
-
15
- // src/components/index.ts
16
- import { lazy } from "react";
17
-
18
- // src/components/FileInput.tsx
19
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
20
- import React, { useCallback } from "react";
21
- import { useDropzone } from "react-dropzone";
22
- import { findAnnotation } from "@dxos/effect";
23
- import { useTranslation } from "@dxos/react-ui";
24
- import { mx } from "@dxos/react-ui-theme";
25
- var FileInput = ({ schema, onChange }) => {
26
- var _effect = _useSignals();
27
- try {
28
- const { t } = useTranslation(WNFS_PLUGIN);
29
- const accept = findAnnotation(schema.ast, WnfsAction.UploadAnnotationId);
30
- const onDropAccepted = useCallback((files) => onChange?.(files[0]), [
31
- onChange
32
- ]);
33
- const { acceptedFiles, getRootProps, getInputProps, isFocused, isDragAccept, isDragReject } = useDropzone({
34
- multiple: false,
35
- accept,
36
- onDropAccepted
37
- });
38
- return /* @__PURE__ */ React.createElement("div", {
39
- ...getRootProps(),
40
- className: mx("flex flex-col items-center p-8 border border-separator", isFocused && "focus-ring", isDragAccept && "bg-attention", isDragReject && "border-error")
41
- }, /* @__PURE__ */ React.createElement("input", getInputProps()), acceptedFiles[0] ? /* @__PURE__ */ React.createElement("p", null, acceptedFiles[0].name) : /* @__PURE__ */ React.createElement("p", null, t("file input placeholder")));
42
- } finally {
43
- _effect.f();
44
- }
45
- };
46
-
47
- // src/components/index.ts
48
- var FileContainer = lazy(() => import("./FileContainer-Q4GUPBVD.mjs"));
49
-
50
- // src/capabilities/react-surface.tsx
51
- var react_surface_default = () => contributes(Capabilities.ReactSurface, [
52
- createSurface({
53
- id: `${WNFS_PLUGIN}/article`,
54
- role: [
55
- "article",
56
- "section",
57
- "slide"
58
- ],
59
- filter: (data) => Obj.instanceOf(FileType, data.subject),
60
- component: ({ data, role }) => /* @__PURE__ */ React2.createElement(FileContainer, {
61
- role,
62
- file: data.subject
63
- })
64
- }),
65
- createSurface({
66
- id: `${WNFS_PLUGIN}/create-form`,
67
- role: "form-input",
68
- filter: (data) => {
69
- const annotation = findAnnotation2(data.schema.ast, WnfsAction.UploadAnnotationId);
70
- return !!annotation;
71
- },
72
- component: ({ data: { prop, schema }, ...props }) => {
73
- const inputProps = props;
74
- const handleChange = useCallback2((file) => inputProps.onValueChange?.("object", file), [
75
- prop,
76
- inputProps.onValueChange
77
- ]);
78
- return /* @__PURE__ */ React2.createElement(FileInput, {
79
- schema,
80
- onChange: handleChange
81
- });
82
- }
83
- })
84
- ]);
85
- export {
86
- react_surface_default as default
87
- };
88
- //# sourceMappingURL=react-surface-XAHVMWIH.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/index.ts", "../../../src/components/FileInput.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Schema } from 'effect';\nimport React, { useCallback } from 'react';\n\nimport { contributes, Capabilities, createSurface } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\nimport { findAnnotation } from '@dxos/effect';\nimport { type InputProps } from '@dxos/react-ui-form';\n\nimport { FileContainer, FileInput } from '../components';\nimport { WNFS_PLUGIN } from '../meta';\nimport { FileType, WnfsAction } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${WNFS_PLUGIN}/article`,\n role: ['article', 'section', 'slide'],\n filter: (data): data is { subject: FileType } => Obj.instanceOf(FileType, data.subject),\n component: ({ data, role }) => <FileContainer role={role} file={data.subject} />,\n }),\n createSurface({\n id: `${WNFS_PLUGIN}/create-form`,\n role: 'form-input',\n filter: (data): data is { prop: string; schema: Schema.Schema.Any } => {\n const annotation = findAnnotation<boolean>(\n (data.schema as Schema.Schema.All).ast,\n WnfsAction.UploadAnnotationId,\n );\n return !!annotation;\n },\n component: ({ data: { prop, schema }, ...props }) => {\n const inputProps = props as unknown as InputProps;\n const handleChange = useCallback(\n (file: File) => inputProps.onValueChange?.('object', file),\n [prop, inputProps.onValueChange],\n );\n\n return <FileInput schema={schema} onChange={handleChange} />;\n },\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const FileContainer = lazy(() => import('./FileContainer'));\n\nexport * from './FileInput';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Schema } from 'effect';\nimport React, { useCallback } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { findAnnotation } from '@dxos/effect';\nimport { useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { WNFS_PLUGIN } from '../meta';\nimport { WnfsAction } from '../types';\n\nexport type FileInputProps = {\n schema: Schema.Schema.Any;\n onChange: (file: File) => void;\n};\n\nexport const FileInput = ({ schema, onChange }: FileInputProps) => {\n const { t } = useTranslation(WNFS_PLUGIN);\n const accept = findAnnotation<Record<string, string[]>>(schema.ast, WnfsAction.UploadAnnotationId);\n\n const onDropAccepted = useCallback((files: File[]) => onChange?.(files[0]), [onChange]);\n\n const { acceptedFiles, getRootProps, getInputProps, isFocused, isDragAccept, isDragReject } = useDropzone({\n multiple: false,\n accept,\n onDropAccepted,\n });\n\n return (\n <div\n {...getRootProps()}\n className={mx(\n 'flex flex-col items-center p-8 border border-separator',\n isFocused && 'focus-ring',\n isDragAccept && 'bg-attention',\n isDragReject && 'border-error',\n )}\n >\n <input {...getInputProps()} />\n {acceptedFiles[0] ? <p>{acceptedFiles[0].name}</p> : <p>{t('file input placeholder')}</p>}\n </div>\n );\n};\n"],
5
- "mappings": ";;;;;;;;;AAKA,OAAOA,UAASC,eAAAA,oBAAmB;AAEnC,SAASC,aAAaC,cAAcC,qBAAqB;AACzD,SAASC,WAAW;AACpB,SAASC,kBAAAA,uBAAsB;;;ACL/B,SAASC,YAAY;;;;ACCrB,OAAOC,SAASC,mBAAmB;AACnC,SAASC,mBAAmB;AAE5B,SAASC,sBAAsB;AAC/B,SAASC,sBAAsB;AAC/B,SAASC,UAAU;AAUZ,IAAMC,YAAY,CAAC,EAAEC,QAAQC,SAAQ,MAAkB;;;AAC5D,UAAM,EAAEC,EAAC,IAAKC,eAAeC,WAAAA;AAC7B,UAAMC,SAASC,eAAyCN,OAAOO,KAAKC,WAAWC,kBAAkB;AAEjG,UAAMC,iBAAiBC,YAAY,CAACC,UAAkBX,WAAWW,MAAM,CAAA,CAAE,GAAG;MAACX;KAAS;AAEtF,UAAM,EAAEY,eAAeC,cAAcC,eAAeC,WAAWC,cAAcC,aAAY,IAAKC,YAAY;MACxGC,UAAU;MACVf;MACAK;IACF,CAAA;AAEA,WACE,sBAAA,cAACW,OAAAA;MACE,GAAGP,aAAAA;MACJQ,WAAWC,GACT,0DACAP,aAAa,cACbC,gBAAgB,gBAChBC,gBAAgB,cAAA;OAGlB,sBAAA,cAACM,SAAUT,cAAAA,CAAAA,GACVF,cAAc,CAAA,IAAK,sBAAA,cAACY,KAAAA,MAAGZ,cAAc,CAAA,EAAGa,IAAI,IAAQ,sBAAA,cAACD,KAAAA,MAAGvB,EAAE,wBAAA,CAAA,CAAA;;;;AAGjE;;;ADxCO,IAAMyB,gBAAgBC,KAAK,MAAM,OAAO,8BAAA,CAAA;;;ADU/C,IAAA,wBAAe,MACbC,YAAYC,aAAaC,cAAc;EACrCC,cAAc;IACZC,IAAI,GAAGC,WAAAA;IACPC,MAAM;MAAC;MAAW;MAAW;;IAC7BC,QAAQ,CAACC,SAAwCC,IAAIC,WAAWC,UAAUH,KAAKI,OAAO;IACtFC,WAAW,CAAC,EAAEL,MAAMF,KAAI,MAAO,gBAAAQ,OAAA,cAACC,eAAAA;MAAcT;MAAYU,MAAMR,KAAKI;;EACvE,CAAA;EACAT,cAAc;IACZC,IAAI,GAAGC,WAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SAAAA;AACP,YAAMS,aAAaC,gBAChBV,KAAKW,OAA6BC,KACnCC,WAAWC,kBAAkB;AAE/B,aAAO,CAAC,CAACL;IACX;IACAJ,WAAW,CAAC,EAAEL,MAAM,EAAEe,MAAMJ,OAAM,GAAI,GAAGK,MAAAA,MAAO;AAC9C,YAAMC,aAAaD;AACnB,YAAME,eAAeC,aACnB,CAACX,SAAeS,WAAWG,gBAAgB,UAAUZ,IAAAA,GACrD;QAACO;QAAME,WAAWG;OAAc;AAGlC,aAAO,gBAAAd,OAAA,cAACe,WAAAA;QAAUV;QAAgBW,UAAUJ;;IAC9C;EACF,CAAA;CACD;",
6
- "names": ["React", "useCallback", "contributes", "Capabilities", "createSurface", "Obj", "findAnnotation", "lazy", "React", "useCallback", "useDropzone", "findAnnotation", "useTranslation", "mx", "FileInput", "schema", "onChange", "t", "useTranslation", "WNFS_PLUGIN", "accept", "findAnnotation", "ast", "WnfsAction", "UploadAnnotationId", "onDropAccepted", "useCallback", "files", "acceptedFiles", "getRootProps", "getInputProps", "isFocused", "isDragAccept", "isDragReject", "useDropzone", "multiple", "div", "className", "mx", "input", "p", "name", "FileContainer", "lazy", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "WNFS_PLUGIN", "role", "filter", "data", "Obj", "instanceOf", "FileType", "subject", "component", "React", "FileContainer", "file", "annotation", "findAnnotation", "schema", "ast", "WnfsAction", "UploadAnnotationId", "prop", "props", "inputProps", "handleChange", "useCallback", "onValueChange", "FileInput", "onChange"]
7
- }
@@ -1,108 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import "./chunk-DWYM7FD7.mjs";
3
- import {
4
- filePath,
5
- getBlobUrl,
6
- loadWnfs,
7
- wnfsUrl
8
- } from "./chunk-CGW32EZB.mjs";
9
- import {
10
- WnfsCapabilities
11
- } from "./chunk-YTWL64Z6.mjs";
12
- import "./chunk-47QYKNA6.mjs";
13
-
14
- // src/components/FileContainer.tsx
15
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
16
- import React2, { useEffect, useState } from "react";
17
- import { useCapability } from "@dxos/app-framework";
18
- import { invariant } from "@dxos/invariant";
19
- import { getSpace } from "@dxos/react-client/echo";
20
- import { StackItem } from "@dxos/react-ui-stack";
21
-
22
- // src/components/FilePreview.tsx
23
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
24
- import React from "react";
25
- import { mx } from "@dxos/react-ui-theme";
26
- var FilePreview = ({ type, url, classNames }) => {
27
- var _effect = _useSignals();
28
- try {
29
- if (type.startsWith("image/")) {
30
- return /* @__PURE__ */ React.createElement("img", {
31
- className: mx("w-full h-full object-contain", classNames),
32
- src: url
33
- });
34
- } else if (type.startsWith("video/")) {
35
- return /* @__PURE__ */ React.createElement("video", {
36
- className: mx("w-full h-full object-contain", classNames),
37
- src: url,
38
- controls: true
39
- });
40
- } else {
41
- return /* @__PURE__ */ React.createElement("iframe", {
42
- className: mx("w-full h-full overflow-auto", classNames),
43
- src: url
44
- });
45
- }
46
- } finally {
47
- _effect.f();
48
- }
49
- };
50
-
51
- // src/components/FileContainer.tsx
52
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-wnfs/src/components/FileContainer.tsx";
53
- var FileContainer = ({ role, file }) => {
54
- var _effect = _useSignals2();
55
- try {
56
- const blockstore = useCapability(WnfsCapabilities.Blockstore);
57
- const instances = useCapability(WnfsCapabilities.Instances);
58
- const [blobUrl, setBlobUrl] = useState();
59
- useEffect(() => {
60
- const timeout = setTimeout(async () => {
61
- const space = getSpace(file);
62
- invariant(space, void 0, {
63
- F: __dxlog_file,
64
- L: 30,
65
- S: void 0,
66
- A: [
67
- "space",
68
- ""
69
- ]
70
- });
71
- const { directory, forest } = await loadWnfs({
72
- blockstore,
73
- instances,
74
- space
75
- });
76
- const path = filePath(file.cid.toString(), space);
77
- const url = await getBlobUrl({
78
- wnfsUrl: wnfsUrl(path),
79
- blockstore,
80
- directory,
81
- forest,
82
- type: file.type
83
- });
84
- setBlobUrl(url);
85
- });
86
- return () => clearTimeout(timeout);
87
- }, [
88
- file
89
- ]);
90
- if (!blobUrl) {
91
- return null;
92
- }
93
- return /* @__PURE__ */ React2.createElement(StackItem.Content, {
94
- role
95
- }, /* @__PURE__ */ React2.createElement(FilePreview, {
96
- type: file.type,
97
- url: blobUrl
98
- }));
99
- } finally {
100
- _effect.f();
101
- }
102
- };
103
- var FileContainer_default = FileContainer;
104
- export {
105
- FileContainer,
106
- FileContainer_default as default
107
- };
108
- //# sourceMappingURL=FileContainer-22IPNDDA.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/FileContainer.tsx", "../../../src/components/FilePreview.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useEffect, useState } from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { FilePreview } from './FilePreview';\nimport { WnfsCapabilities } from '../capabilities';\nimport { filePath, getBlobUrl, loadWnfs, wnfsUrl } from '../helpers';\nimport { type FileType } from '../types';\n\nexport type FileContainerProps = {\n role: string;\n file: FileType;\n};\n\nexport const FileContainer = ({ role, file }: FileContainerProps) => {\n const blockstore = useCapability(WnfsCapabilities.Blockstore);\n const instances = useCapability(WnfsCapabilities.Instances);\n const [blobUrl, setBlobUrl] = useState<string>();\n\n useEffect(() => {\n const timeout = setTimeout(async () => {\n const space = getSpace(file);\n invariant(space);\n const { directory, forest } = await loadWnfs({ blockstore, instances, space });\n const path = filePath(file.cid.toString(), space);\n const url = await getBlobUrl({ wnfsUrl: wnfsUrl(path), blockstore, directory, forest, type: file.type });\n setBlobUrl(url);\n });\n\n return () => clearTimeout(timeout);\n }, [file]);\n\n if (!blobUrl) {\n return null;\n }\n\n return (\n <StackItem.Content role={role}>\n <FilePreview type={file.type} url={blobUrl} />\n </StackItem.Content>\n );\n};\n\nexport default FileContainer;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type FilePreviewProps = ThemedClassName<{ type: string; url: string }>;\n\n/**\n * File/content preview iframe.\n */\nexport const FilePreview = ({ type, url, classNames }: FilePreviewProps) => {\n if (type.startsWith('image/')) {\n return <img className={mx('w-full h-full object-contain', classNames)} src={url} />;\n } else if (type.startsWith('video/')) {\n return <video className={mx('w-full h-full object-contain', classNames)} src={url} controls />;\n } else {\n return <iframe className={mx('w-full h-full overflow-auto', classNames)} src={url} />;\n }\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;AAIA,OAAOA,UAASC,WAAWC,gBAAgB;AAE3C,SAASC,qBAAqB;AAC9B,SAASC,iBAAiB;AAC1B,SAASC,gBAAgB;AACzB,SAASC,iBAAiB;;;;ACL1B,OAAOC,WAAW;AAGlB,SAASC,UAAU;AAOZ,IAAMC,cAAc,CAAC,EAAEC,MAAMC,KAAKC,WAAU,MAAoB;;;AACrE,QAAIF,KAAKG,WAAW,QAAA,GAAW;AAC7B,aAAO,sBAAA,cAACC,OAAAA;QAAIC,WAAWC,GAAG,gCAAgCJ,UAAAA;QAAaK,KAAKN;;IAC9E,WAAWD,KAAKG,WAAW,QAAA,GAAW;AACpC,aAAO,sBAAA,cAACK,SAAAA;QAAMH,WAAWC,GAAG,gCAAgCJ,UAAAA;QAAaK,KAAKN;QAAKQ,UAAAA;;IACrF,OAAO;AACL,aAAO,sBAAA,cAACC,UAAAA;QAAOL,WAAWC,GAAG,+BAA+BJ,UAAAA;QAAaK,KAAKN;;IAChF;;;;AACF;;;;ADDO,IAAMU,gBAAgB,CAAC,EAAEC,MAAMC,KAAI,MAAsB;;;AAC9D,UAAMC,aAAaC,cAAcC,iBAAiBC,UAAU;AAC5D,UAAMC,YAAYH,cAAcC,iBAAiBG,SAAS;AAC1D,UAAM,CAACC,SAASC,UAAAA,IAAcC,SAAAA;AAE9BC,cAAU,MAAA;AACR,YAAMC,UAAUC,WAAW,YAAA;AACzB,cAAMC,QAAQC,SAASd,IAAAA;AACvBe,kBAAUF,OAAAA,QAAAA;;;;;;;;;AACV,cAAM,EAAEG,WAAWC,OAAM,IAAK,MAAMC,SAAS;UAAEjB;UAAYI;UAAWQ;QAAM,CAAA;AAC5E,cAAMM,OAAOC,SAASpB,KAAKqB,IAAIC,SAAQ,GAAIT,KAAAA;AAC3C,cAAMU,MAAM,MAAMC,WAAW;UAAEC,SAASA,QAAQN,IAAAA;UAAOlB;UAAYe;UAAWC;UAAQS,MAAM1B,KAAK0B;QAAK,CAAA;AACtGlB,mBAAWe,GAAAA;MACb,CAAA;AAEA,aAAO,MAAMI,aAAahB,OAAAA;IAC5B,GAAG;MAACX;KAAK;AAET,QAAI,CAACO,SAAS;AACZ,aAAO;IACT;AAEA,WACE,gBAAAqB,OAAA,cAACC,UAAUC,SAAO;MAAC/B;OACjB,gBAAA6B,OAAA,cAACG,aAAAA;MAAYL,MAAM1B,KAAK0B;MAAMH,KAAKhB;;;;;AAGzC;AAEA,IAAA,wBAAeT;",
6
- "names": ["React", "useEffect", "useState", "useCapability", "invariant", "getSpace", "StackItem", "React", "mx", "FilePreview", "type", "url", "classNames", "startsWith", "img", "className", "mx", "src", "video", "controls", "iframe", "FileContainer", "role", "file", "blockstore", "useCapability", "WnfsCapabilities", "Blockstore", "instances", "Instances", "blobUrl", "setBlobUrl", "useState", "useEffect", "timeout", "setTimeout", "space", "getSpace", "invariant", "directory", "forest", "loadWnfs", "path", "filePath", "cid", "toString", "url", "getBlobUrl", "wnfsUrl", "type", "clearTimeout", "React", "StackItem", "Content", "FilePreview"]
7
- }
@@ -1,192 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import {
3
- storeName
4
- } from "./chunk-CGW32EZB.mjs";
5
- import {
6
- WnfsCapabilities
7
- } from "./chunk-YTWL64Z6.mjs";
8
- import "./chunk-47QYKNA6.mjs";
9
-
10
- // src/capabilities/blockstore.ts
11
- import { contributes } from "@dxos/app-framework";
12
- import { ClientCapabilities } from "@dxos/plugin-client";
13
-
14
- // src/blockstore.ts
15
- import { CarWriter } from "@ipld/car";
16
- import { BaseBlockstore } from "blockstore-core";
17
- import { IDBBlockstore } from "blockstore-idb";
18
- import debounce from "debounce";
19
- import * as IDB from "idb-keyval";
20
- import all from "it-all";
21
- import { CID } from "multiformats";
22
- import * as Uint8Arrays from "uint8arrays";
23
- var create = (apiHost) => {
24
- return new MixedBlockstore(apiHost);
25
- };
26
- var MixedBlockstore = class extends BaseBlockstore {
27
- constructor(apiHost) {
28
- super();
29
- // QUEUE
30
- this.queueCacheName = `${storeName()}/state/queue`;
31
- this.#apiHost = apiHost ? apiHost.replace(/\/?$/, "") : void 0;
32
- this.#localStore = new IDBBlockstore(storeName());
33
- this.#isConnected = navigator.onLine;
34
- this.#queue = [];
35
- this.#flushQueue = debounce(this.#flushQueueInt, 5e3);
36
- }
37
- #apiHost;
38
- #localStore;
39
- #isConnected;
40
- #flushQueue;
41
- #queue;
42
- async open() {
43
- await this.#localStore.open();
44
- await this.#restoreQueue();
45
- window.addEventListener("offline", async () => {
46
- this.#isConnected = false;
47
- });
48
- window.addEventListener("online", async () => {
49
- this.#isConnected = true;
50
- this.#flushQueue();
51
- });
52
- }
53
- url(apiHost, cid) {
54
- const path = cid ? cid.toString() : "";
55
- return `${apiHost}/api/file${path.length ? "/" + path : ""}`;
56
- }
57
- // BLOCKSTORE IMPLEMENTATION
58
- async delete(key) {
59
- await this.#localStore.delete(key);
60
- if (this.#isConnected && this.#apiHost) {
61
- await fetch(this.url(this.#apiHost, key), {
62
- method: "DELETE"
63
- });
64
- }
65
- }
66
- async get(key) {
67
- if (await this.#localStore.has(key)) {
68
- return await this.#localStore.get(key);
69
- }
70
- if (this.#isConnected && this.#apiHost) {
71
- const block = await fetch(this.url(this.#apiHost, key), {
72
- method: "GET"
73
- }).then((r) => r.arrayBuffer()).then((r) => new Uint8Array(r));
74
- await this.#localStore.put(key, block);
75
- return block;
76
- }
77
- return await this.#localStore.get(key);
78
- }
79
- async has(key) {
80
- if (await this.#localStore.has(key)) {
81
- return true;
82
- }
83
- if (this.#isConnected && this.#apiHost) {
84
- return await fetch(this.url(this.#apiHost, key), {
85
- method: "HEAD"
86
- }).then((r) => r.ok);
87
- }
88
- return false;
89
- }
90
- async put(key, val) {
91
- await this.#localStore.put(key, val);
92
- await this.#addToQueue(key);
93
- this.#flushQueue();
94
- return key;
95
- }
96
- async destroy() {
97
- await this.#localStore.destroy();
98
- }
99
- // REMOTE
100
- async putRemote(key, val) {
101
- if (this.#apiHost) {
102
- await fetch(this.url(this.#apiHost, key), {
103
- method: "POST",
104
- body: val
105
- });
106
- }
107
- }
108
- async putCarRemote(car) {
109
- if (this.#apiHost) {
110
- await fetch(this.url(this.#apiHost), {
111
- method: "POST",
112
- headers: {
113
- "Content-Type": "application/vnd.ipld.car"
114
- },
115
- body: car
116
- });
117
- }
118
- }
119
- async #addToQueue(key) {
120
- await this.#saveQueue([
121
- ...this.#queue,
122
- key.toString()
123
- ]);
124
- }
125
- async #flushQueueInt() {
126
- if (!this.#isConnected || !this.#apiHost) {
127
- return;
128
- }
129
- const keys = [
130
- ...this.#queue
131
- ];
132
- if (keys.length === 0) {
133
- return;
134
- }
135
- const blocks = await Promise.all(keys.map(async (key) => {
136
- const cid = CID.parse(key);
137
- const bytes = await this.#localStore.get(cid);
138
- return {
139
- cid,
140
- bytes
141
- };
142
- }));
143
- const car = await this.#createCar(blocks);
144
- await this.putCarRemote(car);
145
- const queue = [
146
- ...this.#queue
147
- ].filter((k) => {
148
- if (keys.includes(k)) {
149
- return false;
150
- }
151
- return true;
152
- });
153
- await this.#saveQueue(queue);
154
- }
155
- async #restoreQueue() {
156
- const fromCache = await IDB.get(this.queueCacheName);
157
- if (fromCache && Array.isArray(fromCache)) {
158
- this.#queue = fromCache;
159
- this.#flushQueue();
160
- }
161
- }
162
- async #saveQueue(items) {
163
- const arr = [
164
- ...items
165
- ];
166
- this.#queue = arr;
167
- await IDB.set(this.queueCacheName, arr);
168
- }
169
- // 🛠️
170
- async #createCar(blocks) {
171
- const { writer, out } = CarWriter.create();
172
- const outPromise = all(out);
173
- await Promise.all(blocks.map((block) => {
174
- return writer.put(block);
175
- }));
176
- await writer.close();
177
- return Uint8Arrays.concat(await outPromise);
178
- }
179
- };
180
-
181
- // src/capabilities/blockstore.ts
182
- var blockstore_default = async (context) => {
183
- const client = context.getCapability(ClientCapabilities.Client);
184
- const apiHost = client.config.values.runtime?.services?.edge?.url || "http://localhost:8787";
185
- const blockstore = create(apiHost);
186
- await blockstore.open();
187
- return contributes(WnfsCapabilities.Blockstore, blockstore);
188
- };
189
- export {
190
- blockstore_default as default
191
- };
192
- //# sourceMappingURL=blockstore-7KQTFHK5.mjs.map