diff --git a/packages/pptx-core/package.json b/packages/pptx-core/package.json index 4a3bfa8..e7e6dfc 100644 --- a/packages/pptx-core/package.json +++ b/packages/pptx-core/package.json @@ -47,6 +47,7 @@ "dependencies": { "@arcships/office-interaction": "^0.6.0", "echarts": "^6.0.0", + "fflate": "^0.8.2", "jszip": "^3.10.1" }, "devDependencies": { diff --git a/packages/pptx-core/tsup.config.ts b/packages/pptx-core/tsup.config.ts index bd691d2..bae2a3c 100644 --- a/packages/pptx-core/tsup.config.ts +++ b/packages/pptx-core/tsup.config.ts @@ -11,7 +11,6 @@ export default defineConfig({ noExternal: [ /^@arcships\/office-runtime/u, /^@aiden0z\/pptx-renderer$/u, - /^fflate$/u, ], skipNodeModulesBundle: true, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8347d9..d41c453 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,6 +134,9 @@ importers: echarts: specifier: ^6.0.0 version: 6.1.0 + fflate: + specifier: ^0.8.2 + version: 0.8.3 jszip: specifier: ^3.10.1 version: 3.10.1 diff --git a/scripts/ci/pack-consumer.mjs b/scripts/ci/pack-consumer.mjs index 4409080..1059e69 100644 --- a/scripts/ci/pack-consumer.mjs +++ b/scripts/ci/pack-consumer.mjs @@ -190,6 +190,10 @@ try { path.join(consumerDir, "public", "fixtures", file), ); } + cpSync( + path.join(root, "tests", "fixtures", "pptx", "playback-controlled.pptx"), + path.join(consumerDir, "public", "fixtures", "playback-controlled.pptx"), + ); const packageJson = { name: "agentic-office-tgz-consumer", diff --git a/scripts/ci/verify-pptx-consumer.mjs b/scripts/ci/verify-pptx-consumer.mjs index fd55320..a706722 100644 --- a/scripts/ci/verify-pptx-consumer.mjs +++ b/scripts/ci/verify-pptx-consumer.mjs @@ -10,6 +10,7 @@ import { fileURLToPath } from "node:url" const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..") const coreVersion = JSON.parse(readFileSync(path.join(root, "packages/pptx-core/package.json"), "utf8")).version const vueVersion = JSON.parse(readFileSync(path.join(root, "packages/vue-pptx/package.json"), "utf8")).version +const interactionVersion = JSON.parse(readFileSync(path.join(root, "packages/office-interaction/package.json"), "utf8")).version const temporary = mkdtempSync(path.join(tmpdir(), "pptx-consumer-")) const packages = path.join(temporary, "packages") const consumer = path.join(temporary, "consumer") @@ -57,8 +58,10 @@ async function waitForServer(url) { try { run("pnpm", ["pack", "--pack-destination", packages], path.join(root, "packages/pptx-core")) run("pnpm", ["pack", "--pack-destination", packages], path.join(root, "packages/vue-pptx")) + run("pnpm", ["pack", "--pack-destination", packages], path.join(root, "packages/office-interaction")) const core = path.join(packages, `arcships-pptx-core-${coreVersion}.tgz`) const vuePptx = path.join(packages, `arcships-vue-pptx-${vueVersion}.tgz`) + const interaction = path.join(packages, `arcships-office-interaction-${interactionVersion}.tgz`) const coreManifest = JSON.parse(run("tar", ["-xOf", core, "package/package.json"], root)) const browserBundle = run("tar", ["-xOf", core, "package/dist/browser.js"], root) if (coreManifest.dependencies?.["@aiden0z/pptx-renderer"]) { @@ -82,7 +85,12 @@ try { vue: "^3.5.0", }, devDependencies: { typescript: "^5.0.0", vite: "^6.0.0" }, - pnpm: { overrides: { "@arcships/pptx-core": `file:${core}` } }, + pnpm: { + overrides: { + "@arcships/pptx-core": `file:${core}`, + "@arcships/office-interaction": `file:${interaction}`, + }, + }, }, null, 2)) writeFileSync(path.join(consumer, "tsconfig.json"), JSON.stringify({ compilerOptions: { diff --git a/tests/consumer/template/src/App.vue b/tests/consumer/template/src/App.vue index 00b1012..035c680 100644 --- a/tests/consumer/template/src/App.vue +++ b/tests/consumer/template/src/App.vue @@ -40,6 +40,19 @@

{{ xlsxSelectedValue }}

+
+

PPTX

+

{{ pptxState }}

+

{{ pptxError }}

+ +

PDF

{{ pdfState }}

@@ -71,6 +84,8 @@ import xlsxWorkerUrl from "@arcships/xlsx-core/worker?worker&url"; import xlsxWasmUrl from "@arcships/xlsx-core/assets/duke_sheets_wasm_bg.wasm?url"; import { DocxEditor, DocxViewer } from "@arcships/vue-docx"; import { XlsxViewer, useXlsxViewerController, type XlsxDiagnostic } from "@arcships/vue-xlsx"; +import { PptxViewer } from "@arcships/vue-pptx"; +import type { PptxPreviewError } from "@arcships/pptx-core"; import { DEFAULT_PDF_MAX_FILE_SIZE, PdfViewer, @@ -88,6 +103,9 @@ const docxState = ref("loading"); const docxSource = ref("pending"); const pdfState = ref("loading"); const pdfError = ref(""); +const pptxFile = shallowRef(); +const pptxState = ref("loading"); +const pptxError = ref(""); const origin = globalThis.location.origin; function addDiagnostic(event: unknown) { @@ -151,12 +169,14 @@ const overallState = computed(() => { docxState.value === "error" || xlsxController.sourceState === "error" || xlsxWorkerController.sourceState === "error" || + pptxState.value === "error" || pdfState.value === "error" ) return "error"; if ( docxState.value === "ready" && xlsxController.sourceState === "ready" && xlsxWorkerController.sourceState === "ready" && + pptxState.value === "ready" && pdfState.value === "ready" ) return "ready"; return "loading"; @@ -171,6 +191,14 @@ onMounted(async () => { docxState.value = "error"; addDiagnostic({ package: "docx", type: "fixture-error", message: String(error) }); } + try { + const response = await fetch("/fixtures/playback-controlled.pptx"); + if (!response.ok) throw new Error(`fixture request failed: ${response.status}`); + pptxFile.value = await response.arrayBuffer(); + } catch (error) { + pptxState.value = "error"; + addDiagnostic({ package: "pptx", type: "fixture-error", message: String(error) }); + } }); function onDocxSuccess(result: DocxImportResult) { @@ -184,6 +212,16 @@ function onDocxError(error: Error) { addDiagnostic({ package: "docx", type: "load-error", message: error.message }); } +function onPptxSuccess() { + pptxState.value = "ready"; +} + +function onPptxError(error: PptxPreviewError) { + pptxState.value = "error"; + pptxError.value = `${error.code}: ${error.message}`; + addDiagnostic({ package: "pptx", type: "load-error", message: error.message }); +} + function onPdfSuccess() { pdfState.value = "ready"; } diff --git a/tests/consumer/template/src/main.ts b/tests/consumer/template/src/main.ts index 207be49..d3773ae 100644 --- a/tests/consumer/template/src/main.ts +++ b/tests/consumer/template/src/main.ts @@ -2,6 +2,7 @@ import { createApp } from "vue"; import "@arcships/vue-docx/style.css"; import "@arcships/vue-xlsx/style.css"; import "@arcships/vue-pdf/style.css"; +import "@arcships/vue-pptx/style.css"; import App from "./App.vue"; import "./package-contract"; diff --git a/tests/consumer/template/src/package-contract.ts b/tests/consumer/template/src/package-contract.ts index ed4b782..daf745f 100644 --- a/tests/consumer/template/src/package-contract.ts +++ b/tests/consumer/template/src/package-contract.ts @@ -75,6 +75,15 @@ import { type PptxOfficeReferenceDraft, type PptxReferenceContext, } from "@arcships/pptx-core"; +import { + createPptxDocumentSession, + createPptxPreviewSession, + type PptxDocumentSession, + type PptxDocumentSessionOptions, + type PptxPreviewSession, + type PptxPreviewSessionOptions, + type PptxPreviewSource, +} from "@arcships/pptx-core/browser"; import { DocxContextMenu, DocxDragOverlay, @@ -124,6 +133,12 @@ import { type LegendItem, type XlsxDiagnostic, } from "@arcships/vue-xlsx"; +import { MemoChartSvg as MemoChartSvgFromSubpath } from "@arcships/vue-xlsx/chart"; +import { + buildRegionMapLegendItems, + normalizeRegionMapKey, +} from "@arcships/vue-xlsx/map"; +import { MemoSurfaceChartComposite as MemoSurfaceChartCompositeFromSubpath } from "@arcships/vue-xlsx/webgl"; import { DEFAULT_PDF_MAX_FILE_SIZE, PdfViewer, @@ -144,6 +159,17 @@ import { type PdfRenderRuntimeConfig, type PdfSource, } from "@arcships/vue-pdf"; +import { + PptxStage, + PptxThumbnail, + PptxViewer, + usePptxDocument, + usePptxPlayback, + type PptxPreviewDocument, + type PptxStageExpose, + type UsePptxDocumentReturn, + type UsePptxPlaybackReturn, +} from "@arcships/vue-pptx"; import { FileUpload, OfficeObjectOutlineLayer, @@ -230,6 +256,17 @@ export const publicRuntimeExports = { describePptxReference, pptxReferenceKindForObject, resolvePptxReference, + createPptxDocumentSession, + createPptxPreviewSession, + PptxStage, + PptxThumbnail, + PptxViewer, + usePptxDocument, + usePptxPlayback, + MemoChartSvgFromSubpath, + buildRegionMapLegendItems, + normalizeRegionMapKey, + MemoSurfaceChartCompositeFromSubpath, FileUpload, }; @@ -297,6 +334,15 @@ export type PublicTypeExports = { pptxOfficeReferenceDraft: PptxOfficeReferenceDraft; pptxObjectReferenceOptions: PptxObjectReferenceOptions; pptxReferenceContext: PptxReferenceContext; + pptxDocumentSession: PptxDocumentSession; + pptxDocumentSessionOptions: PptxDocumentSessionOptions; + pptxPreviewSession: PptxPreviewSession; + pptxPreviewSessionOptions: PptxPreviewSessionOptions; + pptxPreviewSource: PptxPreviewSource; + pptxPreviewDocument: PptxPreviewDocument; + pptxStageExpose: PptxStageExpose; + pptxDocumentComposable: UsePptxDocumentReturn; + pptxPlaybackComposable: UsePptxPlaybackReturn; docxEditorOptions: UseDocxEditorOptions; xlsxDiagnostic: XlsxDiagnostic; pdfSource: PdfSource;