phase 16 implementation
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import { readFile, stat } from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import { fail, pass, repositoryRoot } from './lib.mjs';
|
||||
|
||||
const failures = [];
|
||||
const requiredFiles = [
|
||||
'src/app/api/demo/route.ts',
|
||||
'src/components/integrations/DemoDialogHost.tsx',
|
||||
'src/lib/demo/schema.ts',
|
||||
'src/lib/demo/service.ts',
|
||||
'src/lib/demo/idempotency.ts',
|
||||
'src/lib/demo/adapters/types.ts',
|
||||
'src/lib/demo/adapters/local.ts',
|
||||
'src/lib/demo/adapters/blocked.ts',
|
||||
'src/lib/integrations/destinations.ts',
|
||||
'src/lib/integrations/environment.ts',
|
||||
'src/lib/integrations/feature-flags.ts',
|
||||
'src/lib/analytics/events.ts',
|
||||
'src/lib/analytics/client.ts',
|
||||
'docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv',
|
||||
'docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv',
|
||||
'docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv',
|
||||
];
|
||||
for (const file of requiredFiles) {
|
||||
try {
|
||||
const details = await stat(path.join(repositoryRoot, file));
|
||||
if (!details.isFile()) failures.push(`${file}: not a file.`);
|
||||
} catch {
|
||||
failures.push(`${file}: missing.`);
|
||||
}
|
||||
}
|
||||
|
||||
const schema = await readFile(path.join(repositoryRoot, 'src/lib/demo/schema.ts'), 'utf8');
|
||||
for (const field of ['fullName', 'workEmail', 'company', 'fleetSize', 'idempotencyKey', 'source']) {
|
||||
if (!schema.includes(`${field}:`)) failures.push(`Demo schema is missing ${field}.`);
|
||||
}
|
||||
if (!schema.includes('.strict()'))
|
||||
failures.push('Demo transport schemas must reject unknown fields.');
|
||||
if (schema.includes('phone:'))
|
||||
failures.push('Unapproved phone field was added to the demo contract.');
|
||||
|
||||
const destinations = await readFile(
|
||||
path.join(repositoryRoot, 'src/lib/integrations/destinations.ts'),
|
||||
'utf8',
|
||||
);
|
||||
for (const issue of ['P9-002', 'P9-003', 'P9-004', 'P9-008', 'P9-012', 'P9-014', 'P9-015']) {
|
||||
if (!destinations.includes(issue))
|
||||
failures.push(`Destination registry does not preserve ${issue}.`);
|
||||
}
|
||||
if (/href:\s*['"]https?:\/\//.test(destinations)) {
|
||||
failures.push('Destination registry contains an unapproved hard-coded external URL.');
|
||||
}
|
||||
|
||||
for (const locale of ['en', 'fr', 'ar']) {
|
||||
const catalog = JSON.parse(
|
||||
await readFile(
|
||||
path.join(repositoryRoot, `src/content/locales/${locale}/homepage.json`),
|
||||
'utf8',
|
||||
),
|
||||
);
|
||||
if (!catalog.form || catalog.form.fleetOptions?.length !== 7) {
|
||||
failures.push(
|
||||
`${locale}: demo form fleet options do not match the approved six-value contract.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (failures.length) fail(failures);
|
||||
else
|
||||
pass(
|
||||
'Phase 14 integration structure, form contract, destinations, and locale resources are present.',
|
||||
);
|
||||
Reference in New Issue
Block a user