65 lines
4.4 KiB
JavaScript
65 lines
4.4 KiB
JavaScript
import fs from 'node:fs'
|
|
|
|
const read = (file) => fs.readFileSync(file, 'utf8')
|
|
const expect = (condition, message) => {
|
|
if (!condition) {
|
|
console.error(`FAIL: ${message}`)
|
|
process.exit(1)
|
|
}
|
|
console.log(`PASS: ${message}`)
|
|
}
|
|
|
|
const tokenSource = JSON.parse(read('packages/kbx-ui/src/tokens/source/kbx.tokens.json'))
|
|
const tokenCss = read('packages/kbx-ui/src/tokens/kbx.css')
|
|
const tokenManifest = JSON.parse(read('generated/token-manifest.json'))
|
|
const figmaContract = JSON.parse(read('design/figma/variables.contract.json'))
|
|
|
|
expect(tokenSource.version === '1.10.0', 'v51 design token source version is explicit')
|
|
for (const module of ['OMS', 'ERP', 'WMS', 'COMMON']) {
|
|
expect(Boolean(tokenSource.moduleThemes?.[module]?.light), `${module} light module identity theme exists`)
|
|
expect(Boolean(tokenSource.moduleThemes?.[module]?.dark), `${module} dark module identity theme exists`)
|
|
expect(tokenCss.includes(`[data-kbx-module="${module}"]`), `${module} module selector is generated into CSS`)
|
|
}
|
|
expect(tokenCss.includes('--kbx-color-workspace:'), 'workspace surface token is generated')
|
|
expect(tokenCss.includes('--kbx-color-module-accent:'), 'module accent token is generated')
|
|
expect(tokenCss.includes('--kbx-shadow-shell:'), 'shell elevation token is generated')
|
|
expect(tokenCss.includes('--kbx-color-module-accent: Highlight;'), 'forced-colors module accent fallback exists')
|
|
expect(Boolean(tokenManifest.moduleThemes?.OMS), 'generated token manifest retains module themes')
|
|
expect(Boolean(figmaContract.moduleThemes?.WMS), 'Figma variable contract retains module themes')
|
|
|
|
const shell = read('packages/kbx-ui/src/shell/KbxApplicationShell.vue')
|
|
const home = read('packages/kbx-ui/src/shell/KbxHomePage.vue')
|
|
const pageHeader = read('packages/kbx-ui/src/components/KbxPageHeader.vue')
|
|
const screenFrame = read('packages/kbx-ui/src/components/KbxScreenFrame.vue')
|
|
expect(shell.includes(':data-kbx-module="focusedModule || \'COMMON\'"'), 'application shell exposes focused module to the theme layer')
|
|
expect(home.includes('class="kbx-home__pulse"'), 'home exposes compact operational pulse navigation')
|
|
expect(home.includes(':data-kbx-module="item.module"'), 'home module sections carry module identity')
|
|
expect(pageHeader.includes('kbx-page-header__module'), 'page header exposes module identity without turning it into status color')
|
|
expect(screenFrame.includes(':data-kbx-module="screen.module"'), 'screen frame carries module identity into every standard screen')
|
|
|
|
const templateAssertions = [
|
|
['packages/kbx-ui/src/components/KbxListPage.vue', '--kbx-color-module-accent', 'T01 list/search work surface'],
|
|
['packages/kbx-ui/src/components/KbxMasterPage.vue', '--kbx-shadow-shell', 'T02 master CRUD split surface'],
|
|
['packages/kbx-ui/src/components/KbxTransactionPage.vue', '--kbx-color-module-accent', 'T03 transaction header/detail surface'],
|
|
['packages/kbx-ui/src/components/KbxFastEntryPage.vue', 'kbx-fast-entry__guide', 'T04 fast-entry keyboard guide'],
|
|
['packages/kbx-ui/src/components/KbxMasterDetailPage.vue', 'kbx-master-detail__master', 'T05 master/detail pane hierarchy'],
|
|
['packages/kbx-ui/src/components/KbxQueuePage.vue', '--kbx-color-warning', 'T06 queue exception hierarchy'],
|
|
['packages/kbx-ui/src/components/KbxReconcilePage.vue', 'kbx-reconcile-summary', 'T07 reconciliation mismatch summary'],
|
|
['packages/kbx-ui/src/components/KbxImportPage.vue', 'kbx-import-page__steps', 'T08 import process hierarchy'],
|
|
]
|
|
for (const [file, marker, label] of templateAssertions) {
|
|
expect(read(file).includes(marker), `${label} is present`)
|
|
}
|
|
|
|
const referenceHtml = read('apps/web/fe-reference/index.html')
|
|
const referenceJs = read('apps/web/fe-reference/kbx-fe.js')
|
|
const referenceCss = read('apps/web/fe-reference/kbx-fe.css')
|
|
expect(referenceHtml.includes('data-module="COMMON"'), 'static HTML reference starts with explicit module identity')
|
|
expect(referenceJs.includes('class="home-pulse"'), 'static JavaScript reference mirrors home operational pulse')
|
|
expect(referenceJs.includes('data-module="${esc(s.module)}"'), 'static reference screen exposes module identity')
|
|
expect(referenceCss.includes('.home-pulse'), 'static reference styles home operational pulse')
|
|
expect(referenceCss.includes('[data-module="OMS"]'), 'static reference contains module theme selectors')
|
|
expect(referenceCss.includes('[data-template="T01"]'), 'static reference differentiates standard template presentation')
|
|
|
|
console.log('PASS: FE presentation/workbench hardening v51 contract')
|