53 lines
4.2 KiB
JavaScript
53 lines
4.2 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
import { createRequire } from 'node:module';
|
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
import { execFileSync } from 'node:child_process';
|
|
import path from 'node:path';
|
|
|
|
const root = fileURLToPath(new URL('../../', import.meta.url));
|
|
const consumer = path.join(root, 'test-results/org-chart-react/tarball-consumer');
|
|
await mkdir(consumer, { recursive: true });
|
|
for (const name of ['org-chart', 'org-chart-react']) {
|
|
const destination = path.join(consumer, 'node_modules/@hm-design', name);
|
|
await mkdir(destination, { recursive: true });
|
|
execFileSync('tar.exe', ['-xzf', path.join(root, `test-results/hm-design-${name}-0.1.0.tgz`), '-C', destination, '--strip-components=1']);
|
|
}
|
|
await writeFile(path.join(consumer, 'package.json'), JSON.stringify({ name: 'org-chart-react-tarball-consumer', private: true, type: 'module' }));
|
|
const require = createRequire(path.join(consumer, 'package.json'));
|
|
const module = await import(pathToFileURL(require.resolve('@hm-design/org-chart-react')).href);
|
|
assert.deepEqual(Object.keys(module), ['OrgChart']);
|
|
assert.equal(typeof module.OrgChart, 'function');
|
|
const manifest = JSON.parse(await readFile(path.join(consumer, 'node_modules/@hm-design/org-chart-react/package.json'), 'utf8'));
|
|
assert.deepEqual(manifest.dependencies, { '@hm-design/org-chart': '0.1.0' });
|
|
assert.deepEqual(manifest.peerDependencies, { react: '^19.0.0' });
|
|
const bundle = await readFile(require.resolve('@hm-design/org-chart-react'), 'utf8');
|
|
assert.ok(bundle.startsWith('"use client";'));
|
|
for (const dependency of ['react', 'react/jsx-runtime', '@hm-design/org-chart']) assert.ok(bundle.includes(`from "${dependency}"`) || bundle.includes(`from '${dependency}'`));
|
|
assert.ok(!bundle.includes('ManagedOrgChart') && !bundle.includes('validateOrgChartDataset') && !bundle.includes('JsonOrgChartDataSource'));
|
|
await writeFile(path.join(consumer, 'consumer.tsx'), `import { OrgChart, type OrgChartProps, type OrgChartDataSource, type OrgChartState, type OrgChartDataset } from '@hm-design/org-chart-react';
|
|
import { JsonOrgChartDataSource } from '@hm-design/org-chart';
|
|
declare const data: OrgChartDataset;
|
|
const source: OrgChartDataSource = new JsonOrgChartDataSource(data);
|
|
const props: OrgChartProps = { dataSource: source, stylesheetUrls: { engine: './engine.css', core: './style.css' }, onStateChange(state: OrgChartState) { if(state.status === 'ready') void state.summary.raw.total; }, onLifecycleError(error: unknown) { void error; } };
|
|
export const consumer = <OrgChart {...props} />;
|
|
// @ts-expect-error dataSource is a required Core source interface
|
|
export const missingSource = <OrgChart stylesheetUrls={{engine:'engine.css',core:'style.css'}} />;
|
|
// @ts-expect-error wrapper does not expose engine controls
|
|
export const unsupportedZoom = <OrgChart {...props} zoom />;
|
|
// @ts-expect-error Core-owned container cannot be supplied through React Props
|
|
export const unsupportedContainer = <OrgChart {...props} container={document.body} />;
|
|
`);
|
|
await writeFile(path.join(consumer, 'tsconfig.json'), JSON.stringify({ compilerOptions: { target: 'ES2022', module: 'NodeNext', moduleResolution: 'NodeNext', jsx: 'react-jsx', strict: true, noEmit: true, skipLibCheck: false, types: ['react'] }, include: ['consumer.tsx'] }));
|
|
const localRequire = createRequire(import.meta.url);
|
|
const typescriptManifest = localRequire.resolve('typescript/package.json');
|
|
const typescript = JSON.parse(await readFile(typescriptManifest, 'utf8'));
|
|
execFileSync(process.execPath, [path.resolve(path.dirname(typescriptManifest), typescript.bin.tsc), '-p', path.join(consumer, 'tsconfig.json')], { stdio: 'inherit' });
|
|
const report = {
|
|
status: 'PASS',
|
|
checks: ['Actual tarball runtime/public export without DOM', 'Strict NodeNext declarations using extracted Core/Wrapper', 'Required source and unsupported Props type boundaries', 'React/Core remain external', 'ESM client boundary retained'],
|
|
limitation: 'React and compiler supplied by verification environment; fresh remote-registry dependency installation and SSR/hydration are not verified.',
|
|
};
|
|
await writeFile(path.join(consumer, 'report.json'), JSON.stringify(report, null, 2));
|
|
console.log(JSON.stringify(report));
|