diff --git a/addons/internal/uibuild/test/fixture-icon/icon.png b/addons/internal/uibuild/test/fixture-icon/icon.png new file mode 100644 index 000000000..7bbc23573 Binary files /dev/null and b/addons/internal/uibuild/test/fixture-icon/icon.png differ diff --git a/addons/internal/uibuild/test/fixture-icon/src/index.jsx b/addons/internal/uibuild/test/fixture-icon/src/index.jsx new file mode 100644 index 000000000..b0dc486aa --- /dev/null +++ b/addons/internal/uibuild/test/fixture-icon/src/index.jsx @@ -0,0 +1,4 @@ +export function createAddon(sdk) { + const h = sdk.React.createElement + return { Component: () =>
fixture
, dispose() {} } +} diff --git a/addons/internal/uibuild/test/fixture-icon/src/style.css b/addons/internal/uibuild/test/fixture-icon/src/style.css new file mode 100644 index 000000000..a5d53397a --- /dev/null +++ b/addons/internal/uibuild/test/fixture-icon/src/style.css @@ -0,0 +1 @@ +.fx { color: inherit; } diff --git a/addons/internal/uibuild/test/uibuild.test.mjs b/addons/internal/uibuild/test/uibuild.test.mjs index 36276d45d..0b585fc06 100644 --- a/addons/internal/uibuild/test/uibuild.test.mjs +++ b/addons/internal/uibuild/test/uibuild.test.mjs @@ -30,6 +30,14 @@ test('buildAddonUI writes the module, the style sheet and a PNG icon', async () assert.deepEqual(await firstPixel(png), [26, 62, 138]) }) +test('a committed icon.png next to src is copied unchanged and no square is generated', async () => { + const root = join(here, 'fixture-icon') + const dist = await buildAddonUI({ root, name: 'fixture', rgb: [26, 62, 138] }) + const out = readFileSync(join(dist, 'ui/icon.png')) + assert.ok(out.equals(readFileSync(join(root, 'icon.png'))), 'the packaged icon is the committed file') + assert.equal(out.readUInt32BE(16), 256, 'the committed icon keeps its own size, not the 128 pixel square') +}) + test('the bundle is an ES module that exports createAddon and calls h for JSX', async () => { const dist = await buildAddonUI({ root: join(here, 'fixture'), name: 'fixture', rgb: [1, 2, 3] }) const js = readFileSync(join(dist, 'ui/fixture.js'), 'utf8') diff --git a/addons/internal/uibuild/uibuild.mjs b/addons/internal/uibuild/uibuild.mjs index 4f78d58f6..d0cf759a3 100644 --- a/addons/internal/uibuild/uibuild.mjs +++ b/addons/internal/uibuild/uibuild.mjs @@ -136,7 +136,11 @@ export async function buildAddonUI({ root, name, rgb, compat }) { } else { copyFileSync(join(root, 'src/style.css'), join(out, `ui/${name}.css`)) } - writeFileSync(join(out, 'ui/icon.png'), solidIcon(rgb)) + // A committed icon (ui/icon.png next to src/) ships unchanged. Only an + // add-on without one gets the generated solid square. + const icon = join(root, 'icon.png') + if (existsSync(icon)) copyFileSync(icon, join(out, 'ui/icon.png')) + else writeFileSync(join(out, 'ui/icon.png'), solidIcon(rgb)) const js = readFileSync(join(out, `ui/${name}.js`), 'utf8') const bad = reactImport.exec(js) if (bad) throw new Error(`the bundle must not import React: found ${bad[0]}`) diff --git a/addons/tables/ui/build.mjs b/addons/tables/ui/build.mjs index 42dba4239..72b5dc95a 100644 --- a/addons/tables/ui/build.mjs +++ b/addons/tables/ui/build.mjs @@ -8,7 +8,7 @@ import { createRequire } from 'node:module' import { fileURLToPath } from 'node:url' import { dirname, join, resolve } from 'node:path' -import { mkdirSync, rmSync, writeFileSync, copyFileSync, readFileSync } from 'node:fs' +import { existsSync, mkdirSync, rmSync, writeFileSync, copyFileSync, readFileSync } from 'node:fs' import { deflateSync } from 'node:zlib' const here = dirname(fileURLToPath(import.meta.url)) @@ -78,7 +78,10 @@ export async function build() { logLevel: 'warn', }) copyFileSync(join(here, 'src/style.css'), join(out, 'ui/tables.css')) - writeFileSync(join(out, 'ui/icon.png'), icon()) + // A committed ui/icon.png ships unchanged; the drawn grid is the fallback. + const committed = join(here, 'icon.png') + if (existsSync(committed)) copyFileSync(committed, join(out, 'ui/icon.png')) + else writeFileSync(join(out, 'ui/icon.png'), icon()) const js = readFileSync(join(out, 'ui/tables.js'), 'utf8') if (/from\s+['"](react|react-dom)/.test(js) || /require\(/.test(js)) throw new Error('the bundle must not import React') return out