From 64aeac939773650b2f202b38e3013c4d30f3512f Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 28 Aug 2026 02:32:18 -0400 Subject: [PATCH 1/2] fix: consume canonical TreeSeed logo --- package-lock.json | 12 +- package.json | 9 +- public/logo.svg | 7791 +++++++++++++++++- scripts/brand/sync-assets.ts | 11 + tests/contract/package/admin-package.test.ts | 8 + 5 files changed, 7815 insertions(+), 16 deletions(-) create mode 100644 scripts/brand/sync-assets.ts diff --git a/package-lock.json b/package-lock.json index 6ea42c6a..96c7d6ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.21", + "version": "0.12.59-rc.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@treeseed/admin", - "version": "0.12.59-rc.21", + "version": "0.12.59-rc.22", "license": "Apache-2.0", "dependencies": { "@astrojs/starlight": "0.37.6", "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": ">=0.13.0-rc.39 <0.14.0", - "@treeseed/ui": "^0.12.18-rc.6", + "@treeseed/ui": "^0.12.18-rc.10", "react": "^19.2.5", "react-dom": "^19.2.6" }, @@ -7091,9 +7091,9 @@ } }, "node_modules/@treeseed/ui": { - "version": "0.12.18-rc.9", - "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.9.tgz", - "integrity": "sha512-mEOqmYc5kWNd6036tSaMSIuw7cqhiolU6alUcBmcR2xulZuxImnMJDb2tLYF+ZmALILwk1wgNBKU76c9fc46wA==", + "version": "0.12.18-rc.10", + "resolved": "https://registry.npmjs.org/@treeseed/ui/-/ui-0.12.18-rc.10.tgz", + "integrity": "sha512-klyFJeVGN5ByhdycF2HqgOtuSRTXq1KoJzJJTnlgfpTloYdKf22A7lQoicrrMsQwyRMErr7YHBmH/sOglhHPUQ==", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", diff --git a/package.json b/package.json index 2c29da16..6caf8d99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@treeseed/admin", - "version": "0.12.59-rc.21", + "version": "0.12.59-rc.22", "description": "Treeseed administration portal framework built on @treeseed/core and @treeseed/ui.", "license": "Apache-2.0", "repository": { @@ -35,10 +35,11 @@ "check:file-architecture": "node --import tsx ./scripts/check-file-architecture.ts", "setup": "npm install", "setup:ci": "npm ci --workspaces=false", + "brand:sync": "node --import tsx ./scripts/brand/sync-assets.ts", "build": "npm run build:dist && npm run build:app", "build:dist": "node --import tsx ./scripts/build-dist.ts", - "build:app": "TREESEED_WEB_RUNTIME_TARGET=managed-node astro build --config astro.config.ts", - "dev": "TREESEED_WEB_RUNTIME_TARGET=managed-node node ./node_modules/astro/astro.js dev --config astro.config.ts --port 4322", + "build:app": "npm run brand:sync && TREESEED_WEB_RUNTIME_TARGET=managed-node astro build --config astro.config.ts", + "dev": "npm run brand:sync && TREESEED_WEB_RUNTIME_TARGET=managed-node node ./node_modules/astro/astro.js dev --config astro.config.ts --port 4322", "preview": "TREESEED_WEB_RUNTIME_TARGET=managed-node node ./node_modules/astro/astro.js preview --config astro.config.ts --port 4322", "prepare": "node --import tsx ./scripts/prepare.ts", "prepack": "npm run build:dist", @@ -61,7 +62,7 @@ "@react-email/render": "^2.0.8", "@treeseed/core": ">=0.12.60-rc.1 <0.14.0", "@treeseed/sdk": ">=0.13.0-rc.39 <0.14.0", - "@treeseed/ui": "^0.12.18-rc.6", + "@treeseed/ui": "^0.12.18-rc.10", "react": "^19.2.5", "react-dom": "^19.2.6" }, diff --git a/public/logo.svg b/public/logo.svg index 37d2d0cc..25e1236f 100644 --- a/public/logo.svg +++ b/public/logo.svg @@ -1,7 +1,7786 @@ - - TreeSeed - - - - + + + + + + + + + diff --git a/scripts/brand/sync-assets.ts b/scripts/brand/sync-assets.ts new file mode 100644 index 00000000..f1e4d62a --- /dev/null +++ b/scripts/brand/sync-assets.ts @@ -0,0 +1,11 @@ +#!/usr/bin/env node + +import { copyFileSync, mkdirSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const canonicalLogo = fileURLToPath(import.meta.resolve('@treeseed/ui/assets/treeseed-logo.svg')); +const publicLogo = resolve('public/logo.svg'); + +mkdirSync(dirname(publicLogo), { recursive: true }); +copyFileSync(canonicalLogo, publicLogo); diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index 161ef4a3..d145356c 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -1,5 +1,6 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; import { extname, join, relative, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { describe, expect, it } from 'vitest'; import adminPlugin, { ADMIN_CAPABILITIES, ADMIN_ENV_SCHEMA } from '../../../src/plugin'; import type { PluginSiteContext, SiteExtensionContribution } from '@treeseed/sdk/site-contracts/plugin'; @@ -111,6 +112,13 @@ function resolveSiteHooks(): SiteExtensionContribution { } describe('@treeseed/admin identity and team surface', () => { + it('serves the canonical UI-owned TreeSeed logo', () => { + const canonicalLogo = readFileSync(fileURLToPath(import.meta.resolve('@treeseed/ui/assets/treeseed-logo.svg'))); + const publicLogo = readFileSync('public/logo.svg'); + expect(publicLogo).toEqual(canonicalLogo); + expect(readFileSync('scripts/brand/sync-assets.ts', 'utf8')).toContain("import.meta.resolve('@treeseed/ui/assets/treeseed-logo.svg')"); + }); + it('registers exactly the retained routes and resources', () => { const pageFiles = filesUnder('src/pages').filter((path) => /\.(astro|ts)$/u.test(path)); const expectedPageRoutes = [ From b061cd010835fe56c92ce779c67dc2c9e14e8b83 Mon Sep 17 00:00:00 2001 From: Adrian Webb Date: Fri, 28 Aug 2026 02:35:05 -0400 Subject: [PATCH 2/2] test: resolve brand asset through package exports --- tests/contract/package/admin-package.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/contract/package/admin-package.test.ts b/tests/contract/package/admin-package.test.ts index d145356c..6034a7fb 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -1,6 +1,6 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; +import { createRequire } from 'node:module'; import { extname, join, relative, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; import { describe, expect, it } from 'vitest'; import adminPlugin, { ADMIN_CAPABILITIES, ADMIN_ENV_SCHEMA } from '../../../src/plugin'; import type { PluginSiteContext, SiteExtensionContribution } from '@treeseed/sdk/site-contracts/plugin'; @@ -8,6 +8,8 @@ import { ADMIN_ROUTES, ADMIN_SUPPORT_ROUTES } from '../../../src/routes'; import { DEFAULT_ADMIN_COMMERCE_PROVIDER } from '../../../src/commerce'; import { authenticatedAuthRedirect, isAnonymousAuthRoute } from '../../../src/lib/auth/support/access-policy'; +const require = createRequire(import.meta.url); + const EXPECTED_ROUTES = [ '/404', '/500', @@ -113,7 +115,7 @@ function resolveSiteHooks(): SiteExtensionContribution { describe('@treeseed/admin identity and team surface', () => { it('serves the canonical UI-owned TreeSeed logo', () => { - const canonicalLogo = readFileSync(fileURLToPath(import.meta.resolve('@treeseed/ui/assets/treeseed-logo.svg'))); + const canonicalLogo = readFileSync(require.resolve('@treeseed/ui/assets/treeseed-logo.svg')); const publicLogo = readFileSync('public/logo.svg'); expect(publicLogo).toEqual(canonicalLogo); expect(readFileSync('scripts/brand/sync-assets.ts', 'utf8')).toContain("import.meta.resolve('@treeseed/ui/assets/treeseed-logo.svg')");