@dxos/plugin-wnfs 0.8.4-main.f5c0578 → 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 (149) 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-D6VTEQIE.mjs → chunk-N6Y4QPNF.mjs} +23 -32
  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 -93
  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 +1 -1
  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 -10
  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 +62 -40
  83. package/src/WnfsPlugin.tsx +65 -83
  84. package/src/blockstore.ts +1 -1
  85. package/src/capabilities/blockstore.ts +15 -11
  86. package/src/capabilities/file-uploader.ts +25 -15
  87. package/src/capabilities/index.ts +10 -8
  88. package/src/capabilities/markdown.ts +22 -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 +21 -19
  100. package/src/extensions/image.tsx +9 -8
  101. package/src/helpers/load.ts +12 -7
  102. package/src/helpers/upload.ts +5 -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 -10
  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 -20
  115. package/dist/lib/browser/FileContainer-LTKYOYSO.mjs +0 -105
  116. package/dist/lib/browser/FileContainer-LTKYOYSO.mjs.map +0 -7
  117. package/dist/lib/browser/blockstore-PSYZCC2O.mjs +0 -191
  118. package/dist/lib/browser/blockstore-PSYZCC2O.mjs.map +0 -7
  119. package/dist/lib/browser/chunk-CW4BENRQ.mjs +0 -64
  120. package/dist/lib/browser/chunk-CW4BENRQ.mjs.map +0 -7
  121. package/dist/lib/browser/chunk-D6VTEQIE.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-KZANQHJY.mjs +0 -16
  123. package/dist/lib/browser/chunk-KZANQHJY.mjs.map +0 -7
  124. package/dist/lib/browser/chunk-VDDGZWAY.mjs +0 -15
  125. package/dist/lib/browser/chunk-VDDGZWAY.mjs.map +0 -7
  126. package/dist/lib/browser/chunk-ZMH2OULB.mjs +0 -16
  127. package/dist/lib/browser/chunk-ZMH2OULB.mjs.map +0 -7
  128. package/dist/lib/browser/file-uploader-YRZPRETS.mjs +0 -29
  129. package/dist/lib/browser/file-uploader-YRZPRETS.mjs.map +0 -7
  130. package/dist/lib/browser/intent-resolver-CKGJNE6P.mjs +0 -49
  131. package/dist/lib/browser/intent-resolver-CKGJNE6P.mjs.map +0 -7
  132. package/dist/lib/browser/markdown-RAGCVYGE.mjs +0 -198
  133. package/dist/lib/browser/markdown-RAGCVYGE.mjs.map +0 -7
  134. package/dist/lib/browser/react-surface-HGWZDLP2.mjs +0 -88
  135. package/dist/lib/browser/react-surface-HGWZDLP2.mjs.map +0 -7
  136. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  137. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  138. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  139. package/dist/types/src/components/FileContainer.d.ts +0 -9
  140. package/dist/types/src/components/FileContainer.d.ts.map +0 -1
  141. package/dist/types/src/components/FileInput.d.ts.map +0 -1
  142. package/dist/types/src/components/FilePreview.d.ts +0 -11
  143. package/dist/types/src/components/FilePreview.d.ts.map +0 -1
  144. package/dist/types/src/types/file.d.ts +0 -16
  145. package/dist/types/src/types/file.d.ts.map +0 -1
  146. package/src/capabilities/intent-resolver.ts +0 -33
  147. package/src/components/FileContainer.tsx +0 -52
  148. package/src/components/FilePreview.tsx +0 -23
  149. package/src/types/file.ts +0 -17
@@ -1,198 +0,0 @@
1
- import {
2
- getBlobUrl,
3
- getPathFromUrl,
4
- loadWnfs
5
- } from "./chunk-D6VTEQIE.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
- _wnfsUrl;
141
- _url;
142
- constructor(_wnfsUrl, _url) {
143
- super(), this._wnfsUrl = _wnfsUrl, this._url = _url;
144
- }
145
- eq(other) {
146
- return this._wnfsUrl === other._wnfsUrl;
147
- }
148
- toDOM(view) {
149
- if (typeof this._url === "string") {
150
- return createImg(view, this._url);
151
- }
152
- const widget = document.createElement("div");
153
- widget.className = "cm-image-wrapper";
154
- const loader = document.createElement("div");
155
- loader.className = "mx-auto transition-opacity";
156
- let loaderAdded = false;
157
- const timeout = setTimeout(() => {
158
- const root = createRoot(loader);
159
- root.render(/* @__PURE__ */ React.createElement(ThemeProvider, {
160
- tx: defaultTx
161
- }, /* @__PURE__ */ React.createElement(Status, {
162
- indeterminate: true
163
- })));
164
- widget.appendChild(loader);
165
- loaderAdded = true;
166
- }, WAIT_UNTIL_LOADER);
167
- void this._url.then((url) => {
168
- clearTimeout(timeout);
169
- const img = createImg(view, url);
170
- loaderAdded && widget.removeChild(loader);
171
- widget.appendChild(img);
172
- });
173
- return widget;
174
- }
175
- };
176
-
177
- // src/capabilities/markdown.ts
178
- var markdown_default = (context) => contributes(MarkdownCapabilities.Extensions, [
179
- ({ document: document2 }) => {
180
- const blockstore = context.getCapability(WnfsCapabilities.Blockstore);
181
- const instances = context.getCapability(WnfsCapabilities.Instances);
182
- if (document2) {
183
- const space = getSpace(document2);
184
- return space ? [
185
- image({
186
- blockstore,
187
- instances,
188
- space
189
- })
190
- ] : [];
191
- }
192
- return [];
193
- }
194
- ]);
195
- export {
196
- markdown_default as default
197
- };
198
- //# sourceMappingURL=markdown-RAGCVYGE.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 { type PluginContext, contributes } from '@dxos/app-framework';\nimport { MarkdownCapabilities } from '@dxos/plugin-markdown';\nimport { getSpace } from '@dxos/react-client/echo';\n\nimport { image } from '../extensions';\n\nimport { WnfsCapabilities } from './capabilities';\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, type Range, StateField } 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-CW4BENRQ.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 { Capabilities, contributes, 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-LTKYOYSO.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-HGWZDLP2.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 { Capabilities, contributes, 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,cAAcC,aAAaC,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", "Capabilities", "contributes", "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 +0,0 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/capabilities.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;AAGjE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,yBAAiB,gBAAgB,CAAC;IACzB,MAAM,UAAU,wFAAuE,CAAC;IAE/F,KAAY,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IACzF,MAAM,SAAS,uDAAqE,CAAC;CAC7F"}
@@ -1,4 +0,0 @@
1
- import { Capabilities, type PluginContext } from '@dxos/app-framework';
2
- declare const _default: (context: PluginContext) => import("@dxos/app-framework").Capability<Capabilities.IntentResolver>;
3
- export default _default;
4
- //# sourceMappingURL=intent-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intent-resolver.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/intent-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAA+B,MAAM,qBAAqB,CAAC;yBAQpF,SAAS,aAAa;AAAtC,wBAoBK"}
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- import { type FileType } from '../types';
3
- export type FileContainerProps = {
4
- role: string;
5
- file: FileType;
6
- };
7
- export declare const FileContainer: ({ file }: FileContainerProps) => React.JSX.Element | null;
8
- export default FileContainer;
9
- //# sourceMappingURL=FileContainer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/FileContainer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA8B,MAAM,OAAO,CAAC;AASnD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,UAAU,kBAAkB,6BA2BzD,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileInput.d.ts","sourceRoot":"","sources":["../../../../src/components/FileInput.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAsB,MAAM,OAAO,CAAC;AAU3C,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,sBAAsB,cAAc,sBA0B7D,CAAC"}
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- import { type ThemedClassName } from '@dxos/react-ui';
3
- export type FilePreviewProps = ThemedClassName<{
4
- type: string;
5
- url: string;
6
- }>;
7
- /**
8
- * File/content preview iframe.
9
- */
10
- export declare const FilePreview: ({ type, url, classNames }: FilePreviewProps) => React.JSX.Element;
11
- //# sourceMappingURL=FilePreview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FilePreview.d.ts","sourceRoot":"","sources":["../../../../src/components/FilePreview.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,2BAA2B,gBAAgB,sBAQtE,CAAC"}
@@ -1,16 +0,0 @@
1
- import { Schema } from 'effect';
2
- declare const FileType_base: import("@dxos/echo-schema").TypedObjectPrototype<import("@dxos/echo-schema").TypedObjectFields<{
3
- name: Schema.optional<typeof Schema.String>;
4
- type: typeof Schema.String;
5
- cid: typeof Schema.String;
6
- timestamp: Schema.optional<typeof Schema.String>;
7
- }, import("@dxos/echo-schema").TypedObjectOptions>, Schema.Struct.Encoded<{
8
- name: Schema.optional<typeof Schema.String>;
9
- type: typeof Schema.String;
10
- cid: typeof Schema.String;
11
- timestamp: Schema.optional<typeof Schema.String>;
12
- }>>;
13
- export declare class FileType extends FileType_base {
14
- }
15
- export {};
16
- //# sourceMappingURL=file.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../../../src/types/file.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;;;;;;;AAIhC,qBAAa,QAAS,SAAQ,aAQ5B;CAAG"}
@@ -1,33 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capabilities, type PluginContext, contributes, createResolver } from '@dxos/app-framework';
6
- import { Obj } from '@dxos/echo';
7
-
8
- import { upload } from '../helpers';
9
- import { FileType, WnfsAction } from '../types';
10
-
11
- import { WnfsCapabilities } from './capabilities';
12
-
13
- export default (context: PluginContext) =>
14
- contributes(Capabilities.IntentResolver, [
15
- // TODO(wittjosiah): Deleting the object doesn't delete the wnfs blob.
16
- // Consider ways to trigger blob deletion based on object deletion and/or adding file system manager.
17
- createResolver({
18
- intent: WnfsAction.Create,
19
- resolve: ({ name, type, cid }) => ({
20
- data: {
21
- object: Obj.make(FileType, { name, type, cid }),
22
- },
23
- }),
24
- }),
25
- createResolver({
26
- intent: WnfsAction.Upload,
27
- resolve: async ({ file, space }) => {
28
- const blockstore = context.getCapability(WnfsCapabilities.Blockstore);
29
- const info = await upload({ file, blockstore, space });
30
- return { data: info };
31
- },
32
- }),
33
- ]);
@@ -1,52 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import React, { useEffect, useState } from 'react';
6
-
7
- import { useCapability } from '@dxos/app-framework';
8
- import { invariant } from '@dxos/invariant';
9
- import { getSpace } from '@dxos/react-client/echo';
10
- import { StackItem } from '@dxos/react-ui-stack';
11
-
12
- import { WnfsCapabilities } from '../capabilities';
13
- import { filePath, getBlobUrl, loadWnfs, wnfsUrl } from '../helpers';
14
- import { type FileType } from '../types';
15
-
16
- import { FilePreview } from './FilePreview';
17
-
18
- export type FileContainerProps = {
19
- role: string;
20
- file: FileType;
21
- };
22
-
23
- export const FileContainer = ({ file }: FileContainerProps) => {
24
- const blockstore = useCapability(WnfsCapabilities.Blockstore);
25
- const instances = useCapability(WnfsCapabilities.Instances);
26
- const [blobUrl, setBlobUrl] = useState<string>();
27
-
28
- useEffect(() => {
29
- const timeout = setTimeout(async () => {
30
- const space = getSpace(file);
31
- invariant(space);
32
- const { directory, forest } = await loadWnfs({ blockstore, instances, space });
33
- const path = filePath(file.cid.toString(), space);
34
- const url = await getBlobUrl({ wnfsUrl: wnfsUrl(path), blockstore, directory, forest, type: file.type });
35
- setBlobUrl(url);
36
- });
37
-
38
- return () => clearTimeout(timeout);
39
- }, [file]);
40
-
41
- if (!blobUrl) {
42
- return null;
43
- }
44
-
45
- return (
46
- <StackItem.Content>
47
- <FilePreview type={file.type} url={blobUrl} />
48
- </StackItem.Content>
49
- );
50
- };
51
-
52
- export default FileContainer;
@@ -1,23 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import React from 'react';
6
-
7
- import { type ThemedClassName } from '@dxos/react-ui';
8
- import { mx } from '@dxos/react-ui-theme';
9
-
10
- export type FilePreviewProps = ThemedClassName<{ type: string; url: string }>;
11
-
12
- /**
13
- * File/content preview iframe.
14
- */
15
- export const FilePreview = ({ type, url, classNames }: FilePreviewProps) => {
16
- if (type.startsWith('image/')) {
17
- return <img className={mx('w-full h-full object-contain', classNames)} src={url} />;
18
- } else if (type.startsWith('video/')) {
19
- return <video className={mx('w-full h-full object-contain', classNames)} src={url} controls />;
20
- } else {
21
- return <iframe className={mx('w-full h-full overflow-auto', classNames)} src={url} />;
22
- }
23
- };
package/src/types/file.ts DELETED
@@ -1,17 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { Schema } from 'effect';
6
-
7
- import { TypedObject } from '@dxos/echo-schema';
8
-
9
- export class FileType extends TypedObject({
10
- typename: 'dxos.org/type/File',
11
- version: '0.1.0',
12
- })({
13
- name: Schema.optional(Schema.String),
14
- type: Schema.String,
15
- cid: Schema.String,
16
- timestamp: Schema.optional(Schema.String),
17
- }) {}