@dxos/plugin-file 0.9.1-staging.ee54ba693a → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PLUGIN.mdl +86 -77
- package/dist/lib/FilePlugin.mjs +37 -0
- package/dist/lib/FilePlugin.mjs.map +1 -0
- package/dist/lib/FilePlugin.node.mjs +12 -0
- package/dist/lib/FilePlugin.node.mjs.map +1 -0
- package/dist/lib/capabilities/node.mjs +8 -0
- package/dist/lib/capabilities/node.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +15 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-FileArticle.mjs +62 -0
- package/dist/lib/chunk-FileArticle.mjs.map +1 -0
- package/dist/lib/chunk-create-object.mjs +28 -0
- package/dist/lib/chunk-create-object.mjs.map +1 -0
- package/dist/lib/chunk-create.mjs +78 -0
- package/dist/lib/chunk-create.mjs.map +1 -0
- package/dist/lib/chunk-edge-backend.mjs +18 -0
- package/dist/lib/chunk-edge-backend.mjs.map +1 -0
- package/dist/lib/chunk-file-uploader.mjs +37 -0
- package/dist/lib/chunk-file-uploader.mjs.map +1 -0
- package/dist/lib/chunk-inline-backend.mjs +19 -0
- package/dist/lib/chunk-inline-backend.mjs.map +1 -0
- package/dist/lib/chunk-markdown-extension.mjs +182 -0
- package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
- package/dist/lib/chunk-meta.mjs +44 -0
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-operation-handler.mjs +11 -0
- package/dist/lib/chunk-operation-handler.mjs.map +1 -0
- package/dist/lib/chunk-react-surface.mjs +55 -0
- package/dist/lib/chunk-react-surface.mjs.map +1 -0
- package/dist/lib/chunk-read.mjs +32 -0
- package/dist/lib/chunk-read.mjs.map +1 -0
- package/dist/lib/chunk-settings.mjs +23 -0
- package/dist/lib/chunk-settings.mjs.map +1 -0
- package/dist/lib/chunk-skill-definition.mjs +10 -0
- package/dist/lib/chunk-skill-definition.mjs.map +1 -0
- package/dist/lib/chunk-skills.mjs +28 -0
- package/dist/lib/chunk-skills.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +98 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/components.mjs +57 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +56 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/index.mjs +4 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/operations.mjs +7 -0
- package/dist/lib/operations.mjs.map +1 -0
- package/dist/lib/plugin.mjs +9 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/skills.mjs +2 -0
- package/dist/lib/translations.mjs +30 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/types/src/FilePlugin.d.ts.map +1 -1
- package/dist/types/src/FilePlugin.node.d.ts.map +1 -1
- package/dist/types/src/capabilities/FileUploadField.d.ts +12 -0
- package/dist/types/src/capabilities/FileUploadField.d.ts.map +1 -0
- package/dist/types/src/capabilities/create-object.d.ts +1 -1
- package/dist/types/src/capabilities/edge-backend.d.ts +5 -0
- package/dist/types/src/capabilities/edge-backend.d.ts.map +1 -0
- package/dist/types/src/capabilities/file-uploader.d.ts +1 -1
- package/dist/types/src/capabilities/file-uploader.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/inline-backend.d.ts +2 -2
- package/dist/types/src/capabilities/inline-backend.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
- package/dist/types/src/capabilities/node.d.ts +5 -0
- package/dist/types/src/capabilities/node.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/components/FileInput/FileInput.d.ts.map +1 -1
- package/dist/types/src/components/FilePreview/FilePreview.d.ts +1 -1
- package/dist/types/src/components/FilePreview/FilePreview.d.ts.map +1 -1
- package/dist/types/src/containers/FileArticle/FileArticle.d.ts +4 -1
- package/dist/types/src/containers/FileArticle/FileArticle.d.ts.map +1 -1
- package/dist/types/src/containers/FileSettings/FileSettings.d.ts +5 -3
- package/dist/types/src/containers/FileSettings/FileSettings.d.ts.map +1 -1
- package/dist/types/src/extensions/image.d.ts +0 -2
- package/dist/types/src/extensions/image.d.ts.map +1 -1
- package/dist/types/src/operations/create.d.ts +14 -5
- package/dist/types/src/operations/create.d.ts.map +1 -1
- package/dist/types/src/operations/read.d.ts.map +1 -1
- package/dist/types/src/types/FileCapabilities.d.ts +10 -28
- package/dist/types/src/types/FileCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/Settings.d.ts +1 -1
- package/dist/types/src/types/Settings.d.ts.map +1 -1
- package/dist/types/src/types/limits.d.ts +0 -1
- package/dist/types/src/types/limits.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +10 -6
- package/package.json +45 -41
- package/src/FilePlugin.node.ts +2 -1
- package/src/FilePlugin.tsx +8 -1
- package/src/capabilities/FileUploadField.tsx +37 -0
- package/src/capabilities/edge-backend.ts +27 -0
- package/src/capabilities/file-uploader.ts +6 -4
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/inline-backend.ts +4 -21
- package/src/capabilities/markdown-extension.ts +3 -8
- package/src/capabilities/node.ts +16 -0
- package/src/capabilities/react-surface.ts +46 -0
- package/src/components/FileInput/FileInput.tsx +3 -2
- package/src/containers/FileArticle/FileArticle.tsx +49 -42
- package/src/containers/FileSettings/FileSettings.tsx +19 -14
- package/src/extensions/image.tsx +49 -28
- package/src/operations/create.test.ts +122 -32
- package/src/operations/create.ts +44 -24
- package/src/operations/read.ts +24 -6
- package/src/types/FileCapabilities.ts +10 -31
- package/src/types/Settings.ts +1 -1
- package/src/types/limits.ts +0 -2
- package/dist/lib/neutral/FileArticle-YU6NN3KN.mjs +0 -80
- package/dist/lib/neutral/FileArticle-YU6NN3KN.mjs.map +0 -7
- package/dist/lib/neutral/FilePlugin.mjs +0 -58
- package/dist/lib/neutral/FilePlugin.mjs.map +0 -7
- package/dist/lib/neutral/FilePlugin.node.mjs +0 -23
- package/dist/lib/neutral/FilePlugin.node.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/index.mjs +0 -23
- package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
- package/dist/lib/neutral/chunk-DKGTSUUH.mjs +0 -8
- package/dist/lib/neutral/chunk-DKGTSUUH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-GMYSEHV4.mjs +0 -40
- package/dist/lib/neutral/chunk-GMYSEHV4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-LBZ4MCLI.mjs +0 -45
- package/dist/lib/neutral/chunk-LBZ4MCLI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YODPX62X.mjs +0 -136
- package/dist/lib/neutral/chunk-YODPX62X.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ZUXUTRAJ.mjs +0 -80
- package/dist/lib/neutral/chunk-ZUXUTRAJ.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -74
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/containers/index.mjs +0 -59
- package/dist/lib/neutral/containers/index.mjs.map +0 -7
- package/dist/lib/neutral/create-IUUG7RI6.mjs +0 -17
- package/dist/lib/neutral/create-IUUG7RI6.mjs.map +0 -7
- package/dist/lib/neutral/create-object-V667G4ZL.mjs +0 -30
- package/dist/lib/neutral/create-object-V667G4ZL.mjs.map +0 -7
- package/dist/lib/neutral/file-uploader-BCJH6TUL.mjs +0 -41
- package/dist/lib/neutral/file-uploader-BCJH6TUL.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -32
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/inline-backend-FGGGDYRB.mjs +0 -37
- package/dist/lib/neutral/inline-backend-FGGGDYRB.mjs.map +0 -7
- package/dist/lib/neutral/markdown-extension-RA5YNMTW.mjs +0 -230
- package/dist/lib/neutral/markdown-extension-RA5YNMTW.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -8
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/operation-handler-CPDANWGH.mjs +0 -13
- package/dist/lib/neutral/operation-handler-CPDANWGH.mjs.map +0 -7
- package/dist/lib/neutral/operations/index.mjs +0 -8
- package/dist/lib/neutral/operations/index.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -16
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-5BXKSHD2.mjs +0 -60
- package/dist/lib/neutral/react-surface-5BXKSHD2.mjs.map +0 -7
- package/dist/lib/neutral/read-HG6CSWKR.mjs +0 -28
- package/dist/lib/neutral/read-HG6CSWKR.mjs.map +0 -7
- package/dist/lib/neutral/settings-RR3RESL2.mjs +0 -28
- package/dist/lib/neutral/settings-RR3RESL2.mjs.map +0 -7
- package/dist/lib/neutral/skill-definition-YHBGWBUS.mjs +0 -15
- package/dist/lib/neutral/skill-definition-YHBGWBUS.mjs.map +0 -7
- package/dist/lib/neutral/skills/index.mjs +0 -11
- package/dist/lib/neutral/skills/index.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -36
- package/dist/lib/neutral/translations.mjs.map +0 -7
- package/dist/lib/neutral/types/index.mjs +0 -22
- package/dist/lib/neutral/types/index.mjs.map +0 -7
- package/src/capabilities/react-surface.tsx +0 -61
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
File,
|
|
3
|
-
FileCapabilities_exports,
|
|
4
|
-
FileOperation_exports,
|
|
5
|
-
MAX_FILE_SIZE,
|
|
6
|
-
Settings_exports,
|
|
7
|
-
isAcceptedMimeType
|
|
8
|
-
} from "./chunk-YODPX62X.mjs";
|
|
9
|
-
|
|
10
|
-
// src/operations/create.ts
|
|
11
|
-
import * as Effect from "effect/Effect";
|
|
12
|
-
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
13
|
-
import { Operation } from "@dxos/compute";
|
|
14
|
-
var UnsupportedFileTypeError = class extends Error {
|
|
15
|
-
type;
|
|
16
|
-
constructor(type) {
|
|
17
|
-
super(`Unsupported file type: ${type}`), this.type = type;
|
|
18
|
-
this.name = "UnsupportedFileTypeError";
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
var FileTooLargeError = class extends Error {
|
|
22
|
-
size;
|
|
23
|
-
limit;
|
|
24
|
-
constructor(size, limit = MAX_FILE_SIZE) {
|
|
25
|
-
super(`File is too large: ${size} bytes (limit: ${limit} bytes)`), this.size = size, this.limit = limit;
|
|
26
|
-
this.name = "FileTooLargeError";
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
var NoBackendError = class extends Error {
|
|
30
|
-
constructor() {
|
|
31
|
-
super("No file storage backend is registered.");
|
|
32
|
-
this.name = "NoBackendError";
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
var resolveActiveBackend = Effect.gen(function* () {
|
|
36
|
-
const backends = yield* Capability.getAll(FileCapabilities_exports.Backend);
|
|
37
|
-
if (backends.length === 0) {
|
|
38
|
-
return yield* Effect.fail(new NoBackendError());
|
|
39
|
-
}
|
|
40
|
-
const settingsAtomOpt = yield* Capability.get(FileCapabilities_exports.SettingsAtom).pipe(Effect.option);
|
|
41
|
-
const registryOpt = yield* Capability.get(Capabilities.AtomRegistry).pipe(Effect.option);
|
|
42
|
-
if (settingsAtomOpt._tag === "Some" && registryOpt._tag === "Some") {
|
|
43
|
-
const settings = registryOpt.value.get(settingsAtomOpt.value);
|
|
44
|
-
const id = settings.backend ?? Settings_exports.DEFAULT_BACKEND_ID;
|
|
45
|
-
const match = backends.find((b) => b.id === id);
|
|
46
|
-
if (match) {
|
|
47
|
-
return match;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return backends.find((b) => b.id === Settings_exports.DEFAULT_BACKEND_ID) ?? backends[0];
|
|
51
|
-
});
|
|
52
|
-
var handler = FileOperation_exports.Create.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ file, db }) {
|
|
53
|
-
if (!isAcceptedMimeType(file.type)) {
|
|
54
|
-
return yield* Effect.fail(new UnsupportedFileTypeError(file.type));
|
|
55
|
-
}
|
|
56
|
-
if (file.size > MAX_FILE_SIZE) {
|
|
57
|
-
return yield* Effect.fail(new FileTooLargeError(file.size));
|
|
58
|
-
}
|
|
59
|
-
const backend = yield* resolveActiveBackend;
|
|
60
|
-
const info = yield* Effect.promise(() => backend.upload(file, db));
|
|
61
|
-
return {
|
|
62
|
-
object: File.make({
|
|
63
|
-
name: info.name,
|
|
64
|
-
type: info.type,
|
|
65
|
-
size: info.size,
|
|
66
|
-
data: info.data,
|
|
67
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
68
|
-
})
|
|
69
|
-
};
|
|
70
|
-
})));
|
|
71
|
-
var create_default = handler;
|
|
72
|
-
|
|
73
|
-
export {
|
|
74
|
-
UnsupportedFileTypeError,
|
|
75
|
-
FileTooLargeError,
|
|
76
|
-
NoBackendError,
|
|
77
|
-
resolveActiveBackend,
|
|
78
|
-
create_default
|
|
79
|
-
};
|
|
80
|
-
//# sourceMappingURL=chunk-ZUXUTRAJ.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/create.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\n\nimport { File, FileCapabilities, FileOperation, MAX_FILE_SIZE, Settings, isAcceptedMimeType } from '../types';\n\nexport class UnsupportedFileTypeError extends Error {\n constructor(public readonly type: string) {\n super(`Unsupported file type: ${type}`);\n this.name = 'UnsupportedFileTypeError';\n }\n}\n\nexport class FileTooLargeError extends Error {\n constructor(\n public readonly size: number,\n public readonly limit: number = MAX_FILE_SIZE,\n ) {\n super(`File is too large: ${size} bytes (limit: ${limit} bytes)`);\n this.name = 'FileTooLargeError';\n }\n}\n\nexport class NoBackendError extends Error {\n constructor() {\n super('No file storage backend is registered.');\n this.name = 'NoBackendError';\n }\n}\n\n/**\n * Resolve the configured {@link FileCapabilities.Backend} from the plugin\n * settings atom. Falls back to the inline backend (or the first registered\n * one) if the configured id is missing or settings aren't available.\n */\nexport const resolveActiveBackend = Effect.gen(function* () {\n const backends = yield* Capability.getAll(FileCapabilities.Backend);\n if (backends.length === 0) {\n return yield* Effect.fail(new NoBackendError());\n }\n\n const settingsAtomOpt = yield* Capability.get(FileCapabilities.SettingsAtom).pipe(Effect.option);\n const registryOpt = yield* Capability.get(Capabilities.AtomRegistry).pipe(Effect.option);\n\n if (settingsAtomOpt._tag === 'Some' && registryOpt._tag === 'Some') {\n const settings = registryOpt.value.get(settingsAtomOpt.value) as Settings.Settings;\n const id = settings.backend ?? Settings.DEFAULT_BACKEND_ID;\n const match = backends.find((b) => b.id === id);\n if (match) {\n return match;\n }\n }\n\n return backends.find((b) => b.id === Settings.DEFAULT_BACKEND_ID) ?? backends[0];\n});\n\nconst handler: Operation.WithHandler<typeof FileOperation.Create> = FileOperation.Create.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ file, db }) {\n // Validate before hitting the backend so the contract is consistent regardless of backend.\n if (!isAcceptedMimeType(file.type)) {\n return yield* Effect.fail(new UnsupportedFileTypeError(file.type));\n }\n if (file.size > MAX_FILE_SIZE) {\n return yield* Effect.fail(new FileTooLargeError(file.size));\n }\n const backend = yield* resolveActiveBackend;\n const info = yield* Effect.promise(() => backend.upload(file, db));\n return {\n object: File.make({\n name: info.name,\n type: info.type,\n size: info.size,\n data: info.data,\n timestamp: new Date().toISOString(),\n }),\n };\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,iBAAiB;AAInB,IAAMC,2BAAN,cAAuCC,MAAAA;;EAC5C,YAA4BC,MAAc;AACxC,UAAM,0BAA0BA,IAAAA,EAAM,GAAA,KADZA,OAAAA;AAE1B,SAAKC,OAAO;EACd;AACF;AAEO,IAAMC,oBAAN,cAAgCH,MAAAA;;;EACrC,YACkBI,MACAC,QAAgBC,eAChC;AACA,UAAM,sBAAsBF,IAAAA,kBAAsBC,KAAAA,SAAc,GAAA,KAHhDD,OAAAA,MAAAA,KACAC,QAAAA;AAGhB,SAAKH,OAAO;EACd;AACF;AAEO,IAAMK,iBAAN,cAA6BP,MAAAA;EAClC,cAAc;AACZ,UAAM,wCAAA;AACN,SAAKE,OAAO;EACd;AACF;AAOO,IAAMM,uBAA8BC,WAAI,aAAA;AAC7C,QAAMC,WAAW,OAAOC,WAAWC,OAAOC,yBAAiBC,OAAO;AAClE,MAAIJ,SAASK,WAAW,GAAG;AACzB,WAAO,OAAcC,YAAK,IAAIT,eAAAA,CAAAA;EAChC;AAEA,QAAMU,kBAAkB,OAAON,WAAWO,IAAIL,yBAAiBM,YAAY,EAAEC,KAAYC,aAAM;AAC/F,QAAMC,cAAc,OAAOX,WAAWO,IAAIK,aAAaC,YAAY,EAAEJ,KAAYC,aAAM;AAEvF,MAAIJ,gBAAgBQ,SAAS,UAAUH,YAAYG,SAAS,QAAQ;AAClE,UAAMC,WAAWJ,YAAYK,MAAMT,IAAID,gBAAgBU,KAAK;AAC5D,UAAMC,KAAKF,SAASG,WAAWC,iBAASC;AACxC,UAAMC,QAAQtB,SAASuB,KAAK,CAACC,MAAMA,EAAEN,OAAOA,EAAAA;AAC5C,QAAII,OAAO;AACT,aAAOA;IACT;EACF;AAEA,SAAOtB,SAASuB,KAAK,CAACC,MAAMA,EAAEN,OAAOE,iBAASC,kBAAkB,KAAKrB,SAAS,CAAA;AAChF,CAAA;AAEA,IAAMyB,UAA8DC,sBAAcC,OAAOjB,KACvFkB,UAAUC,YACDC,kBAAW,WAAW,EAAEC,MAAMC,GAAE,GAAE;AAEvC,MAAI,CAACC,mBAAmBF,KAAKxC,IAAI,GAAG;AAClC,WAAO,OAAce,YAAK,IAAIjB,yBAAyB0C,KAAKxC,IAAI,CAAA;EAClE;AACA,MAAIwC,KAAKrC,OAAOE,eAAe;AAC7B,WAAO,OAAcU,YAAK,IAAIb,kBAAkBsC,KAAKrC,IAAI,CAAA;EAC3D;AACA,QAAMyB,UAAU,OAAOrB;AACvB,QAAMoC,OAAO,OAAcC,eAAQ,MAAMhB,QAAQiB,OAAOL,MAAMC,EAAAA,CAAAA;AAC9D,SAAO;IACLK,QAAQC,KAAKC,KAAK;MAChB/C,MAAM0C,KAAK1C;MACXD,MAAM2C,KAAK3C;MACXG,MAAMwC,KAAKxC;MACX8C,MAAMN,KAAKM;MACXC,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;IACnC,CAAA;EACF;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,iBAAelB;",
|
|
6
|
-
"names": ["Effect", "Capabilities", "Capability", "Operation", "UnsupportedFileTypeError", "Error", "type", "name", "FileTooLargeError", "size", "limit", "MAX_FILE_SIZE", "NoBackendError", "resolveActiveBackend", "gen", "backends", "Capability", "getAll", "FileCapabilities", "Backend", "length", "fail", "settingsAtomOpt", "get", "SettingsAtom", "pipe", "option", "registryOpt", "Capabilities", "AtomRegistry", "_tag", "settings", "value", "id", "backend", "Settings", "DEFAULT_BACKEND_ID", "match", "find", "b", "handler", "FileOperation", "Create", "Operation", "withHandler", "fnUntraced", "file", "db", "isAcceptedMimeType", "info", "promise", "upload", "object", "File", "make", "data", "timestamp", "Date", "toISOString"]
|
|
7
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import "../chunk-J5LGTIGS.mjs";
|
|
2
|
-
|
|
3
|
-
// src/components/FileInput/FileInput.tsx
|
|
4
|
-
import React, { useCallback } from "react";
|
|
5
|
-
import { useDropzone } from "react-dropzone";
|
|
6
|
-
import { SchemaEx } from "@dxos/effect";
|
|
7
|
-
import { useTranslation } from "@dxos/react-ui";
|
|
8
|
-
import { mx } from "@dxos/ui-theme";
|
|
9
|
-
import { meta } from "#meta";
|
|
10
|
-
import { FileAction, MAX_FILE_SIZE } from "#types";
|
|
11
|
-
var FileInput = ({ schema, onChange }) => {
|
|
12
|
-
const { t } = useTranslation(meta.profile.key);
|
|
13
|
-
const accept = SchemaEx.findAnnotation(schema.ast, FileAction.UploadAnnotationId);
|
|
14
|
-
const onDropAccepted = useCallback((files) => onChange?.(files[0]), [
|
|
15
|
-
onChange
|
|
16
|
-
]);
|
|
17
|
-
const { acceptedFiles, getRootProps, getInputProps, isFocused, isDragAccept, isDragReject } = useDropzone({
|
|
18
|
-
multiple: false,
|
|
19
|
-
accept,
|
|
20
|
-
maxSize: MAX_FILE_SIZE,
|
|
21
|
-
onDropAccepted
|
|
22
|
-
});
|
|
23
|
-
return /* @__PURE__ */ React.createElement("div", {
|
|
24
|
-
...getRootProps(),
|
|
25
|
-
className: mx("flex flex-col items-center p-8 border border-separator", isFocused && "focus-ring", isDragAccept && "bg-attention-surface", isDragReject && "border-rose-bg")
|
|
26
|
-
}, /* @__PURE__ */ React.createElement("input", getInputProps()), acceptedFiles[0] ? /* @__PURE__ */ React.createElement("p", null, acceptedFiles[0].name) : /* @__PURE__ */ React.createElement("p", null, t("file-input.placeholder")));
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
// src/components/FilePreview/FilePreview.tsx
|
|
30
|
-
import React2 from "react";
|
|
31
|
-
import { composable, composableProps } from "@dxos/react-ui";
|
|
32
|
-
var FilePreview = composable(({ type, url, children, ...props }, forwardedRef) => {
|
|
33
|
-
if (type.startsWith("image/")) {
|
|
34
|
-
return /* @__PURE__ */ React2.createElement("img", {
|
|
35
|
-
...composableProps(props, {
|
|
36
|
-
classNames: "h-full w-full object-contain"
|
|
37
|
-
}),
|
|
38
|
-
src: url,
|
|
39
|
-
ref: forwardedRef
|
|
40
|
-
});
|
|
41
|
-
} else if (type.startsWith("video/")) {
|
|
42
|
-
return /* @__PURE__ */ React2.createElement("video", {
|
|
43
|
-
...composableProps(props, {
|
|
44
|
-
classNames: "h-full w-full object-contain"
|
|
45
|
-
}),
|
|
46
|
-
src: url,
|
|
47
|
-
controls: true,
|
|
48
|
-
ref: forwardedRef
|
|
49
|
-
});
|
|
50
|
-
} else if (type === "application/pdf") {
|
|
51
|
-
return /* @__PURE__ */ React2.createElement("iframe", {
|
|
52
|
-
...composableProps(props, {
|
|
53
|
-
classNames: "h-full w-full overflow-auto"
|
|
54
|
-
}),
|
|
55
|
-
src: url,
|
|
56
|
-
title: "PDF preview",
|
|
57
|
-
ref: forwardedRef
|
|
58
|
-
});
|
|
59
|
-
} else {
|
|
60
|
-
return /* @__PURE__ */ React2.createElement("a", {
|
|
61
|
-
...composableProps(props, {
|
|
62
|
-
classNames: "p-4 underline"
|
|
63
|
-
}),
|
|
64
|
-
href: url,
|
|
65
|
-
download: true,
|
|
66
|
-
ref: forwardedRef
|
|
67
|
-
}, "Download file");
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
export {
|
|
71
|
-
FileInput,
|
|
72
|
-
FilePreview
|
|
73
|
-
};
|
|
74
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/components/FileInput/FileInput.tsx", "../../../../src/components/FilePreview/FilePreview.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\nimport React, { useCallback } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { SchemaEx } from '@dxos/effect';\nimport { useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\nimport { FileAction, MAX_FILE_SIZE } from '#types';\n\nexport type FileInputProps = {\n schema: Schema.Schema.AnyNoContext;\n onChange: (file: File) => void;\n};\n\nexport const FileInput = ({ schema, onChange }: FileInputProps) => {\n const { t } = useTranslation(meta.profile.key);\n const accept = SchemaEx.findAnnotation<Record<string, string[]>>(schema.ast, FileAction.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 maxSize: MAX_FILE_SIZE,\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-surface',\n isDragReject && 'border-rose-bg',\n )}\n >\n <input {...getInputProps()} />\n {acceptedFiles[0] ? <p>{acceptedFiles[0].name}</p> : <p>{t('file-input.placeholder')}</p>}\n </div>\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { ForwardedRef } from 'react';\n\nimport { composable, composableProps } from '@dxos/react-ui';\n\nexport type FilePreviewProps = { type: string; url: string };\n\n/**\n * File/content preview — image, video, PDF (iframe), or fallback download link.\n */\nexport const FilePreview = composable<HTMLElement, FilePreviewProps>(\n ({ type, url, children, ...props }, forwardedRef) => {\n if (type.startsWith('image/')) {\n return (\n <img\n {...composableProps(props, { classNames: 'h-full w-full object-contain' })}\n src={url}\n ref={forwardedRef as ForwardedRef<HTMLImageElement>}\n />\n );\n } else if (type.startsWith('video/')) {\n return (\n <video\n {...composableProps(props, { classNames: 'h-full w-full object-contain' })}\n src={url}\n controls\n ref={forwardedRef as ForwardedRef<HTMLVideoElement>}\n />\n );\n } else if (type === 'application/pdf') {\n return (\n <iframe\n {...composableProps(props, { classNames: 'h-full w-full overflow-auto' })}\n src={url}\n title='PDF preview'\n ref={forwardedRef as ForwardedRef<HTMLIFrameElement>}\n />\n );\n } else {\n return (\n <a\n {...composableProps(props, { classNames: 'p-4 underline' })}\n href={url}\n download\n ref={forwardedRef as ForwardedRef<HTMLAnchorElement>}\n >\n Download file\n </a>\n );\n }\n },\n);\n"],
|
|
5
|
-
"mappings": ";;;AAKA,OAAOA,SAASC,mBAAmB;AACnC,SAASC,mBAAmB;AAE5B,SAASC,gBAAgB;AACzB,SAASC,sBAAsB;AAC/B,SAASC,UAAU;AAEnB,SAASC,YAAY;AACrB,SAASC,YAAYC,qBAAqB;AAOnC,IAAMC,YAAY,CAAC,EAAEC,QAAQC,SAAQ,MAAkB;AAC5D,QAAM,EAAEC,EAAC,IAAKR,eAAeE,KAAKO,QAAQC,GAAG;AAC7C,QAAMC,SAASZ,SAASa,eAAyCN,OAAOO,KAAKV,WAAWW,kBAAkB;AAE1G,QAAMC,iBAAiBlB,YAAY,CAACmB,UAAkBT,WAAWS,MAAM,CAAA,CAAE,GAAG;IAACT;GAAS;AAEtF,QAAM,EAAEU,eAAeC,cAAcC,eAAeC,WAAWC,cAAcC,aAAY,IAAKxB,YAAY;IACxGyB,UAAU;IACVZ;IACAa,SAASpB;IACTW;EACF,CAAA;AAEA,SACE,sBAAA,cAACU,OAAAA;IACE,GAAGP,aAAAA;IACJQ,WAAWzB,GACT,0DACAmB,aAAa,cACbC,gBAAgB,wBAChBC,gBAAgB,gBAAA;KAGlB,sBAAA,cAACK,SAAUR,cAAAA,CAAAA,GACVF,cAAc,CAAA,IAAK,sBAAA,cAACW,KAAAA,MAAGX,cAAc,CAAA,EAAGY,IAAI,IAAQ,sBAAA,cAACD,KAAAA,MAAGpB,EAAE,wBAAA,CAAA,CAAA;AAGjE;;;AC3CA,OAAOsB,YAA6B;AAEpC,SAASC,YAAYC,uBAAuB;AAOrC,IAAMC,cAAcF,WACzB,CAAC,EAAEG,MAAMC,KAAKC,UAAU,GAAGC,MAAAA,GAASC,iBAAAA;AAClC,MAAIJ,KAAKK,WAAW,QAAA,GAAW;AAC7B,WACE,gBAAAT,OAAA,cAACU,OAAAA;MACE,GAAGR,gBAAgBK,OAAO;QAAEI,YAAY;MAA+B,CAAA;MACxEC,KAAKP;MACLQ,KAAKL;;EAGX,WAAWJ,KAAKK,WAAW,QAAA,GAAW;AACpC,WACE,gBAAAT,OAAA,cAACc,SAAAA;MACE,GAAGZ,gBAAgBK,OAAO;QAAEI,YAAY;MAA+B,CAAA;MACxEC,KAAKP;MACLU,UAAAA;MACAF,KAAKL;;EAGX,WAAWJ,SAAS,mBAAmB;AACrC,WACE,gBAAAJ,OAAA,cAACgB,UAAAA;MACE,GAAGd,gBAAgBK,OAAO;QAAEI,YAAY;MAA8B,CAAA;MACvEC,KAAKP;MACLY,OAAM;MACNJ,KAAKL;;EAGX,OAAO;AACL,WACE,gBAAAR,OAAA,cAACkB,KAAAA;MACE,GAAGhB,gBAAgBK,OAAO;QAAEI,YAAY;MAAgB,CAAA;MACzDQ,MAAMd;MACNe,UAAAA;MACAP,KAAKL;OACN,eAAA;EAIL;AACF,CAAA;",
|
|
6
|
-
"names": ["React", "useCallback", "useDropzone", "SchemaEx", "useTranslation", "mx", "meta", "FileAction", "MAX_FILE_SIZE", "FileInput", "schema", "onChange", "t", "profile", "key", "accept", "findAnnotation", "ast", "UploadAnnotationId", "onDropAccepted", "files", "acceptedFiles", "getRootProps", "getInputProps", "isFocused", "isDragAccept", "isDragReject", "multiple", "maxSize", "div", "className", "input", "p", "name", "React", "composable", "composableProps", "FilePreview", "type", "url", "children", "props", "forwardedRef", "startsWith", "img", "classNames", "src", "ref", "video", "controls", "iframe", "title", "a", "href", "download"]
|
|
7
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import "../chunk-J5LGTIGS.mjs";
|
|
2
|
-
|
|
3
|
-
// src/containers/index.ts
|
|
4
|
-
import { lazy } from "react";
|
|
5
|
-
|
|
6
|
-
// src/containers/FileSettings/FileSettings.tsx
|
|
7
|
-
import React, { useCallback } from "react";
|
|
8
|
-
import { useCapabilities } from "@dxos/app-framework/ui";
|
|
9
|
-
import { Select, useTranslation } from "@dxos/react-ui";
|
|
10
|
-
import { Form } from "@dxos/react-ui-form";
|
|
11
|
-
import { meta } from "#meta";
|
|
12
|
-
import { FileCapabilities, Settings } from "#types";
|
|
13
|
-
var FileSettings = ({ settings, onSettingsChange }) => {
|
|
14
|
-
const { t } = useTranslation(meta.profile.key);
|
|
15
|
-
const backends = useCapabilities(FileCapabilities.Backend);
|
|
16
|
-
const requestedId = settings.backend ?? Settings.DEFAULT_BACKEND_ID;
|
|
17
|
-
const active = backends.find((b) => b.id === requestedId) ?? backends.find((b) => b.id === Settings.DEFAULT_BACKEND_ID);
|
|
18
|
-
const activeId = active?.id ?? Settings.DEFAULT_BACKEND_ID;
|
|
19
|
-
const handleChange = useCallback((value) => onSettingsChange?.((current) => ({
|
|
20
|
-
...current,
|
|
21
|
-
backend: value
|
|
22
|
-
})), [
|
|
23
|
-
onSettingsChange
|
|
24
|
-
]);
|
|
25
|
-
return /* @__PURE__ */ React.createElement(Form.Root, {
|
|
26
|
-
schema: Settings.Settings,
|
|
27
|
-
values: settings,
|
|
28
|
-
variant: "settings",
|
|
29
|
-
readonly: !onSettingsChange,
|
|
30
|
-
onValuesChanged: (values) => onSettingsChange?.((current) => ({
|
|
31
|
-
...current,
|
|
32
|
-
...values
|
|
33
|
-
}))
|
|
34
|
-
}, /* @__PURE__ */ React.createElement(Form.Viewport, {
|
|
35
|
-
scroll: true
|
|
36
|
-
}, /* @__PURE__ */ React.createElement(Form.Content, null, /* @__PURE__ */ React.createElement(Form.Section, {
|
|
37
|
-
title: meta.profile.name ?? meta.profile.key
|
|
38
|
-
}, /* @__PURE__ */ React.createElement(Form.Row, {
|
|
39
|
-
label: t("settings.backend.label"),
|
|
40
|
-
description: active?.description ?? t("settings.backend.description")
|
|
41
|
-
}, /* @__PURE__ */ React.createElement(Select.Root, {
|
|
42
|
-
value: activeId,
|
|
43
|
-
onValueChange: handleChange,
|
|
44
|
-
disabled: !onSettingsChange
|
|
45
|
-
}, /* @__PURE__ */ React.createElement(Select.TriggerButton, {
|
|
46
|
-
placeholder: t("settings.backend.placeholder")
|
|
47
|
-
}), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, backends.map((backend) => /* @__PURE__ */ React.createElement(Select.Option, {
|
|
48
|
-
key: backend.id,
|
|
49
|
-
value: backend.id
|
|
50
|
-
}, backend.name))), /* @__PURE__ */ React.createElement(Select.Arrow, null)))))))));
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// src/containers/index.ts
|
|
54
|
-
var FileArticle = lazy(() => import("../FileArticle-YU6NN3KN.mjs"));
|
|
55
|
-
export {
|
|
56
|
-
FileArticle,
|
|
57
|
-
FileSettings
|
|
58
|
-
};
|
|
59
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/containers/index.ts", "../../../../src/containers/FileSettings/FileSettings.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const FileArticle: ComponentType<any> = lazy(() => import('./FileArticle'));\n\nexport * from './FileSettings';\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Select, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { FileCapabilities, Settings } from '#types';\n\nexport type FileSettingsProps = AppSurface.SettingsProps<Settings.Settings>;\n\nexport const FileSettings = ({ settings, onSettingsChange }: FileSettingsProps) => {\n const { t } = useTranslation(meta.profile.key);\n const backends = useCapabilities(FileCapabilities.Backend);\n const requestedId = settings.backend ?? Settings.DEFAULT_BACKEND_ID;\n const active =\n backends.find((b) => b.id === requestedId) ?? backends.find((b) => b.id === Settings.DEFAULT_BACKEND_ID);\n // Use the resolved backend id so the Select never shows a missing/stale value.\n const activeId = active?.id ?? Settings.DEFAULT_BACKEND_ID;\n\n const handleChange = useCallback(\n (value: string) => onSettingsChange?.((current) => ({ ...current, backend: value })),\n [onSettingsChange],\n );\n\n return (\n <Form.Root\n schema={Settings.Settings}\n values={settings}\n variant='settings'\n readonly={!onSettingsChange}\n onValuesChanged={(values) => onSettingsChange?.((current) => ({ ...current, ...values }))}\n >\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={meta.profile.name ?? meta.profile.key}>\n <Form.Row\n label={t('settings.backend.label')}\n description={active?.description ?? t('settings.backend.description')}\n >\n <Select.Root value={activeId} onValueChange={handleChange} disabled={!onSettingsChange}>\n <Select.TriggerButton placeholder={t('settings.backend.placeholder')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {backends.map((backend) => (\n <Select.Option key={backend.id} value={backend.id}>\n {backend.name}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Form.Row>\n </Form.Section>\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAA6BA,YAAY;;;ACAzC,OAAOC,SAASC,mBAAmB;AAEnC,SAASC,uBAAuB;AAEhC,SAASC,QAAQC,sBAAsB;AACvC,SAASC,YAAY;AAErB,SAASC,YAAY;AACrB,SAASC,kBAAkBC,gBAAgB;AAIpC,IAAMC,eAAe,CAAC,EAAEC,UAAUC,iBAAgB,MAAqB;AAC5E,QAAM,EAAEC,EAAC,IAAKR,eAAeE,KAAKO,QAAQC,GAAG;AAC7C,QAAMC,WAAWb,gBAAgBK,iBAAiBS,OAAO;AACzD,QAAMC,cAAcP,SAASQ,WAAWV,SAASW;AACjD,QAAMC,SACJL,SAASM,KAAK,CAACC,MAAMA,EAAEC,OAAON,WAAAA,KAAgBF,SAASM,KAAK,CAACC,MAAMA,EAAEC,OAAOf,SAASW,kBAAkB;AAEzG,QAAMK,WAAWJ,QAAQG,MAAMf,SAASW;AAExC,QAAMM,eAAexB,YACnB,CAACyB,UAAkBf,mBAAmB,CAACgB,aAAa;IAAE,GAAGA;IAAST,SAASQ;EAAM,EAAA,GACjF;IAACf;GAAiB;AAGpB,SACE,sBAAA,cAACN,KAAKuB,MAAI;IACRC,QAAQrB,SAASA;IACjBsB,QAAQpB;IACRqB,SAAQ;IACRC,UAAU,CAACrB;IACXsB,iBAAiB,CAACH,WAAWnB,mBAAmB,CAACgB,aAAa;MAAE,GAAGA;MAAS,GAAGG;IAAO,EAAA;KAEtF,sBAAA,cAACzB,KAAK6B,UAAQ;IAACC,QAAAA;KACb,sBAAA,cAAC9B,KAAK+B,SAAO,MACX,sBAAA,cAAC/B,KAAKgC,SAAO;IAACC,OAAOhC,KAAKO,QAAQ0B,QAAQjC,KAAKO,QAAQC;KACrD,sBAAA,cAACT,KAAKmC,KAAG;IACPC,OAAO7B,EAAE,wBAAA;IACT8B,aAAatB,QAAQsB,eAAe9B,EAAE,8BAAA;KAEtC,sBAAA,cAACT,OAAOyB,MAAI;IAACF,OAAOF;IAAUmB,eAAelB;IAAcmB,UAAU,CAACjC;KACpE,sBAAA,cAACR,OAAO0C,eAAa;IAACC,aAAalC,EAAE,8BAAA;MACrC,sBAAA,cAACT,OAAO4C,QAAM,MACZ,sBAAA,cAAC5C,OAAOiC,SAAO,MACb,sBAAA,cAACjC,OAAO+B,UAAQ,MACbnB,SAASiC,IAAI,CAAC9B,YACb,sBAAA,cAACf,OAAO8C,QAAM;IAACnC,KAAKI,QAAQK;IAAIG,OAAOR,QAAQK;KAC5CL,QAAQqB,IAAI,CAAA,CAAA,GAInB,sBAAA,cAACpC,OAAO+C,OAAK,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAUjC;;;AD5DO,IAAMC,cAAkCC,KAAK,MAAM,OAAO,6BAAA,CAAA;",
|
|
6
|
-
"names": ["lazy", "React", "useCallback", "useCapabilities", "Select", "useTranslation", "Form", "meta", "FileCapabilities", "Settings", "FileSettings", "settings", "onSettingsChange", "t", "profile", "key", "backends", "Backend", "requestedId", "backend", "DEFAULT_BACKEND_ID", "active", "find", "b", "id", "activeId", "handleChange", "value", "current", "Root", "schema", "values", "variant", "readonly", "onValuesChanged", "Viewport", "scroll", "Content", "Section", "title", "name", "Row", "label", "description", "onValueChange", "disabled", "TriggerButton", "placeholder", "Portal", "map", "Option", "Arrow", "FileArticle", "lazy"]
|
|
7
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FileTooLargeError,
|
|
3
|
-
NoBackendError,
|
|
4
|
-
UnsupportedFileTypeError,
|
|
5
|
-
create_default,
|
|
6
|
-
resolveActiveBackend
|
|
7
|
-
} from "./chunk-ZUXUTRAJ.mjs";
|
|
8
|
-
import "./chunk-YODPX62X.mjs";
|
|
9
|
-
import "./chunk-J5LGTIGS.mjs";
|
|
10
|
-
export {
|
|
11
|
-
FileTooLargeError,
|
|
12
|
-
NoBackendError,
|
|
13
|
-
UnsupportedFileTypeError,
|
|
14
|
-
create_default as default,
|
|
15
|
-
resolveActiveBackend
|
|
16
|
-
};
|
|
17
|
-
//# sourceMappingURL=create-IUUG7RI6.mjs.map
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
-
|
|
3
|
-
// src/capabilities/create-object.ts
|
|
4
|
-
import * as Effect from "effect/Effect";
|
|
5
|
-
import { Capability } from "@dxos/app-framework";
|
|
6
|
-
import { Operation } from "@dxos/compute";
|
|
7
|
-
import { Type } from "@dxos/echo";
|
|
8
|
-
import { SpaceCapabilities, SpaceOperation } from "@dxos/plugin-space";
|
|
9
|
-
import { File, FileAction, FileOperation } from "#types";
|
|
10
|
-
var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
11
|
-
return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
|
|
12
|
-
id: Type.getTypename(File.File),
|
|
13
|
-
inputSchema: FileAction.CreateFileSchema,
|
|
14
|
-
createObject: (props, options) => Effect.gen(function* () {
|
|
15
|
-
const { object } = yield* Operation.invoke(FileOperation.Create, {
|
|
16
|
-
...props,
|
|
17
|
-
db: options.db
|
|
18
|
-
});
|
|
19
|
-
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
20
|
-
object,
|
|
21
|
-
target: options.target,
|
|
22
|
-
targetNodeId: options.targetNodeId
|
|
23
|
-
});
|
|
24
|
-
})
|
|
25
|
-
});
|
|
26
|
-
}));
|
|
27
|
-
export {
|
|
28
|
-
create_object_default as default
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=create-object-V667G4ZL.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/create-object.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { SpaceCapabilities, SpaceOperation } from '@dxos/plugin-space';\n\nimport { File, FileAction, FileOperation } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(File.File),\n inputSchema: FileAction.CreateFileSchema,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const { object } = yield* Operation.invoke(FileOperation.Create, { ...props, db: options.db });\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,mBAAmBC,sBAAsB;AAElD,SAASC,MAAMC,YAAYC,qBAAqB;AAEhD,IAAA,wBAAeP,WAAWQ,WACjBC,kBAAW,aAAA;AAChB,SAAOT,WAAWU,YAAYP,kBAAkBQ,mBAAmB;IACjEC,IAAIV,KAAKW,YAAYR,KAAKA,IAAI;IAC9BS,aAAaR,WAAWS;IACxBC,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAM,EAAEC,OAAM,IAAK,OAAOnB,UAAUoB,OAAOd,cAAce,QAAQ;QAAE,GAAGL;QAAOM,IAAIL,QAAQK;MAAG,CAAA;AAC5F,aAAO,OAAOtB,UAAUoB,OAAOjB,eAAeoB,WAAW;QACvDJ;QACAK,QAAQP,QAAQO;QAChBC,cAAcR,QAAQQ;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Operation", "Type", "SpaceCapabilities", "SpaceOperation", "File", "FileAction", "FileOperation", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "getTypename", "inputSchema", "CreateFileSchema", "createObject", "props", "options", "gen", "object", "invoke", "Create", "db", "AddObject", "target", "targetNodeId"]
|
|
7
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
-
|
|
3
|
-
// src/capabilities/file-uploader.ts
|
|
4
|
-
import * as Effect from "effect/Effect";
|
|
5
|
-
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
6
|
-
import { AppCapabilities } from "@dxos/app-toolkit";
|
|
7
|
-
import { EffectEx } from "@dxos/effect";
|
|
8
|
-
import { SpaceOperation } from "@dxos/plugin-space";
|
|
9
|
-
import { FileOperation } from "#types";
|
|
10
|
-
var file_uploader_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
11
|
-
const capabilities = yield* Capability.Service;
|
|
12
|
-
return Capability.contributes(AppCapabilities.FileUploader, (db, file) => {
|
|
13
|
-
const { invoke } = capabilities.get(Capabilities.OperationInvoker);
|
|
14
|
-
const program = Effect.gen(function* () {
|
|
15
|
-
const { object } = yield* invoke(FileOperation.Create, {
|
|
16
|
-
db,
|
|
17
|
-
file
|
|
18
|
-
});
|
|
19
|
-
yield* invoke(SpaceOperation.AddObject, {
|
|
20
|
-
target: db,
|
|
21
|
-
object
|
|
22
|
-
});
|
|
23
|
-
const external = object.data._tag === "external" ? object.data : void 0;
|
|
24
|
-
return {
|
|
25
|
-
name: object.name ?? file.name,
|
|
26
|
-
type: object.type,
|
|
27
|
-
...external?.url ? {
|
|
28
|
-
url: external.url
|
|
29
|
-
} : {},
|
|
30
|
-
...external?.cid ? {
|
|
31
|
-
cid: external.cid
|
|
32
|
-
} : {}
|
|
33
|
-
};
|
|
34
|
-
});
|
|
35
|
-
return EffectEx.runAndForwardErrors(program);
|
|
36
|
-
});
|
|
37
|
-
}));
|
|
38
|
-
export {
|
|
39
|
-
file_uploader_default as default
|
|
40
|
-
};
|
|
41
|
-
//# sourceMappingURL=file-uploader-BCJH6TUL.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/file-uploader.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { EffectEx } from '@dxos/effect';\nimport { SpaceOperation } from '@dxos/plugin-space';\n\nimport { FileOperation } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n\n return Capability.contributes(AppCapabilities.FileUploader, (db, file) => {\n const { invoke } = capabilities.get(Capabilities.OperationInvoker);\n const program = Effect.gen(function* () {\n const { object } = yield* invoke(FileOperation.Create, { db, file });\n yield* invoke(SpaceOperation.AddObject, { target: db, object });\n const external = object.data._tag === 'external' ? object.data : undefined;\n return {\n name: object.name ?? file.name,\n type: object.type,\n ...(external?.url ? { url: external.url } : {}),\n ...(external?.cid ? { cid: external.cid } : {}),\n };\n });\n\n return EffectEx.runAndForwardErrors(program);\n });\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,uBAAuB;AAChC,SAASC,gBAAgB;AACzB,SAASC,sBAAsB;AAE/B,SAASC,qBAAqB;AAE9B,IAAA,wBAAeJ,WAAWK,WACjBC,kBAAW,aAAA;AAChB,QAAMC,eAAe,OAAOP,WAAWQ;AAEvC,SAAOR,WAAWS,YAAYR,gBAAgBS,cAAc,CAACC,IAAIC,SAAAA;AAC/D,UAAM,EAAEC,OAAM,IAAKN,aAAaO,IAAIf,aAAagB,gBAAgB;AACjE,UAAMC,UAAiBC,WAAI,aAAA;AACzB,YAAM,EAAEC,OAAM,IAAK,OAAOL,OAAOT,cAAce,QAAQ;QAAER;QAAIC;MAAK,CAAA;AAClE,aAAOC,OAAOV,eAAeiB,WAAW;QAAEC,QAAQV;QAAIO;MAAO,CAAA;AAC7D,YAAMI,WAAWJ,OAAOK,KAAKC,SAAS,aAAaN,OAAOK,OAAOE;AACjE,aAAO;QACLC,MAAMR,OAAOQ,QAAQd,KAAKc;QAC1BC,MAAMT,OAAOS;QACb,GAAIL,UAAUM,MAAM;UAAEA,KAAKN,SAASM;QAAI,IAAI,CAAC;QAC7C,GAAIN,UAAUO,MAAM;UAAEA,KAAKP,SAASO;QAAI,IAAI,CAAC;MAC/C;IACF,CAAA;AAEA,WAAO3B,SAAS4B,oBAAoBd,OAAAA;EACtC,CAAA;AACF,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capabilities", "Capability", "AppCapabilities", "EffectEx", "SpaceOperation", "FileOperation", "makeModule", "fnUntraced", "capabilities", "Service", "contributes", "FileUploader", "db", "file", "invoke", "get", "OperationInvoker", "program", "gen", "object", "Create", "AddObject", "target", "external", "data", "_tag", "undefined", "name", "type", "url", "cid", "runAndForwardErrors"]
|
|
7
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SKILL_KEY,
|
|
3
|
-
file_skill_default
|
|
4
|
-
} from "./chunk-GMYSEHV4.mjs";
|
|
5
|
-
import {
|
|
6
|
-
ACCEPTED_MIME,
|
|
7
|
-
File,
|
|
8
|
-
FileAction,
|
|
9
|
-
FileCapabilities_exports,
|
|
10
|
-
FileOperation_exports,
|
|
11
|
-
MAX_FILE_SIZE,
|
|
12
|
-
Settings_exports,
|
|
13
|
-
isAcceptedMimeType
|
|
14
|
-
} from "./chunk-YODPX62X.mjs";
|
|
15
|
-
import {
|
|
16
|
-
meta
|
|
17
|
-
} from "./chunk-LBZ4MCLI.mjs";
|
|
18
|
-
import "./chunk-J5LGTIGS.mjs";
|
|
19
|
-
export {
|
|
20
|
-
ACCEPTED_MIME,
|
|
21
|
-
File,
|
|
22
|
-
FileAction,
|
|
23
|
-
FileCapabilities_exports as FileCapabilities,
|
|
24
|
-
FileOperation_exports as FileOperation,
|
|
25
|
-
file_skill_default as FileSkill,
|
|
26
|
-
MAX_FILE_SIZE,
|
|
27
|
-
SKILL_KEY,
|
|
28
|
-
Settings_exports as Settings,
|
|
29
|
-
isAcceptedMimeType,
|
|
30
|
-
meta
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FileTooLargeError,
|
|
3
|
-
UnsupportedFileTypeError
|
|
4
|
-
} from "./chunk-ZUXUTRAJ.mjs";
|
|
5
|
-
import "./chunk-YODPX62X.mjs";
|
|
6
|
-
import "./chunk-J5LGTIGS.mjs";
|
|
7
|
-
|
|
8
|
-
// src/capabilities/inline-backend.ts
|
|
9
|
-
import * as Effect from "effect/Effect";
|
|
10
|
-
import { Capability } from "@dxos/app-framework";
|
|
11
|
-
import { File, FileCapabilities, MAX_FILE_SIZE, Settings, isAcceptedMimeType } from "#types";
|
|
12
|
-
var inlineBackend = {
|
|
13
|
-
id: Settings.DEFAULT_BACKEND_ID,
|
|
14
|
-
name: "Inline (ECHO)",
|
|
15
|
-
description: "Store the file bytes directly inside the ECHO document. Capped at 4MB; images, videos, and PDFs only.",
|
|
16
|
-
upload: async (file) => {
|
|
17
|
-
if (!isAcceptedMimeType(file.type)) {
|
|
18
|
-
throw new UnsupportedFileTypeError(file.type);
|
|
19
|
-
}
|
|
20
|
-
if (file.size > MAX_FILE_SIZE) {
|
|
21
|
-
throw new FileTooLargeError(file.size);
|
|
22
|
-
}
|
|
23
|
-
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
24
|
-
return {
|
|
25
|
-
name: file.name,
|
|
26
|
-
type: file.type,
|
|
27
|
-
size: bytes.byteLength,
|
|
28
|
-
data: File.inlineData(bytes)
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
var inline_backend_default = Capability.makeModule(() => Effect.succeed(Capability.contributes(FileCapabilities.Backend, inlineBackend)));
|
|
33
|
-
export {
|
|
34
|
-
inline_backend_default as default,
|
|
35
|
-
inlineBackend
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=inline-backend-FGGGDYRB.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/inline-backend.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\n\nimport { File, FileCapabilities, MAX_FILE_SIZE, Settings, isAcceptedMimeType } from '#types';\n\nimport { FileTooLargeError, UnsupportedFileTypeError } from '../operations/create';\n\n/**\n * Inline backend: file bytes are stored on the ECHO object itself.\n * Exported standalone for direct testing.\n */\nexport const inlineBackend: FileCapabilities.Backend = {\n id: Settings.DEFAULT_BACKEND_ID,\n name: 'Inline (ECHO)',\n description: 'Store the file bytes directly inside the ECHO document. Capped at 4MB; images, videos, and PDFs only.',\n upload: async (file) => {\n if (!isAcceptedMimeType(file.type)) {\n throw new UnsupportedFileTypeError(file.type);\n }\n // Check size before reading into memory to avoid allocating a large buffer.\n if (file.size > MAX_FILE_SIZE) {\n throw new FileTooLargeError(file.size);\n }\n const bytes = new Uint8Array(await file.arrayBuffer());\n return {\n name: file.name,\n type: file.type,\n size: bytes.byteLength,\n data: File.inlineData(bytes),\n };\n },\n};\n\nexport default Capability.makeModule(() =>\n Effect.succeed(Capability.contributes(FileCapabilities.Backend, inlineBackend)),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAE3B,SAASC,MAAMC,kBAAkBC,eAAeC,UAAUC,0BAA0B;AAQ7E,IAAMC,gBAA0C;EACrDC,IAAIC,SAASC;EACbC,MAAM;EACNC,aAAa;EACbC,QAAQ,OAAOC,SAAAA;AACb,QAAI,CAACC,mBAAmBD,KAAKE,IAAI,GAAG;AAClC,YAAM,IAAIC,yBAAyBH,KAAKE,IAAI;IAC9C;AAEA,QAAIF,KAAKI,OAAOC,eAAe;AAC7B,YAAM,IAAIC,kBAAkBN,KAAKI,IAAI;IACvC;AACA,UAAMG,QAAQ,IAAIC,WAAW,MAAMR,KAAKS,YAAW,CAAA;AACnD,WAAO;MACLZ,MAAMG,KAAKH;MACXK,MAAMF,KAAKE;MACXE,MAAMG,MAAMG;MACZC,MAAMC,KAAKC,WAAWN,KAAAA;IACxB;EACF;AACF;AAEA,IAAA,yBAAeO,WAAWC,WAAW,MAC5BC,eAAQF,WAAWG,YAAYC,iBAAiBC,SAAS1B,aAAAA,CAAAA,CAAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "File", "FileCapabilities", "MAX_FILE_SIZE", "Settings", "isAcceptedMimeType", "inlineBackend", "id", "Settings", "DEFAULT_BACKEND_ID", "name", "description", "upload", "file", "isAcceptedMimeType", "type", "UnsupportedFileTypeError", "size", "MAX_FILE_SIZE", "FileTooLargeError", "bytes", "Uint8Array", "arrayBuffer", "byteLength", "data", "File", "inlineData", "Capability", "makeModule", "succeed", "contributes", "FileCapabilities", "Backend"]
|
|
7
|
-
}
|