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..6034a7fb 100644 --- a/tests/contract/package/admin-package.test.ts +++ b/tests/contract/package/admin-package.test.ts @@ -1,4 +1,5 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; +import { createRequire } from 'node:module'; import { extname, join, relative, resolve } from 'node:path'; import { describe, expect, it } from 'vitest'; import adminPlugin, { ADMIN_CAPABILITIES, ADMIN_ENV_SCHEMA } from '../../../src/plugin'; @@ -7,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', @@ -111,6 +114,13 @@ function resolveSiteHooks(): SiteExtensionContribution { } describe('@treeseed/admin identity and team surface', () => { + it('serves the canonical UI-owned TreeSeed logo', () => { + 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')"); + }); + it('registers exactly the retained routes and resources', () => { const pageFiles = filesUnder('src/pages').filter((path) => /\.(astro|ts)$/u.test(path)); const expectedPageRoutes = [