summaryrefslogtreecommitdiff
path: root/apps/web/src/project/transfer/index.ts
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-07-27 01:21:20 +0200
committercashmere <cashmere@autistici.org>2026-07-27 01:21:20 +0200
commit30a36e45686db503fded68e4da5d4c465a06f978 (patch)
tree2dbe5e2aaef543155b021f5f4c504fad77b40648 /apps/web/src/project/transfer/index.ts
parentd55d2583a71ae35fa8d0d1bfbec975e67e66aafa (diff)
downloadopencut-30a36e45686db503fded68e4da5d4c465a06f978.tar.gz
feat: single-file project import/export (.ocp)
fflate zip container: project.json (serialized project incl. schema version) + media files with a manifest. Export gathers all project media (missing blobs warn, never abort) after save-flush; import validates everything before any write, migrates older archives through the storage migration registry, remaps media ids, and creates a new project with rollback on failure. Entry points: projects page import/export, editor header menu, export-project-archive action. 29 tests incl. full round-trip.
Diffstat (limited to 'apps/web/src/project/transfer/index.ts')
-rw-r--r--apps/web/src/project/transfer/index.ts16
1 files changed, 16 insertions, 0 deletions
diff --git a/apps/web/src/project/transfer/index.ts b/apps/web/src/project/transfer/index.ts
new file mode 100644
index 00000000..81d97a6a
--- /dev/null
+++ b/apps/web/src/project/transfer/index.ts
@@ -0,0 +1,16 @@
+export {
+ PROJECT_ARCHIVE_EXTENSION,
+ ProjectArchiveError,
+} from "./container";
+export type {
+ ArchivedMediaEntry,
+ ArchivedMediaMetadata,
+} from "./container";
+export {
+ exportProjectArchive,
+ importProjectArchive,
+} from "./archive";
+export type {
+ ExportProjectArchiveResult,
+ ImportProjectArchiveResult,
+} from "./archive";