33 lines
1.2 KiB
JavaScript
33 lines
1.2 KiB
JavaScript
const { readFileSync } = require('node:fs');
|
|
const { resolve } = require('node:path');
|
|
const vm = require('node:vm');
|
|
const ts = require('typescript');
|
|
|
|
function load(relativePath, mocks, globals = {}) {
|
|
const filename = resolve(__dirname, '../../src', relativePath);
|
|
const exports = {};
|
|
const code = ts.transpileModule(readFileSync(filename, 'utf8'), {
|
|
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022 },
|
|
}).outputText;
|
|
vm.runInNewContext(code, {
|
|
exports, JSON, console, ...globals,
|
|
require(name) {
|
|
if (!(name in mocks)) throw new Error(`Unexpected page-state dependency: ${name}`);
|
|
return mocks[name];
|
|
},
|
|
}, { filename });
|
|
return exports;
|
|
}
|
|
|
|
function loadPageState(react, { storage = new Map(), pathname = () => '/test' } = {}) {
|
|
return load('hooks/usePageState.ts', { react, '@umijs/max': { useLocation: () => ({ pathname: pathname() }) } }, {
|
|
sessionStorage: { getItem: key => storage.get(key) ?? null, setItem: (key, value) => storage.set(key, value) },
|
|
});
|
|
}
|
|
|
|
function loadTable(react, pageState) {
|
|
return load('utils/table.ts', { react, '@/hooks/usePageState': pageState, '@ant-design/pro-components': {} });
|
|
}
|
|
|
|
module.exports = { loadPageState, loadTable };
|