import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; type Surface = { id: string; kind: string; authorityUrls: string[]; communityReferenceUrls?: string[]; versionSource: string; inventoryArtifact: string | null; inventoryState: string; implementationState: string; inventoryCommand?: string; inventoryVerificationCommand?: string; inventoryDocumentation?: string; benchmarkEvidenceCommand?: string; benchmarkEvidenceSchema?: string; addonReceiptCommand?: string; addonReceiptVerificationCommand?: string; addonReceiptDocumentation?: string; ccxReceiptCommand?: string; ccxReceiptVerificationCommand?: string; ccxReceiptDocumentation?: string; ccxReceiptSchemaVersion?: number; betaAafExportOptionsDriftArtifact?: string; betaAafExportOptionsDriftCommand?: string; betaAafExportOptionsDriftVerificationCommand?: string; betaAafExportOptionsDriftDocumentation?: string; betaProjectOptionsDriftArtifact?: string; betaProjectOptionsDriftCommand?: string; betaProjectOptionsDriftVerificationCommand?: string; betaProjectOptionsDriftDocumentation?: string; betaTransitionOptionsDriftArtifact?: string; betaTransitionOptionsDriftCommand?: string; betaTransitionOptionsDriftVerificationCommand?: string; betaTransitionOptionsDriftDocumentation?: string; betaRectFDriftArtifact?: string; betaRectFDriftCommand?: string; betaRectFDriftVerificationCommand?: string; betaRectFDriftDocumentation?: string; betaColorDriftArtifact?: string; betaColorDriftCommand?: string; betaColorDriftVerificationCommand?: string; betaColorDriftDocumentation?: string; betaPointFDriftArtifact?: string; betaPointFDriftCommand?: string; betaPointFDriftVerificationCommand?: string; betaPointFDriftDocumentation?: string; betaGuidDriftArtifact?: string; betaGuidDriftCommand?: string; betaGuidDriftVerificationCommand?: string; betaGuidDriftDocumentation?: string; betaFrameRateDriftArtifact?: string; betaFrameRateDriftCommand?: string; betaFrameRateDriftVerificationCommand?: string; betaFrameRateDriftDocumentation?: string; betaTickTimeDriftArtifact?: string; betaTickTimeDriftCommand?: string; betaTickTimeDriftVerificationCommand?: string; betaTickTimeDriftDocumentation?: string; betaC2paDriftArtifact?: string; betaC2paDriftCommand?: string; betaC2paDriftVerificationCommand?: string; betaC2paDriftDocumentation?: string; betaMediaDriftArtifact?: string; betaMediaDriftCommand?: string; betaMediaDriftVerificationCommand?: string; betaMediaDriftDocumentation?: string; betaMediaManagerDriftArtifact?: string; betaMediaManagerDriftCommand?: string; betaMediaManagerDriftVerificationCommand?: string; betaMediaManagerDriftDocumentation?: string; betaTranscriptDriftArtifact?: string; betaTranscriptDriftCommand?: string; betaTranscriptDriftVerificationCommand?: string; betaTranscriptDriftDocumentation?: string; betaWorkAreaDriftArtifact?: string; betaWorkAreaDriftCommand?: string; betaWorkAreaDriftVerificationCommand?: string; betaWorkAreaDriftDocumentation?: string; notes: string; }; type Competitor = { repository: string; commit: string; observedAt: string; featureFamilies: string[]; adoptionBoundary: string; }; const registry = JSON.parse(readFileSync("src/resources/premiere-surface-registry.json", "utf8")) as { schemaVersion: number; researchedAt: string; completionPolicy: string; integrationSurfaces: Surface[]; competitorSources: Competitor[]; }; describe("Premiere API and competitor surface registry", () => { it("enumerates every official surface family without overstating completion", () => { expect(registry.schemaVersion).toBe(1); expect(registry.researchedAt).toMatch(/^\d{4}-\d{2}-\d{2}$/); expect(registry.completionPolicy).toContain("every item is classified"); expect(registry.integrationSurfaces.map((surface) => surface.id)).toEqual([ "premiere-dom", "uxp-javascript", "uxp-html", "uxp-css", "spectrum-web-components", "uxp-plugin-guides", "uxp-hybrid-cpp", "premiere-cpp-sdk", "cep-extendscript", "cep-platform", "qe-dom", ]); expect(new Set(registry.integrationSurfaces.map((surface) => surface.id)).size) .toBe(registry.integrationSurfaces.length); const inventoryStates = new Set([ "complete", "partial", "not_started", "blocked_external_artifact", "unavailable_authoritative_source", ]); const implementationStates = new Set(["partial", "gated", "not_started", "experimental"]); for (const surface of registry.integrationSurfaces) { if (surface.kind === "undocumented_api") { expect(surface.authorityUrls).toEqual([]); } else { expect(surface.authorityUrls.length).toBeGreaterThan(0); for (const url of surface.authorityUrls) expect(url).toMatch(/^https:\/\//); } for (const url of surface.communityReferenceUrls ?? []) expect(url).toMatch(/^https:\/\//); expect(surface.versionSource.length).toBeGreaterThan(0); expect(surface.notes.length).toBeGreaterThan(20); expect(inventoryStates.has(surface.inventoryState)).toBe(true); expect(implementationStates.has(surface.implementationState)).toBe(true); if (surface.inventoryState === "complete") { expect(surface.inventoryArtifact).toBeTruthy(); } } expect(registry.integrationSurfaces.find((surface) => surface.id === "premiere-dom")) .toMatchObject({ inventoryState: "complete", implementationState: "partial", betaAafExportOptionsDriftArtifact: "dist/resources/adobe-beta-aaf-export-options-drift.json", betaAafExportOptionsDriftCommand: "npm run adobe:beta-aaf-export-options-drift", betaAafExportOptionsDriftVerificationCommand: "npm run adobe:beta-aaf-export-options-drift:check", betaAafExportOptionsDriftDocumentation: "docs/adobe-beta-aaf-export-options-drift.md", betaProjectOptionsDriftArtifact: "dist/resources/adobe-beta-project-options-drift.json", betaProjectOptionsDriftCommand: "npm run adobe:beta-project-options-drift", betaProjectOptionsDriftVerificationCommand: "npm run adobe:beta-project-options-drift:check", betaProjectOptionsDriftDocumentation: "docs/adobe-beta-project-options-drift.md", betaTransitionOptionsDriftArtifact: "dist/resources/adobe-beta-transition-options-drift.json", betaTransitionOptionsDriftCommand: "npm run adobe:beta-transition-options-drift", betaTransitionOptionsDriftVerificationCommand: "npm run adobe:beta-transition-options-drift:check", betaTransitionOptionsDriftDocumentation: "docs/adobe-beta-transition-options-drift.md", betaRectFDriftArtifact: "dist/resources/adobe-beta-rectf-drift.json", betaRectFDriftCommand: "npm run adobe:beta-rectf-drift", betaRectFDriftVerificationCommand: "npm run adobe:beta-rectf-drift:check", betaRectFDriftDocumentation: "docs/adobe-beta-rectf-drift.md", betaColorDriftArtifact: "dist/resources/adobe-beta-color-drift.json", betaColorDriftCommand: "npm run adobe:beta-color-drift", betaColorDriftVerificationCommand: "npm run adobe:beta-color-drift:check", betaColorDriftDocumentation: "docs/adobe-beta-color-drift.md", betaPointFDriftArtifact: "dist/resources/adobe-beta-pointf-drift.json", betaPointFDriftCommand: "npm run adobe:beta-pointf-drift", betaPointFDriftVerificationCommand: "npm run adobe:beta-pointf-drift:check", betaPointFDriftDocumentation: "docs/adobe-beta-pointf-drift.md", betaGuidDriftArtifact: "dist/resources/adobe-beta-guid-drift.json", betaGuidDriftCommand: "npm run adobe:beta-guid-drift", betaGuidDriftVerificationCommand: "npm run adobe:beta-guid-drift:check", betaGuidDriftDocumentation: "docs/adobe-beta-guid-drift.md", betaFrameRateDriftArtifact: "dist/resources/adobe-beta-frame-rate-drift.json", betaFrameRateDriftCommand: "npm run adobe:beta-frame-rate-drift", betaFrameRateDriftVerificationCommand: "npm run adobe:beta-frame-rate-drift:check", betaFrameRateDriftDocumentation: "docs/adobe-beta-frame-rate-drift.md", betaTickTimeDriftArtifact: "dist/resources/adobe-beta-tick-time-drift.json", betaTickTimeDriftCommand: "npm run adobe:beta-tick-time-drift", betaTickTimeDriftVerificationCommand: "npm run adobe:beta-tick-time-drift:check", betaTickTimeDriftDocumentation: "docs/adobe-beta-tick-time-drift.md", betaC2paDriftArtifact: "dist/resources/adobe-beta-c2pa-drift.json", betaC2paDriftCommand: "npm run adobe:beta-c2pa-drift", betaC2paDriftVerificationCommand: "npm run adobe:beta-c2pa-drift:check", betaC2paDriftDocumentation: "docs/adobe-beta-c2pa-drift.md", betaMediaDriftArtifact: "dist/resources/adobe-beta-media-drift.json", betaMediaDriftCommand: "npm run adobe:beta-media-drift", betaMediaDriftVerificationCommand: "npm run adobe:beta-media-drift:check", betaMediaDriftDocumentation: "docs/adobe-beta-media-drift.md", betaMediaManagerDriftArtifact: "dist/resources/adobe-beta-media-manager-drift.json", betaMediaManagerDriftCommand: "npm run adobe:beta-media-manager-drift", betaMediaManagerDriftVerificationCommand: "npm run adobe:beta-media-manager-drift:check", betaMediaManagerDriftDocumentation: "docs/adobe-beta-media-manager-drift.md", betaTranscriptDriftArtifact: "dist/resources/adobe-beta-transcript-drift.json", betaTranscriptDriftCommand: "npm run adobe:beta-transcript-drift", betaTranscriptDriftVerificationCommand: "npm run adobe:beta-transcript-drift:check", betaTranscriptDriftDocumentation: "docs/adobe-beta-transcript-drift.md", betaWorkAreaDriftArtifact: "dist/resources/adobe-beta-work-area-drift.json", betaWorkAreaDriftCommand: "npm run adobe:beta-work-area-drift", betaWorkAreaDriftVerificationCommand: "npm run adobe:beta-work-area-drift:check", betaWorkAreaDriftDocumentation: "docs/adobe-beta-work-area-drift.md", }); expect(registry.integrationSurfaces.find((surface) => surface.id === "uxp-javascript")) .toMatchObject({ versionSource: "@adobe/cc-ext-uxp-types@7.3.1", inventoryArtifact: "dist/resources/uxp-js-api-inventory.json", inventoryState: "complete", implementationState: "partial", }); expect(registry.integrationSurfaces.find((surface) => surface.id === "cep-extendscript")) .toMatchObject({ authorityUrls: ["https://github.com/Adobe-CEP/Samples/tree/master/PProPanel"], communityReferenceUrls: [ "https://ppro-scripting.docsforadobe.dev/", "https://github.com/docsforadobe/premiere-scripting-guide", ], inventoryArtifact: "dist/resources/extendscript-api-inventory.json", inventoryState: "complete", implementationState: "partial", }); expect(registry.integrationSurfaces.find((surface) => surface.id === "cep-platform")) .toMatchObject({ inventoryArtifact: "dist/resources/cep-reference-inventory.json", inventoryState: "complete", implementationState: "partial", }); expect(registry.integrationSurfaces.filter((surface) => surface.inventoryState === "complete")) .toHaveLength(8); for (const id of ["uxp-hybrid-cpp", "premiere-cpp-sdk"]) { expect(registry.integrationSurfaces.find((surface) => surface.id === id)).toMatchObject({ inventoryArtifact: null, inventoryState: "blocked_external_artifact", inventoryCommand: "npm run native:sdk-header-inventory", inventoryVerificationCommand: "npm run native:sdk-header-inventory:verify", inventoryDocumentation: "docs/native-sdk-header-inventory.md", }); } expect(registry.integrationSurfaces.find((surface) => surface.id === "uxp-hybrid-cpp")) .toMatchObject({ benchmarkEvidenceCommand: "npm run benchmark:uxp-hybrid:verify", benchmarkEvidenceSchema: "benchmarks/uxp-hybrid/evidence.schema.json", addonReceiptCommand: "npm run native:hybrid-addon-receipt", addonReceiptVerificationCommand: "npm run native:hybrid-addon-receipt:verify", addonReceiptDocumentation: "docs/uxp-hybrid-addon-receipt.md", ccxReceiptCommand: "npm run native:hybrid-ccx-receipt", ccxReceiptVerificationCommand: "npm run native:hybrid-ccx-receipt:verify", ccxReceiptDocumentation: "docs/uxp-hybrid-ccx-receipt.md", ccxReceiptSchemaVersion: 2, }); expect(registry.integrationSurfaces.find((surface) => surface.id === "uxp-hybrid-cpp")?.notes) .toContain("root main.js entrypoint and three-target bundle layout"); expect(registry.integrationSurfaces.find((surface) => surface.id === "uxp-hybrid-cpp")?.notes) .toContain("schema-v2 local CCX archive receipt can bind that current layout receipt to the byte-identical required files, a full safe ZIP entry-name-set digest with unambiguous non-ASCII UTF-8 names and declared UTF-8 file comments, matching and feature-sufficient local ZIP version-needed, Deflate-only compression-option flags, framed non-ZIP64 extra fields, and core header fields, no unaccounted local-record or central-directory-to-end bytes, no declared Unix special file types, nonempty directory entries, or nonzero directory CRC-32 values, required streamed data-descriptor CRC/sizes, recomputed ZIP CRC-32, and exact DEFLATE range consumption for the already-required payloads; it also rejects encrypted-entry, central-directory-encryption, other unsupported general-purpose flags, or ZIP64 entry metadata before reading required payloads"); expect(registry.integrationSurfaces.find((surface) => surface.id === "uxp-hybrid-cpp")?.notes) .toContain("schema-v3 candidate benchmark"); }); it("pins reviewed competitor sources and explicit safe-adoption boundaries", () => { expect(registry.competitorSources).toHaveLength(4); expect(new Set(registry.competitorSources.map((source) => source.repository)).size) .toBe(registry.competitorSources.length); for (const source of registry.competitorSources) { expect(source.repository).toMatch(/^[\w.-]+\/[\w.-]+$/); expect(source.commit).toMatch(/^[0-9a-f]{40}$/); expect(source.observedAt).toBe(registry.researchedAt); expect(source.featureFamilies.length).toBeGreaterThan(0); expect(source.adoptionBoundary.length).toBeGreaterThan(40); } }); });