mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-13 12:13:10 +00:00
189 lines
5.6 KiB
TypeScript
189 lines
5.6 KiB
TypeScript
import test from 'ava';
|
|
import { ensureFile, writeFile } from 'fs-extra';
|
|
import { join } from 'path';
|
|
import { IComponentMaterial } from '../../src/otter-core';
|
|
|
|
import Generator from '../../src/generator/Generator';
|
|
import ReactParser from '../../src/parser/ReactParser';
|
|
import Scanner from '../../src/scanner/Scanner';
|
|
import { IMaterializeOptions, IMaterialParsedModel } from '../../src/types';
|
|
import { getFromFixtures } from '../helpers';
|
|
|
|
const multiExportedComptPath = getFromFixtures('multiple-exported-component');
|
|
const singleExportedComptPath = getFromFixtures('single-exported-component');
|
|
// const antdComptPath = getFromFixtures('antd-component');
|
|
const fusionComptPath = getFromFixtures('fusion-next-component');
|
|
|
|
async function generate(
|
|
options: IMaterializeOptions
|
|
): Promise<IComponentMaterial> {
|
|
const scanner = new Scanner(options);
|
|
const scanModel = await scanner.scan();
|
|
const parser = new ReactParser(options);
|
|
const parsedModels: IMaterialParsedModel[] = await parser.parse(scanModel);
|
|
const generator = new Generator(options);
|
|
const actual: IComponentMaterial = await generator.generate(
|
|
scanModel,
|
|
parsedModels
|
|
);
|
|
|
|
return actual;
|
|
}
|
|
|
|
test.serial('generate multiple exported components', async t => {
|
|
const options: IMaterializeOptions = {
|
|
cwd: multiExportedComptPath,
|
|
entry: multiExportedComptPath,
|
|
accesser: 'local',
|
|
isExportedAsMultiple: true,
|
|
};
|
|
|
|
const actual = await generate(options);
|
|
|
|
t.snapshot(actual);
|
|
});
|
|
|
|
test.only('generate single exported components', async t => {
|
|
const options: IMaterializeOptions = {
|
|
cwd: singleExportedComptPath,
|
|
entry: singleExportedComptPath,
|
|
accesser: 'local',
|
|
isExportedAsMultiple: false,
|
|
};
|
|
// const scanner = new Scanner(options);
|
|
// const scanModel = await scanner.scan();
|
|
// const parser = new ReactParser(options);
|
|
// const parsedModels: IMaterialParsedModel[] = await parser.parse(scanModel);
|
|
// const generator = new Generator(options);
|
|
// t.log('parsedModels', JSON.stringify(parsedModels,null,2));
|
|
// const actual: IComponentMaterial = await generator.generate(
|
|
// scanModel,
|
|
// parsedModels
|
|
// );
|
|
const actual = await generate(options);
|
|
|
|
t.snapshot(actual);
|
|
});
|
|
|
|
test.serial('generate single exported components with extensions', async t => {
|
|
const options: IMaterializeOptions = {
|
|
cwd: singleExportedComptPath,
|
|
entry: singleExportedComptPath,
|
|
accesser: 'local',
|
|
isExportedAsMultiple: false,
|
|
extensions: {
|
|
'mat:config:manifest': async (params: {
|
|
manifestObj: IComponentMaterial;
|
|
manifestFilePath: string;
|
|
}): Promise<{
|
|
manifestJSON: string;
|
|
manifestFilePath: string;
|
|
manifestObj: IComponentMaterial;
|
|
}> => {
|
|
const manifestJSON: string = JSON.stringify(
|
|
params.manifestObj
|
|
);
|
|
// 将 manifest 文件存储到指定目录下
|
|
const manifestFilePath = params.manifestFilePath.replace(
|
|
'/es/',
|
|
'/src/'
|
|
);
|
|
await writeFile(manifestFilePath, manifestJSON);
|
|
return {
|
|
manifestJSON,
|
|
manifestObj: params.manifestObj,
|
|
manifestFilePath,
|
|
};
|
|
},
|
|
},
|
|
};
|
|
|
|
const actual = await generate(options);
|
|
|
|
t.snapshot(actual);
|
|
});
|
|
|
|
test.serial(
|
|
'generate multiple exported components with extensions',
|
|
async t => {
|
|
const options: IMaterializeOptions = {
|
|
cwd: multiExportedComptPath,
|
|
entry: multiExportedComptPath,
|
|
accesser: 'local',
|
|
isExportedAsMultiple: true,
|
|
extensions: {
|
|
'mat:config:manifest': async (params: {
|
|
manifestObj: IComponentMaterial;
|
|
manifestFilePath: string;
|
|
}): Promise<{
|
|
manifestJSON: string;
|
|
manifestFilePath: string;
|
|
manifestObj: IComponentMaterial;
|
|
}> => {
|
|
const manifestJSON: string = JSON.stringify(
|
|
params.manifestObj
|
|
);
|
|
// 将 manifest 文件存储到指定目录下
|
|
const manifestFilePath = params.manifestFilePath.replace(
|
|
'/es/',
|
|
'/src/'
|
|
);
|
|
|
|
await writeFile(manifestFilePath, manifestJSON);
|
|
|
|
return Promise.resolve({
|
|
manifestJSON,
|
|
manifestObj: params.manifestObj,
|
|
manifestFilePath,
|
|
});
|
|
},
|
|
},
|
|
};
|
|
|
|
const actual = await generate(options);
|
|
|
|
t.snapshot(actual);
|
|
}
|
|
);
|
|
|
|
// test.serial('generate @alife/next components', async t => {
|
|
// const options: IMaterializeOptions = {
|
|
// cwd: fusionComptPath,
|
|
// entry: join(fusionComptPath, 'node_modules/@alife/next'),
|
|
// accesser: 'local',
|
|
// isExportedAsMultiple: true,
|
|
// extensions: {
|
|
// 'mat:config:manifest': async (params: {
|
|
// manifestObj: IComponentMaterial;
|
|
// manifestFilePath: string;
|
|
// }): Promise<{
|
|
// manifestJSON: string;
|
|
// manifestFilePath: string;
|
|
// manifestObj: IComponentMaterial;
|
|
// }> => {
|
|
// const manifestJSON: string = JSON.stringify(
|
|
// params.manifestObj
|
|
// );
|
|
// // 将 manifest 文件存储到指定目录下
|
|
// const manifestFilePath = params.manifestFilePath.replace(
|
|
// '/node_modules/@alife/next/es/',
|
|
// '/src/@alife/next/'
|
|
// );
|
|
|
|
// await ensureFile(manifestFilePath);
|
|
// await writeFile(manifestFilePath, manifestJSON);
|
|
|
|
// return Promise.resolve({
|
|
// manifestJSON,
|
|
// manifestObj: params.manifestObj,
|
|
// manifestFilePath,
|
|
// });
|
|
// },
|
|
// },
|
|
// };
|
|
|
|
// const actual = await generate(options);
|
|
|
|
// t.snapshot(actual);
|
|
// });
|