const { test } = require("node:test"); const assert = require("node:assert"); const { buildEnvelope, parseEnvelope, upcastEnvelope } = require("../lib/portability"); const { normalizeTokens } = require("../lib/themeSchema"); const { SCHEMA_ID, FORMAT_VERSION, ENGINE } = require("../lib/constants"); test("buildEnvelope produces a self-describing, id-less envelope", () => { const env = buildEnvelope({ name: "Solar", engine: ENGINE, tokens: { colors: { primary: "#111" } } }); assert.equal(env.$schema, SCHEMA_ID); assert.equal(env.formatVersion, FORMAT_VERSION); assert.equal(env.name, "Solar"); assert.ok(!("id" in env) && !("version" in env)); }); test("export -> import round-trips", async () => { const env = buildEnvelope({ name: "Solar", engine: ENGINE, tokens: normalizeTokens({ colors: { primary: "#abcdef" } }) }); const res = await parseEnvelope(JSON.stringify(env)); assert.equal(res.ok, true); assert.equal(res.draft.name, "Solar"); assert.equal(res.draft.tokens.colors.primary, "#abcdef"); }); test("import rejects a non-saltcorn file", async () => { const res = await parseEnvelope(JSON.stringify({ hello: "world" })); assert.equal(res.ok, false); assert.match(res.error, /Not a saltcorn-theme/); }); test("import rejects invalid JSON and oversized files", async () => { assert.equal((await parseEnvelope("{not json")).ok, false); const huge = JSON.stringify({ $schema: SCHEMA_ID, formatVersion: 1, x: "y".repeat(3 * 1024 * 1024) }); const res = await parseEnvelope(huge); assert.equal(res.ok, false); assert.match(res.error, /size limit/); }); test("upcastEnvelope lifts a formatVersion-0 (vars) export to current", () => { const up = upcastEnvelope({ $schema: SCHEMA_ID, name: "Old", vars: { colors: { primary: "#222" } } }); assert.equal(up.formatVersion, FORMAT_VERSION); assert.equal(up.tokens.colors.primary, "#222"); }); test("import upcasts a legacy envelope end-to-end", async () => { const legacy = JSON.stringify({ $schema: SCHEMA_ID, name: "Legacy", vars: { colors: { primary: "#333" } } }); const res = await parseEnvelope(legacy); assert.equal(res.ok, true); assert.equal(res.draft.tokens.colors.primary, "#333"); }); test("import rejects an unsupported engine", async () => { const res = await parseEnvelope(JSON.stringify({ $schema: SCHEMA_ID, formatVersion: 1, name: "X", engine: "tailwind", tokens: {} })); assert.equal(res.ok, false); assert.match(res.error, /Unsupported engine/); });