@dxos/plugin-wnfs 0.8.4-main.406dc2a → 0.8.4-main.43cb759274

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 (163) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +371 -0
  3. package/README.md +2 -2
  4. package/dist/lib/neutral/WnfsPlugin.mjs +51 -0
  5. package/dist/lib/neutral/WnfsPlugin.mjs.map +7 -0
  6. package/dist/lib/neutral/WnfsPlugin.node.mjs +12 -0
  7. package/dist/lib/neutral/WnfsPlugin.node.mjs.map +7 -0
  8. package/dist/lib/neutral/WnfsPlugin.workerd.mjs +12 -0
  9. package/dist/lib/neutral/WnfsPlugin.workerd.mjs.map +7 -0
  10. package/dist/lib/neutral/backend-4HPTHS33.mjs +47 -0
  11. package/dist/lib/neutral/backend-4HPTHS33.mjs.map +7 -0
  12. package/dist/lib/neutral/blockstore-U6SPNL2C.mjs +190 -0
  13. package/dist/lib/neutral/blockstore-U6SPNL2C.mjs.map +7 -0
  14. package/dist/lib/neutral/capabilities/index.mjs +13 -0
  15. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  16. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  17. package/dist/lib/neutral/chunk-KUQHRT52.mjs +39 -0
  18. package/dist/lib/neutral/chunk-KUQHRT52.mjs.map +7 -0
  19. package/dist/lib/{browser/chunk-D6VTEQIE.mjs → neutral/chunk-L33MOD23.mjs} +85 -25
  20. package/dist/lib/neutral/chunk-L33MOD23.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-QODCKFTY.mjs +19 -0
  22. package/dist/lib/neutral/chunk-QODCKFTY.mjs.map +7 -0
  23. package/dist/lib/neutral/helpers/index.mjs +26 -0
  24. package/dist/lib/neutral/helpers/index.mjs.map +7 -0
  25. package/dist/lib/neutral/index.mjs +36 -0
  26. package/dist/lib/neutral/index.mjs.map +7 -0
  27. package/dist/lib/neutral/meta.json +1 -0
  28. package/dist/lib/neutral/meta.mjs +8 -0
  29. package/dist/lib/neutral/meta.mjs.map +7 -0
  30. package/dist/lib/neutral/plugin.mjs +12 -0
  31. package/dist/lib/neutral/plugin.mjs.map +7 -0
  32. package/dist/lib/neutral/translations.mjs +17 -0
  33. package/dist/lib/neutral/translations.mjs.map +7 -0
  34. package/dist/lib/neutral/types/index.mjs +8 -0
  35. package/dist/lib/neutral/types/index.mjs.map +7 -0
  36. package/dist/lib/neutral/url-resolver-BIRH7WHL.mjs +47 -0
  37. package/dist/lib/neutral/url-resolver-BIRH7WHL.mjs.map +7 -0
  38. package/dist/types/src/WnfsPlugin.d.ts +3 -1
  39. package/dist/types/src/WnfsPlugin.d.ts.map +1 -1
  40. package/dist/types/src/WnfsPlugin.node.d.ts +4 -0
  41. package/dist/types/src/WnfsPlugin.node.d.ts.map +1 -0
  42. package/dist/types/src/WnfsPlugin.test.d.ts +2 -0
  43. package/dist/types/src/WnfsPlugin.test.d.ts.map +1 -0
  44. package/dist/types/src/WnfsPlugin.workerd.d.ts +4 -0
  45. package/dist/types/src/WnfsPlugin.workerd.d.ts.map +1 -0
  46. package/dist/types/src/annotations.d.ts +7 -0
  47. package/dist/types/src/annotations.d.ts.map +1 -0
  48. package/dist/types/src/blockstore.d.ts.map +1 -1
  49. package/dist/types/src/capabilities/backend.d.ts +7 -0
  50. package/dist/types/src/capabilities/backend.d.ts.map +1 -0
  51. package/dist/types/src/capabilities/blockstore.d.ts +3 -2
  52. package/dist/types/src/capabilities/blockstore.d.ts.map +1 -1
  53. package/dist/types/src/capabilities/index.d.ts +5 -6
  54. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  55. package/dist/types/src/capabilities/url-resolver.d.ts +7 -0
  56. package/dist/types/src/capabilities/url-resolver.d.ts.map +1 -0
  57. package/dist/types/src/helpers/common.d.ts.map +1 -1
  58. package/dist/types/src/helpers/load.d.ts +1 -1
  59. package/dist/types/src/helpers/load.d.ts.map +1 -1
  60. package/dist/types/src/helpers/upload.d.ts +1 -1
  61. package/dist/types/src/helpers/upload.d.ts.map +1 -1
  62. package/dist/types/src/helpers/wnfs-url.d.ts.map +1 -1
  63. package/dist/types/src/index.d.ts +3 -2
  64. package/dist/types/src/index.d.ts.map +1 -1
  65. package/dist/types/src/meta.d.ts +2 -2
  66. package/dist/types/src/meta.d.ts.map +1 -1
  67. package/dist/types/src/plugin.d.ts +3 -0
  68. package/dist/types/src/plugin.d.ts.map +1 -0
  69. package/dist/types/src/translations.d.ts +2 -12
  70. package/dist/types/src/translations.d.ts.map +1 -1
  71. package/dist/types/src/types/WnfsCapabilities.d.ts +11 -0
  72. package/dist/types/src/types/WnfsCapabilities.d.ts.map +1 -0
  73. package/dist/types/src/types/index.d.ts +1 -2
  74. package/dist/types/src/types/index.d.ts.map +1 -1
  75. package/dist/types/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +86 -50
  77. package/src/WnfsPlugin.node.ts +11 -0
  78. package/src/WnfsPlugin.test.ts +20 -0
  79. package/src/WnfsPlugin.tsx +32 -76
  80. package/src/WnfsPlugin.workerd.ts +11 -0
  81. package/src/annotations.ts +16 -0
  82. package/src/blockstore.ts +1 -1
  83. package/src/capabilities/backend.ts +43 -0
  84. package/src/capabilities/blockstore.ts +14 -10
  85. package/src/capabilities/index.ts +12 -7
  86. package/src/capabilities/url-resolver.ts +44 -0
  87. package/src/helpers/load.ts +37 -18
  88. package/src/helpers/upload.ts +14 -2
  89. package/src/index.ts +3 -2
  90. package/src/meta.ts +26 -5
  91. package/src/plugin.ts +9 -0
  92. package/src/translations.ts +2 -11
  93. package/src/types/WnfsCapabilities.ts +18 -0
  94. package/src/types/index.ts +1 -2
  95. package/src/vite-env.d.ts +10 -0
  96. package/dist/lib/browser/FileContainer-A4OJVMVS.mjs +0 -103
  97. package/dist/lib/browser/FileContainer-A4OJVMVS.mjs.map +0 -7
  98. package/dist/lib/browser/blockstore-HK4IYHJJ.mjs +0 -273
  99. package/dist/lib/browser/blockstore-HK4IYHJJ.mjs.map +0 -7
  100. package/dist/lib/browser/chunk-D6VTEQIE.mjs.map +0 -7
  101. package/dist/lib/browser/chunk-FYRZOKHG.mjs +0 -13
  102. package/dist/lib/browser/chunk-FYRZOKHG.mjs.map +0 -7
  103. package/dist/lib/browser/chunk-PAIK4SJ3.mjs +0 -16
  104. package/dist/lib/browser/chunk-PAIK4SJ3.mjs.map +0 -7
  105. package/dist/lib/browser/chunk-QQB5IBX7.mjs +0 -64
  106. package/dist/lib/browser/chunk-QQB5IBX7.mjs.map +0 -7
  107. package/dist/lib/browser/chunk-Y5JMTQ74.mjs +0 -16
  108. package/dist/lib/browser/chunk-Y5JMTQ74.mjs.map +0 -7
  109. package/dist/lib/browser/file-uploader-5S37ZZCW.mjs +0 -30
  110. package/dist/lib/browser/file-uploader-5S37ZZCW.mjs.map +0 -7
  111. package/dist/lib/browser/index.mjs +0 -116
  112. package/dist/lib/browser/index.mjs.map +0 -7
  113. package/dist/lib/browser/intent-resolver-3KMIEDBO.mjs +0 -49
  114. package/dist/lib/browser/intent-resolver-3KMIEDBO.mjs.map +0 -7
  115. package/dist/lib/browser/markdown-5XD3I2NQ.mjs +0 -209
  116. package/dist/lib/browser/markdown-5XD3I2NQ.mjs.map +0 -7
  117. package/dist/lib/browser/meta.json +0 -1
  118. package/dist/lib/browser/react-surface-5D7M3Y4W.mjs +0 -88
  119. package/dist/lib/browser/react-surface-5D7M3Y4W.mjs.map +0 -7
  120. package/dist/lib/browser/types/index.mjs +0 -10
  121. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  122. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  123. package/dist/types/src/capabilities/file-uploader.d.ts +0 -4
  124. package/dist/types/src/capabilities/file-uploader.d.ts.map +0 -1
  125. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  126. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  127. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  128. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  129. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  130. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  131. package/dist/types/src/components/FileContainer.d.ts +0 -9
  132. package/dist/types/src/components/FileContainer.d.ts.map +0 -1
  133. package/dist/types/src/components/FileInput.d.ts +0 -8
  134. package/dist/types/src/components/FileInput.d.ts.map +0 -1
  135. package/dist/types/src/components/FilePreview.d.ts +0 -11
  136. package/dist/types/src/components/FilePreview.d.ts.map +0 -1
  137. package/dist/types/src/components/index.d.ts +0 -3
  138. package/dist/types/src/components/index.d.ts.map +0 -1
  139. package/dist/types/src/extensions/image.d.ts +0 -14
  140. package/dist/types/src/extensions/image.d.ts.map +0 -1
  141. package/dist/types/src/extensions/image.stories.d.ts +0 -11
  142. package/dist/types/src/extensions/image.stories.d.ts.map +0 -1
  143. package/dist/types/src/extensions/index.d.ts +0 -2
  144. package/dist/types/src/extensions/index.d.ts.map +0 -1
  145. package/dist/types/src/types/file.d.ts +0 -16
  146. package/dist/types/src/types/file.d.ts.map +0 -1
  147. package/dist/types/src/types/types.d.ts +0 -51
  148. package/dist/types/src/types/types.d.ts.map +0 -1
  149. package/src/capabilities/capabilities.ts +0 -18
  150. package/src/capabilities/file-uploader.ts +0 -27
  151. package/src/capabilities/intent-resolver.ts +0 -33
  152. package/src/capabilities/markdown.ts +0 -26
  153. package/src/capabilities/react-surface.tsx +0 -45
  154. package/src/components/FileContainer.tsx +0 -49
  155. package/src/components/FileInput.tsx +0 -47
  156. package/src/components/FilePreview.tsx +0 -23
  157. package/src/components/index.ts +0 -9
  158. package/src/extensions/image.stories.tsx +0 -104
  159. package/src/extensions/image.tsx +0 -203
  160. package/src/extensions/index.ts +0 -5
  161. package/src/types/file.ts +0 -17
  162. package/src/types/types.ts +0 -41
  163. /package/dist/lib/{browser/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -1,64 +0,0 @@
1
- import {
2
- meta
3
- } from "./chunk-FYRZOKHG.mjs";
4
-
5
- // src/types/file.ts
6
- import * as Schema from "effect/Schema";
7
- import { TypedObject } from "@dxos/echo/internal";
8
- var FileType = class extends TypedObject({
9
- typename: "dxos.org/type/File",
10
- version: "0.1.0"
11
- })({
12
- name: Schema.optional(Schema.String),
13
- type: Schema.String,
14
- cid: Schema.String,
15
- timestamp: Schema.optional(Schema.String)
16
- }) {
17
- };
18
-
19
- // src/types/types.ts
20
- import * as Schema2 from "effect/Schema";
21
- import { FileInfoSchema } from "@dxos/app-framework";
22
- import { SpaceSchema } from "@dxos/react-client/echo";
23
- (function(WnfsAction2) {
24
- class Create extends Schema2.TaggedClass()(`${meta.id}/action/create`, {
25
- input: FileInfoSchema.pick("name", "type", "cid").pipe(Schema2.required),
26
- output: Schema2.Struct({
27
- object: FileType
28
- })
29
- }) {
30
- }
31
- WnfsAction2.Create = Create;
32
- WnfsAction2.UploadAnnotationId = Symbol.for(`${meta.id}/annotation/upload`);
33
- WnfsAction2.UploadFileSchema = Schema2.Struct({
34
- file: Schema2.instanceOf(File).annotations({
35
- [WnfsAction2.UploadAnnotationId]: {
36
- // Accept file types.
37
- "image/*": [
38
- ".jpg",
39
- ".jpeg",
40
- ".png",
41
- ".gif"
42
- ],
43
- "application/pdf": [
44
- ".pdf"
45
- ]
46
- }
47
- })
48
- });
49
- class Upload extends Schema2.TaggedClass()(`${meta.id}/action/upload`, {
50
- input: Schema2.extend(WnfsAction2.UploadFileSchema, Schema2.Struct({
51
- space: SpaceSchema
52
- })),
53
- output: Schema2.required(FileInfoSchema)
54
- }) {
55
- }
56
- WnfsAction2.Upload = Upload;
57
- })(WnfsAction || (WnfsAction = {}));
58
- var WnfsAction;
59
-
60
- export {
61
- FileType,
62
- WnfsAction
63
- };
64
- //# sourceMappingURL=chunk-QQB5IBX7.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/file.ts", "../../../src/types/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { TypedObject } from '@dxos/echo/internal';\n\nexport class FileType extends TypedObject({\n typename: 'dxos.org/type/File',\n version: '0.1.0',\n})({\n name: Schema.optional(Schema.String),\n type: Schema.String,\n cid: Schema.String,\n timestamp: Schema.optional(Schema.String),\n}) {}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { FileInfoSchema } from '@dxos/app-framework';\nimport { SpaceSchema } from '@dxos/react-client/echo';\n\nimport { meta } from '../meta';\n\nimport { FileType } from './file';\n\nexport namespace WnfsAction {\n export class Create extends Schema.TaggedClass<Create>()(`${meta.id}/action/create`, {\n input: FileInfoSchema.pick('name', 'type', 'cid').pipe(Schema.required),\n output: Schema.Struct({\n object: FileType,\n }),\n }) {}\n\n export const UploadAnnotationId = Symbol.for(`${meta.id}/annotation/upload`);\n\n export const UploadFileSchema = Schema.Struct({\n file: Schema.instanceOf(File).annotations({\n [UploadAnnotationId]: {\n // Accept file types.\n 'image/*': ['.jpg', '.jpeg', '.png', '.gif'],\n 'application/pdf': ['.pdf'],\n // TODO(wittjosiah): Add more file types.\n },\n }),\n });\n\n export type UploadFileForm = Schema.Schema.Type<typeof UploadFileSchema>;\n\n export class Upload extends Schema.TaggedClass<Upload>()(`${meta.id}/action/upload`, {\n input: Schema.extend(UploadFileSchema, Schema.Struct({ space: SpaceSchema })),\n output: Schema.required(FileInfoSchema),\n }) {}\n}\n"],
5
- "mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,mBAAmB;AAErB,IAAMC,WAAN,cAAuBC,YAAY;EACxCC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDC,MAAaC,gBAAgBC,aAAM;EACnCC,MAAaD;EACbE,KAAYF;EACZG,WAAkBJ,gBAAgBC,aAAM;AAC1C,CAAA,EAAA;AAAI;;;ACZJ,YAAYI,aAAY;AAExB,SAASC,sBAAsB;AAC/B,SAASC,mBAAmB;UAMXC,aAAAA;EACR,MAAMC,eAAsBC,oBAAW,EAAW,GAAGC,KAAKC,EAAE,kBAAkB;IACnFC,OAAOC,eAAeC,KAAK,QAAQ,QAAQ,KAAA,EAAOC,KAAYC,gBAAQ;IACtEC,QAAeC,eAAO;MACpBC,QAAQC;IACV,CAAA;EACF,CAAA,EAAA;EAAI;cALSZ,SAAAA;cAOAa,qBAAqBC,OAAOC,IAAI,GAAGb,KAAKC,EAAE,oBAAoB;cAE9Da,mBAA0BN,eAAO;IAC5CO,MAAaC,mBAAWC,IAAAA,EAAMC,YAAY;MACxC,CAAArB,YAACc,kBAAAA,GAAqB;;QAEpB,WAAW;UAAC;UAAQ;UAAS;UAAQ;;QACrC,mBAAmB;UAAC;;MAEtB;IACF,CAAA;EACF,CAAA;EAIO,MAAMQ,eAAsBpB,oBAAW,EAAW,GAAGC,KAAKC,EAAE,kBAAkB;IACnFC,OAAckB,eAAMvB,YAACiB,kBAAyBN,eAAO;MAAEa,OAAOC;IAAY,CAAA,CAAA;IAC1Ef,QAAeD,iBAASH,cAAAA;EAC1B,CAAA,EAAA;EAAI;cAHSgB,SAAAA;AAIf,GA3BiBtB,eAAAA,aAAAA,CAAAA,EAAAA;;",
6
- "names": ["Schema", "TypedObject", "FileType", "TypedObject", "typename", "version", "name", "optional", "String", "type", "cid", "timestamp", "Schema", "FileInfoSchema", "SpaceSchema", "WnfsAction", "Create", "TaggedClass", "meta", "id", "input", "FileInfoSchema", "pick", "pipe", "required", "output", "Struct", "object", "FileType", "UploadAnnotationId", "Symbol", "for", "UploadFileSchema", "file", "instanceOf", "File", "annotations", "Upload", "extend", "space", "SpaceSchema"]
7
- }
@@ -1,16 +0,0 @@
1
- // src/capabilities/index.ts
2
- import { lazy } from "@dxos/app-framework";
3
- var Blockstore = lazy(() => import("./blockstore-HK4IYHJJ.mjs"));
4
- var FileUploader = lazy(() => import("./file-uploader-5S37ZZCW.mjs"));
5
- var IntentResolver = lazy(() => import("./intent-resolver-3KMIEDBO.mjs"));
6
- var Markdown = lazy(() => import("./markdown-5XD3I2NQ.mjs"));
7
- var ReactSurface = lazy(() => import("./react-surface-5D7M3Y4W.mjs"));
8
-
9
- export {
10
- Blockstore,
11
- FileUploader,
12
- IntentResolver,
13
- Markdown,
14
- ReactSurface
15
- };
16
- //# sourceMappingURL=chunk-Y5JMTQ74.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const Blockstore = lazy(() => import('./blockstore'));\nexport const FileUploader = lazy(() => import('./file-uploader'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const Markdown = lazy(() => import('./markdown'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\n\nexport * from './capabilities';\n"],
5
- "mappings": ";AAIA,SAASA,YAAY;AAEd,IAAMC,aAAaC,KAAK,MAAM,OAAO,2BAAA,CAAA;AACrC,IAAMC,eAAeD,KAAK,MAAM,OAAO,8BAAA,CAAA;AACvC,IAAME,iBAAiBF,KAAK,MAAM,OAAO,gCAAA,CAAA;AACzC,IAAMG,WAAWH,KAAK,MAAM,OAAO,yBAAA,CAAA;AACnC,IAAMI,eAAeJ,KAAK,MAAM,OAAO,8BAAA,CAAA;",
6
- "names": ["lazy", "Blockstore", "lazy", "FileUploader", "IntentResolver", "Markdown", "ReactSurface"]
7
- }
@@ -1,30 +0,0 @@
1
- import {
2
- WnfsAction
3
- } from "./chunk-QQB5IBX7.mjs";
4
- import "./chunk-FYRZOKHG.mjs";
5
-
6
- // src/capabilities/file-uploader.ts
7
- import * as Effect from "effect/Effect";
8
- import * as Function from "effect/Function";
9
- import { Capabilities, chain, contributes, createIntent } from "@dxos/app-framework";
10
- import { SpaceAction } from "@dxos/plugin-space/types";
11
- var file_uploader_default = ((context) => {
12
- return contributes(Capabilities.FileUploader, (file, space) => {
13
- const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
14
- const program = Effect.gen(function* () {
15
- const fileInfo = yield* dispatch(createIntent(WnfsAction.Upload, {
16
- file,
17
- space
18
- }));
19
- yield* dispatch(Function.pipe(createIntent(WnfsAction.Create, fileInfo), chain(SpaceAction.AddObject, {
20
- target: space
21
- })));
22
- return fileInfo;
23
- });
24
- return Effect.runPromise(program);
25
- });
26
- });
27
- export {
28
- file_uploader_default as default
29
- };
30
- //# sourceMappingURL=file-uploader-5S37ZZCW.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/file-uploader.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\n\nimport { Capabilities, type PluginContext, chain, contributes, createIntent } from '@dxos/app-framework';\nimport { SpaceAction } from '@dxos/plugin-space/types';\n\nimport { WnfsAction } from '../types';\n\nexport default (context: PluginContext) => {\n return contributes(Capabilities.FileUploader, (file, space) => {\n const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n\n const program = Effect.gen(function* () {\n const fileInfo = yield* dispatch(createIntent(WnfsAction.Upload, { file, space }));\n yield* dispatch(\n Function.pipe(createIntent(WnfsAction.Create, fileInfo), chain(SpaceAction.AddObject, { target: space })),\n );\n return fileInfo;\n });\n\n return Effect.runPromise(program);\n });\n};\n"],
5
- "mappings": ";;;;;;AAIA,YAAYA,YAAY;AACxB,YAAYC,cAAc;AAE1B,SAASC,cAAkCC,OAAOC,aAAaC,oBAAoB;AACnF,SAASC,mBAAmB;AAI5B,IAAA,yBAAe,CAACC,YAAAA;AACd,SAAOC,YAAYC,aAAaC,cAAc,CAACC,MAAMC,UAAAA;AACnD,UAAM,EAAEC,SAAQ,IAAKN,QAAQO,cAAcL,aAAaM,gBAAgB;AAExE,UAAMC,UAAiBC,WAAI,aAAA;AACzB,YAAMC,WAAW,OAAOL,SAASM,aAAaC,WAAWC,QAAQ;QAAEV;QAAMC;MAAM,CAAA,CAAA;AAC/E,aAAOC,SACIS,cAAKH,aAAaC,WAAWG,QAAQL,QAAAA,GAAWM,MAAMC,YAAYC,WAAW;QAAEC,QAAQf;MAAM,CAAA,CAAA,CAAA;AAExG,aAAOM;IACT,CAAA;AAEA,WAAcU,kBAAWZ,OAAAA;EAC3B,CAAA;AACF;",
6
- "names": ["Effect", "Function", "Capabilities", "chain", "contributes", "createIntent", "SpaceAction", "context", "contributes", "Capabilities", "FileUploader", "file", "space", "dispatch", "getCapability", "IntentDispatcher", "program", "gen", "fileInfo", "createIntent", "WnfsAction", "Upload", "pipe", "Create", "chain", "SpaceAction", "AddObject", "target", "runPromise"]
7
- }
@@ -1,116 +0,0 @@
1
- import {
2
- Blockstore,
3
- FileUploader,
4
- IntentResolver,
5
- Markdown,
6
- ReactSurface
7
- } from "./chunk-Y5JMTQ74.mjs";
8
- import {
9
- WnfsCapabilities
10
- } from "./chunk-PAIK4SJ3.mjs";
11
- import {
12
- FileType,
13
- WnfsAction
14
- } from "./chunk-QQB5IBX7.mjs";
15
- import {
16
- meta
17
- } from "./chunk-FYRZOKHG.mjs";
18
-
19
- // src/WnfsPlugin.tsx
20
- import * as Function from "effect/Function";
21
- import { Capabilities, Events, chain, contributes, createIntent, defineModule, definePlugin } from "@dxos/app-framework";
22
- import { ClientEvents } from "@dxos/plugin-client";
23
- import { MarkdownEvents } from "@dxos/plugin-markdown";
24
- import { SpaceCapabilities } from "@dxos/plugin-space";
25
- import { defineObjectForm } from "@dxos/plugin-space/types";
26
-
27
- // src/translations.ts
28
- var translations = [
29
- {
30
- "en-US": {
31
- [FileType.typename]: {
32
- "typename label": "File",
33
- "object name placeholder": "New file",
34
- "rename object label": "Rename file",
35
- "delete object label": "Delete file"
36
- },
37
- [meta.id]: {
38
- "plugin name": "Files",
39
- "delete object label": "Delete",
40
- "file input placeholder": "Drop a file here, or click to select a file"
41
- }
42
- }
43
- }
44
- ];
45
-
46
- // src/WnfsPlugin.tsx
47
- var WnfsPlugin = definePlugin(meta, () => [
48
- defineModule({
49
- id: `${meta.id}/module/blockstore`,
50
- activatesOn: ClientEvents.ClientReady,
51
- activate: Blockstore
52
- }),
53
- defineModule({
54
- id: `${meta.id}/module/instances`,
55
- activatesOn: ClientEvents.ClientReady,
56
- activate: () => {
57
- const instances = {};
58
- return contributes(WnfsCapabilities.Instances, instances);
59
- }
60
- }),
61
- defineModule({
62
- id: `${meta.id}/module/translations`,
63
- activatesOn: Events.SetupTranslations,
64
- activate: () => contributes(Capabilities.Translations, translations)
65
- }),
66
- defineModule({
67
- id: `${meta.id}/module/metadata`,
68
- activatesOn: Events.SetupMetadata,
69
- activate: () => contributes(Capabilities.Metadata, {
70
- id: FileType.typename,
71
- metadata: {
72
- label: (object) => object instanceof FileType ? object.name : void 0,
73
- // TODO(wittjosiah): Would be nice if icon could change based on the type of the file.
74
- icon: "ph--file--regular"
75
- }
76
- })
77
- }),
78
- defineModule({
79
- id: `${meta.id}/module/object-form`,
80
- activatesOn: ClientEvents.SetupSchema,
81
- activate: () => contributes(SpaceCapabilities.ObjectForm, defineObjectForm({
82
- objectSchema: FileType,
83
- formSchema: WnfsAction.UploadFileSchema,
84
- getIntent: (props, options) => Function.pipe(createIntent(WnfsAction.Upload, {
85
- ...props,
86
- space: options.space
87
- }), chain(WnfsAction.Create, {}))
88
- }))
89
- }),
90
- defineModule({
91
- id: `${meta.id}/module/file-uploader`,
92
- activatesOn: ClientEvents.ClientReady,
93
- activate: FileUploader
94
- }),
95
- defineModule({
96
- id: `${meta.id}/module/markdown`,
97
- activatesOn: MarkdownEvents.SetupExtensions,
98
- activate: Markdown
99
- }),
100
- defineModule({
101
- id: `${meta.id}/module/react-surface`,
102
- activatesOn: Events.SetupReactSurface,
103
- activate: ReactSurface
104
- }),
105
- defineModule({
106
- id: `${meta.id}/module/intent-resolver`,
107
- activatesOn: Events.SetupIntentResolver,
108
- activate: IntentResolver
109
- })
110
- ]);
111
- export {
112
- WnfsCapabilities,
113
- WnfsPlugin,
114
- meta
115
- };
116
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/WnfsPlugin.tsx", "../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Function from 'effect/Function';\n\nimport {\n Capabilities,\n Events,\n chain,\n contributes,\n createIntent,\n defineModule,\n definePlugin,\n} from '@dxos/app-framework';\nimport { ClientEvents } from '@dxos/plugin-client';\nimport { MarkdownEvents } from '@dxos/plugin-markdown';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { defineObjectForm } from '@dxos/plugin-space/types';\n\nimport { Blockstore, FileUploader, IntentResolver, Markdown, ReactSurface, WnfsCapabilities } from './capabilities';\nimport { meta } from './meta';\nimport { translations } from './translations';\nimport { FileType, WnfsAction } from './types';\n\nexport const WnfsPlugin = definePlugin(meta, () => [\n defineModule({\n id: `${meta.id}/module/blockstore`,\n activatesOn: ClientEvents.ClientReady,\n activate: Blockstore,\n }),\n defineModule({\n id: `${meta.id}/module/instances`,\n activatesOn: ClientEvents.ClientReady,\n activate: () => {\n const instances: WnfsCapabilities.Instances = {};\n return contributes(WnfsCapabilities.Instances, instances);\n },\n }),\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, translations),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () =>\n contributes(Capabilities.Metadata, {\n id: FileType.typename,\n metadata: {\n label: (object: any) => (object instanceof FileType ? object.name : undefined),\n // TODO(wittjosiah): Would be nice if icon could change based on the type of the file.\n icon: 'ph--file--regular',\n },\n }),\n }),\n defineModule({\n id: `${meta.id}/module/object-form`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () =>\n contributes(\n SpaceCapabilities.ObjectForm,\n defineObjectForm({\n objectSchema: FileType,\n formSchema: WnfsAction.UploadFileSchema,\n getIntent: (props, options) =>\n Function.pipe(\n createIntent(WnfsAction.Upload, { ...props, space: options.space }),\n chain(WnfsAction.Create, {}),\n ),\n }),\n ),\n }),\n defineModule({\n id: `${meta.id}/module/file-uploader`,\n activatesOn: ClientEvents.ClientReady,\n activate: FileUploader,\n }),\n defineModule({\n id: `${meta.id}/module/markdown`,\n activatesOn: MarkdownEvents.SetupExtensions,\n activate: Markdown,\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nimport { meta } from './meta';\nimport { FileType } from './types';\n\nexport const translations = [\n {\n 'en-US': {\n [FileType.typename]: {\n 'typename label': 'File',\n 'object name placeholder': 'New file',\n 'rename object label': 'Rename file',\n 'delete object label': 'Delete file',\n },\n [meta.id]: {\n 'plugin name': 'Files',\n 'delete object label': 'Delete',\n 'file input placeholder': 'Drop a file here, or click to select a file',\n },\n },\n },\n] as const satisfies Resource[];\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAIA,YAAYA,cAAc;AAE1B,SACEC,cACAC,QACAC,OACAC,aACAC,cACAC,cACAC,oBACK;AACP,SAASC,oBAAoB;AAC7B,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAClC,SAASC,wBAAwB;;;ACT1B,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACC,SAASC,QAAQ,GAAG;QACnB,kBAAkB;QAClB,2BAA2B;QAC3B,uBAAuB;QACvB,uBAAuB;MACzB;MACA,CAACC,KAAKC,EAAE,GAAG;QACT,eAAe;QACf,uBAAuB;QACvB,0BAA0B;MAC5B;IACF;EACF;;;;ADCK,IAAMC,aAAaC,aAAaC,MAAM,MAAM;EACjDC,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,aAAaC;IAC1BC,UAAUC;EACZ,CAAA;EACAN,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,aAAaC;IAC1BC,UAAU,MAAA;AACR,YAAME,YAAwC,CAAC;AAC/C,aAAOC,YAAYC,iBAAiBC,WAAWH,SAAAA;IACjD;EACF,CAAA;EACAP,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaS,OAAOC;IACpBP,UAAU,MAAMG,YAAYK,aAAaC,cAAcC,YAAAA;EACzD,CAAA;EACAf,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaS,OAAOK;IACpBX,UAAU,MACRG,YAAYK,aAAaI,UAAU;MACjChB,IAAIiB,SAASC;MACbC,UAAU;QACRC,OAAO,CAACC,WAAiBA,kBAAkBJ,WAAWI,OAAOC,OAAOC;;QAEpEC,MAAM;MACR;IACF,CAAA;EACJ,CAAA;EACAzB,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,aAAauB;IAC1BrB,UAAU,MACRG,YACEmB,kBAAkBC,YAClBC,iBAAiB;MACfC,cAAcZ;MACda,YAAYC,WAAWC;MACvBC,WAAW,CAACC,OAAOC,YACRC,cACPC,aAAaN,WAAWO,QAAQ;QAAE,GAAGJ;QAAOK,OAAOJ,QAAQI;MAAM,CAAA,GACjEC,MAAMT,WAAWU,QAAQ,CAAC,CAAA,CAAA;IAEhC,CAAA,CAAA;EAEN,CAAA;EACA1C,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,aAAaC;IAC1BC,UAAUsC;EACZ,CAAA;EACA3C,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAa0C,eAAeC;IAC5BxC,UAAUyC;EACZ,CAAA;EACA9C,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaS,OAAOoC;IACpB1C,UAAU2C;EACZ,CAAA;EACAhD,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaS,OAAOsC;IACpB5C,UAAU6C;EACZ,CAAA;CACD;",
6
- "names": ["Function", "Capabilities", "Events", "chain", "contributes", "createIntent", "defineModule", "definePlugin", "ClientEvents", "MarkdownEvents", "SpaceCapabilities", "defineObjectForm", "translations", "FileType", "typename", "meta", "id", "WnfsPlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "ClientEvents", "ClientReady", "activate", "Blockstore", "instances", "contributes", "WnfsCapabilities", "Instances", "Events", "SetupTranslations", "Capabilities", "Translations", "translations", "SetupMetadata", "Metadata", "FileType", "typename", "metadata", "label", "object", "name", "undefined", "icon", "SetupSchema", "SpaceCapabilities", "ObjectForm", "defineObjectForm", "objectSchema", "formSchema", "WnfsAction", "UploadFileSchema", "getIntent", "props", "options", "pipe", "createIntent", "Upload", "space", "chain", "Create", "FileUploader", "MarkdownEvents", "SetupExtensions", "Markdown", "SetupReactSurface", "ReactSurface", "SetupIntentResolver", "IntentResolver"]
7
- }
@@ -1,49 +0,0 @@
1
- import {
2
- upload
3
- } from "./chunk-D6VTEQIE.mjs";
4
- import {
5
- WnfsCapabilities
6
- } from "./chunk-PAIK4SJ3.mjs";
7
- import {
8
- FileType,
9
- WnfsAction
10
- } from "./chunk-QQB5IBX7.mjs";
11
- import "./chunk-FYRZOKHG.mjs";
12
-
13
- // src/capabilities/intent-resolver.ts
14
- import { Capabilities, contributes, createResolver } from "@dxos/app-framework";
15
- import { Obj } from "@dxos/echo";
16
- var intent_resolver_default = ((context) => contributes(Capabilities.IntentResolver, [
17
- // TODO(wittjosiah): Deleting the object doesn't delete the wnfs blob.
18
- // Consider ways to trigger blob deletion based on object deletion and/or adding file system manager.
19
- createResolver({
20
- intent: WnfsAction.Create,
21
- resolve: ({ name, type, cid }) => ({
22
- data: {
23
- object: Obj.make(FileType, {
24
- name,
25
- type,
26
- cid
27
- })
28
- }
29
- })
30
- }),
31
- createResolver({
32
- intent: WnfsAction.Upload,
33
- resolve: async ({ file, space }) => {
34
- const blockstore = context.getCapability(WnfsCapabilities.Blockstore);
35
- const info = await upload({
36
- file,
37
- blockstore,
38
- space
39
- });
40
- return {
41
- data: info
42
- };
43
- }
44
- })
45
- ]));
46
- export {
47
- intent_resolver_default as default
48
- };
49
- //# sourceMappingURL=intent-resolver-3KMIEDBO.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/intent-resolver.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, type PluginContext, contributes, createResolver } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\n\nimport { upload } from '../helpers';\nimport { FileType, WnfsAction } from '../types';\n\nimport { WnfsCapabilities } from './capabilities';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.IntentResolver, [\n // TODO(wittjosiah): Deleting the object doesn't delete the wnfs blob.\n // Consider ways to trigger blob deletion based on object deletion and/or adding file system manager.\n createResolver({\n intent: WnfsAction.Create,\n resolve: ({ name, type, cid }) => ({\n data: {\n object: Obj.make(FileType, { name, type, cid }),\n },\n }),\n }),\n createResolver({\n intent: WnfsAction.Upload,\n resolve: async ({ file, space }) => {\n const blockstore = context.getCapability(WnfsCapabilities.Blockstore);\n const info = await upload({ file, blockstore, space });\n return { data: info };\n },\n }),\n ]);\n"],
5
- "mappings": ";;;;;;;;;;;;;AAIA,SAASA,cAAkCC,aAAaC,sBAAsB;AAC9E,SAASC,WAAW;AAOpB,IAAA,2BAAe,CAACC,YACdC,YAAYC,aAAaC,gBAAgB;;;EAGvCC,eAAe;IACbC,QAAQC,WAAWC;IACnBC,SAAS,CAAC,EAAEC,MAAMC,MAAMC,IAAG,OAAQ;MACjCC,MAAM;QACJC,QAAQC,IAAIC,KAAKC,UAAU;UAAEP;UAAMC;UAAMC;QAAI,CAAA;MAC/C;IACF;EACF,CAAA;EACAP,eAAe;IACbC,QAAQC,WAAWW;IACnBT,SAAS,OAAO,EAAEU,MAAMC,MAAK,MAAE;AAC7B,YAAMC,aAAapB,QAAQqB,cAAcC,iBAAiBC,UAAU;AACpE,YAAMC,OAAO,MAAMC,OAAO;QAAEP;QAAME;QAAYD;MAAM,CAAA;AACpD,aAAO;QAAEP,MAAMY;MAAK;IACtB;EACF,CAAA;CACD;",
6
- "names": ["Capabilities", "contributes", "createResolver", "Obj", "context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "WnfsAction", "Create", "resolve", "name", "type", "cid", "data", "object", "Obj", "make", "FileType", "Upload", "file", "space", "blockstore", "getCapability", "WnfsCapabilities", "Blockstore", "info", "upload"]
7
- }
@@ -1,209 +0,0 @@
1
- import {
2
- getBlobUrl,
3
- getPathFromUrl,
4
- loadWnfs
5
- } from "./chunk-D6VTEQIE.mjs";
6
- import {
7
- WnfsCapabilities
8
- } from "./chunk-PAIK4SJ3.mjs";
9
- import "./chunk-FYRZOKHG.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
- function _define_property(obj, key, value) {
26
- if (key in obj) {
27
- Object.defineProperty(obj, key, {
28
- value,
29
- enumerable: true,
30
- configurable: true,
31
- writable: true
32
- });
33
- } else {
34
- obj[key] = value;
35
- }
36
- return obj;
37
- }
38
- var WAIT_UNTIL_LOADER = 1500;
39
- var image = (options) => {
40
- const blobUrlCache = {};
41
- const preloaded = /* @__PURE__ */ new Set();
42
- const preload = (url) => {
43
- if (!preloaded.has(url)) {
44
- const img = document.createElement("img");
45
- img.src = url;
46
- preloaded.add(url);
47
- }
48
- };
49
- return [
50
- StateField.define({
51
- create: (state) => {
52
- return Decoration.set(buildDecorations({
53
- from: 0,
54
- to: state.doc.length,
55
- state,
56
- blobUrlCache,
57
- preload,
58
- options
59
- }));
60
- },
61
- update: (value, tr) => {
62
- if (!tr.docChanged && !tr.selection) {
63
- return value;
64
- }
65
- const cursor = tr.state.selection.main.head;
66
- const oldCursor = tr.changes.mapPos(tr.startState.selection.main.head);
67
- let from = Math.min(cursor, oldCursor);
68
- let to = Math.max(cursor, oldCursor);
69
- tr.changes.iterChangedRanges((fromA, toA, fromB, toB) => {
70
- from = Math.min(from, fromB);
71
- to = Math.max(to, toB);
72
- });
73
- from = tr.state.doc.lineAt(from).from;
74
- to = tr.state.doc.lineAt(to).to;
75
- return value.map(tr.changes).update({
76
- filterFrom: from,
77
- filterTo: to,
78
- filter: () => false,
79
- add: buildDecorations({
80
- from,
81
- to,
82
- state: tr.state,
83
- blobUrlCache,
84
- preload,
85
- options
86
- })
87
- });
88
- },
89
- provide: (field) => EditorView.decorations.from(field)
90
- })
91
- ];
92
- };
93
- var buildDecorations = ({ state, from, to, blobUrlCache, preload, options: { blockstore, instances, space } }) => {
94
- const decorations = [];
95
- const cursor = state.selection.main.head;
96
- syntaxTree(state).iterate({
97
- enter: (node) => {
98
- if (node.name !== "Image") {
99
- return;
100
- }
101
- const urlNode = node.node.getChild("URL");
102
- if (!urlNode) {
103
- return;
104
- }
105
- const hide = state.readOnly || cursor < node.from || cursor > node.to;
106
- const wnfsUrl = state.sliceDoc(urlNode.from, urlNode.to);
107
- if (!wnfsUrl.startsWith("wnfs://")) {
108
- return;
109
- }
110
- const path = getPathFromUrl(wnfsUrl);
111
- const spaceId = path[1];
112
- if (spaceId !== space.id) {
113
- return;
114
- }
115
- const blobUrlPromise = (async () => {
116
- const { directory, forest } = await loadWnfs({
117
- blockstore,
118
- instances,
119
- space
120
- });
121
- const url = await getBlobUrl({
122
- wnfsUrl,
123
- blockstore,
124
- directory,
125
- forest
126
- });
127
- blobUrlCache[path.join("/")] = url;
128
- preload(url);
129
- return url;
130
- })();
131
- decorations.push(Decoration.replace({
132
- block: true,
133
- widget: new WnfsImageWidget(wnfsUrl, blobUrlCache[path.join("/")] ?? blobUrlPromise)
134
- }).range(hide ? node.from : node.to, node.to));
135
- },
136
- from,
137
- to
138
- });
139
- return decorations;
140
- };
141
- var createImg = (view, url) => {
142
- const img = document.createElement("img");
143
- img.setAttribute("src", url);
144
- img.setAttribute("class", "cm-image-with-loader");
145
- if (view.state.field(focusField)) {
146
- img.onload = () => img.classList.add("cm-loaded-image");
147
- } else {
148
- img.classList.add("cm-loaded-image");
149
- }
150
- return img;
151
- };
152
- var WnfsImageWidget = class extends WidgetType {
153
- eq(other) {
154
- return this._wnfsUrl === other._wnfsUrl;
155
- }
156
- toDOM(view) {
157
- if (typeof this._url === "string") {
158
- return createImg(view, this._url);
159
- }
160
- const widget = document.createElement("div");
161
- widget.className = "cm-image-wrapper";
162
- const loader = document.createElement("div");
163
- loader.className = "mx-auto transition-opacity";
164
- let loaderAdded = false;
165
- const timeout = setTimeout(() => {
166
- const root = createRoot(loader);
167
- root.render(/* @__PURE__ */ React.createElement(ThemeProvider, {
168
- tx: defaultTx
169
- }, /* @__PURE__ */ React.createElement(Status, {
170
- indeterminate: true
171
- })));
172
- widget.appendChild(loader);
173
- loaderAdded = true;
174
- }, WAIT_UNTIL_LOADER);
175
- void this._url.then((url) => {
176
- clearTimeout(timeout);
177
- const img = createImg(view, url);
178
- loaderAdded && widget.removeChild(loader);
179
- widget.appendChild(img);
180
- });
181
- return widget;
182
- }
183
- constructor(_wnfsUrl, _url) {
184
- super(), _define_property(this, "_wnfsUrl", void 0), _define_property(this, "_url", void 0), this._wnfsUrl = _wnfsUrl, this._url = _url;
185
- }
186
- };
187
-
188
- // src/capabilities/markdown.ts
189
- var markdown_default = ((context) => contributes(MarkdownCapabilities.Extensions, [
190
- ({ document: document2 }) => {
191
- const blockstore = context.getCapability(WnfsCapabilities.Blockstore);
192
- const instances = context.getCapability(WnfsCapabilities.Instances);
193
- if (document2) {
194
- const space = getSpace(document2);
195
- return space ? [
196
- image({
197
- blockstore,
198
- instances,
199
- space
200
- })
201
- ] : [];
202
- }
203
- return [];
204
- }
205
- ]));
206
- export {
207
- markdown_default as default
208
- };
209
- //# sourceMappingURL=markdown-5XD3I2NQ.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 state,\n from,\n to,\n blobUrlCache,\n preload,\n options: { blockstore, instances, space },\n}: {\n state: EditorState;\n from: number;\n to: number;\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": ";;;;;;;;;;;AAIA,SAA6BA,mBAAmB;AAChD,SAASC,4BAA4B;AACrC,SAASC,gBAAgB;;;ACFzB,SAASC,kBAAkB;AAC3B,SAAuDC,kBAAkB;AACzE,SAASC,YAAYC,YAAYC,kBAAkB;AAEnD,OAAOC,WAAW;AAClB,SAASC,kBAAkB;AAG3B,SAASC,QAAQC,qBAAqB;AACtC,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;A;;;;;;;;;;;;;AAM1B,IAAMC,oBAAoB;AAWnB,IAAMC,QAAQ,CAACC,YAAAA;AACpB,QAAMC,eAAuC,CAAC;AAC9C,QAAMC,YAAY,oBAAIC,IAAAA;AAEtB,QAAMC,UAAU,CAACC,QAAAA;AACf,QAAI,CAACH,UAAUI,IAAID,GAAAA,GAAM;AACvB,YAAME,MAAMC,SAASC,cAAc,KAAA;AACnCF,UAAIG,MAAML;AACVH,gBAAUS,IAAIN,GAAAA;IAChB;EACF;AAEA,SAAO;IACLO,WAAWC,OAAO;MAChBC,QAAQ,CAACC,UAAAA;AACP,eAAOC,WAAWC,IAChBC,iBAAiB;UAAEC,MAAM;UAAGC,IAAIL,MAAMM,IAAIC;UAAQP;UAAOd;UAAcG;UAASJ;QAAQ,CAAA,CAAA;MAE5F;MACAuB,QAAQ,CAACC,OAAOC,OAAAA;AACd,YAAI,CAACA,GAAGC,cAAc,CAACD,GAAGE,WAAW;AACnC,iBAAOH;QACT;AAGA,cAAMI,SAASH,GAAGV,MAAMY,UAAUE,KAAKC;AACvC,cAAMC,YAAYN,GAAGO,QAAQC,OAAOR,GAAGS,WAAWP,UAAUE,KAAKC,IAAI;AACrE,YAAIX,OAAOgB,KAAKC,IAAIR,QAAQG,SAAAA;AAC5B,YAAIX,KAAKe,KAAKE,IAAIT,QAAQG,SAAAA;AAC1BN,WAAGO,QAAQM,kBAAkB,CAACC,OAAOC,KAAKC,OAAOC,QAAAA;AAC/CvB,iBAAOgB,KAAKC,IAAIjB,MAAMsB,KAAAA;AACtBrB,eAAKe,KAAKE,IAAIjB,IAAIsB,GAAAA;QACpB,CAAA;AAGAvB,eAAOM,GAAGV,MAAMM,IAAIsB,OAAOxB,IAAAA,EAAMA;AACjCC,aAAKK,GAAGV,MAAMM,IAAIsB,OAAOvB,EAAAA,EAAIA;AAE7B,eAAOI,MAAMoB,IAAInB,GAAGO,OAAO,EAAET,OAAO;UAClCsB,YAAY1B;UACZ2B,UAAU1B;UACV2B,QAAQ,MAAM;UACdpC,KAAKO,iBAAiB;YAAEC;YAAMC;YAAIL,OAAOU,GAAGV;YAAOd;YAAcG;YAASJ;UAAQ,CAAA;QACpF,CAAA;MACF;MACAgD,SAAS,CAACC,UAAUC,WAAWC,YAAYhC,KAAK8B,KAAAA;IAClD,CAAA;;AAEJ;AAEA,IAAM/B,mBAAmB,CAAC,EACxBH,OACAI,MACAC,IACAnB,cACAG,SACAJ,SAAS,EAAEoD,YAAYC,WAAWC,MAAK,EAAE,MAQ1C;AACC,QAAMH,cAAmC,CAAA;AACzC,QAAMvB,SAASb,MAAMY,UAAUE,KAAKC;AACpCyB,aAAWxC,KAAAA,EAAOyC,QAAQ;IACxBC,OAAO,CAACC,SAAAA;AACN,UAAIA,KAAKC,SAAS,SAAS;AACzB;MACF;AAEA,YAAMC,UAAUF,KAAKA,KAAKG,SAAS,KAAA;AACnC,UAAI,CAACD,SAAS;AACZ;MACF;AAEA,YAAME,OAAO/C,MAAMgD,YAAYnC,SAAS8B,KAAKvC,QAAQS,SAAS8B,KAAKtC;AACnE,YAAM4C,UAAUjD,MAAMkD,SAASL,QAAQzC,MAAMyC,QAAQxC,EAAE;AACvD,UAAI,CAAC4C,QAAQE,WAAW,SAAA,GAAY;AAClC;MACF;AAEA,YAAMC,OAAOC,eAAeJ,OAAAA;AAG5B,YAAMK,UAAUF,KAAK,CAAA;AACrB,UAAIE,YAAYf,MAAMgB,IAAI;AACxB;MACF;AAGA,YAAMC,kBAAkB,YAAA;AACtB,cAAM,EAAEC,WAAWC,OAAM,IAAK,MAAMC,SAAS;UAAEtB;UAAYC;UAAWC;QAAM,CAAA;AAC5E,cAAMjD,MAAM,MAAMsE,WAAW;UAAEX;UAASZ;UAAYoB;UAAWC;QAAO,CAAA;AACtExE,qBAAakE,KAAKS,KAAK,GAAA,CAAA,IAAQvE;AAC/BD,gBAAQC,GAAAA;AACR,eAAOA;MACT,GAAA;AAEA8C,kBAAY0B,KACV7D,WAAW8D,QAAQ;QACjBC,OAAO;QACPC,QAAQ,IAAIC,gBAAgBjB,SAAS/D,aAAakE,KAAKS,KAAK,GAAA,CAAA,KAASL,cAAAA;MACvE,CAAA,EAAGW,MAAMpB,OAAOJ,KAAKvC,OAAOuC,KAAKtC,IAAIsC,KAAKtC,EAAE,CAAA;IAEhD;IACAD;IACAC;EACF,CAAA;AAEA,SAAO+B;AACT;AAEA,IAAMgC,YAAY,CAACC,MAAkB/E,QAAAA;AACnC,QAAME,MAAMC,SAASC,cAAc,KAAA;AACnCF,MAAI8E,aAAa,OAAOhF,GAAAA;AACxBE,MAAI8E,aAAa,SAAS,sBAAA;AAE1B,MAAID,KAAKrE,MAAMkC,MAAMqC,UAAAA,GAAa;AAChC/E,QAAIgF,SAAS,MAAMhF,IAAIiF,UAAU7E,IAAI,iBAAA;EACvC,OAAO;AACLJ,QAAIiF,UAAU7E,IAAI,iBAAA;EACpB;AACA,SAAOJ;AACT;AAEA,IAAM0E,kBAAN,cAA8BQ,WAAAA;EAQnBC,GAAGC,OAAsB;AAChC,WAAO,KAAKC,aAAcD,MAAiCC;EAC7D;EAESC,MAAMT,MAAkC;AAC/C,QAAI,OAAO,KAAKU,SAAS,UAAU;AACjC,aAAOX,UAAUC,MAAM,KAAKU,IAAI;IAClC;AAEA,UAAMd,SAASxE,SAASC,cAAc,KAAA;AACtCuE,WAAOe,YAAY;AACnB,UAAMC,SAASxF,SAASC,cAAc,KAAA;AACtCuF,WAAOD,YAAY;AACnB,QAAIE,cAAc;AAElB,UAAMC,UAAUC,WAAW,MAAA;AACzB,YAAMC,OAAOC,WAAWL,MAAAA;AACxBI,WAAKE,OACH,sBAAA,cAACC,eAAAA;QAAcC,IAAIC;SACjB,sBAAA,cAACC,QAAAA;QAAOC,eAAAA;;AAGZ3B,aAAO4B,YAAYZ,MAAAA;AACnBC,oBAAc;IAChB,GAAGnG,iBAAAA;AAEH,SAAK,KAAKgG,KAAKe,KAAK,CAACxG,QAAAA;AACnByG,mBAAaZ,OAAAA;AACb,YAAM3F,MAAM4E,UAAUC,MAAM/E,GAAAA;AAC5B4F,qBAAejB,OAAO+B,YAAYf,MAAAA;AAClChB,aAAO4B,YAAYrG,GAAAA;IACrB,CAAA;AAEA,WAAOyE;EACT;EAzCA,YACWY,UACAE,MACT;AACA,UAAK,GAAA,iBAAA,MAAA,YAAA,MAAA,GAAA,iBAAA,MAAA,QAAA,MAAA,GAAA,KAHIF,WAAAA,UAAAA,KACAE,OAAAA;EAGX;AAqCF;;;AD9LA,IAAA,oBAAe,CAACkB,YACdC,YAAYC,qBAAqBC,YAAY;EAC3C,CAAC,EAAEC,UAAAA,UAAQ,MAAE;AACX,UAAMC,aAAaL,QAAQM,cAAcC,iBAAiBC,UAAU;AACpE,UAAMC,YAAYT,QAAQM,cAAcC,iBAAiBG,SAAS;AAElE,QAAIN,WAAU;AACZ,YAAMO,QAAQC,SAASR,SAAAA;AACvB,aAAOO,QAAQ;QAACE,MAAM;UAAER;UAAYI;UAAWE;QAAM,CAAA;UAAM,CAAA;IAC7D;AAEA,WAAO,CAAA;EACT;CACD;",
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", "eq", "other", "_wnfsUrl", "toDOM", "_url", "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
- }