mirror of
https://github.com/nocobase/nocobase
synced 2024-11-14 21:55:55 +00:00
create nocobase app unit test (#3833)
* fix: unit test package bug * fix: client esm * fix: nocobase test e2e esm format (T-2824)
This commit is contained in:
parent
f2d4188ccf
commit
1dfd97cad5
@ -9,6 +9,7 @@ import {
|
|||||||
getCjsPackages,
|
getCjsPackages,
|
||||||
getPresetsPackages,
|
getPresetsPackages,
|
||||||
ROOT_PATH,
|
ROOT_PATH,
|
||||||
|
ESM_PACKAGES,
|
||||||
} from './constant';
|
} from './constant';
|
||||||
import { buildClient } from './buildClient';
|
import { buildClient } from './buildClient';
|
||||||
import { buildCjs } from './buildCjs';
|
import { buildCjs } from './buildCjs';
|
||||||
@ -18,6 +19,7 @@ import { PkgLog, getPkgLog, toUnixPath, getPackageJson, getUserConfig, UserConfi
|
|||||||
import { getPackages } from './utils/getPackages';
|
import { getPackages } from './utils/getPackages';
|
||||||
import { Package } from '@lerna/package';
|
import { Package } from '@lerna/package';
|
||||||
import { tarPlugin } from './tarPlugin'
|
import { tarPlugin } from './tarPlugin'
|
||||||
|
import { buildEsm } from './buildEsm';
|
||||||
|
|
||||||
const BUILD_ERROR = 'build-error';
|
const BUILD_ERROR = 'build-error';
|
||||||
|
|
||||||
@ -51,6 +53,8 @@ export async function build(pkgs: string[]) {
|
|||||||
if (clientCore) {
|
if (clientCore) {
|
||||||
await buildPackage(clientCore, 'es', buildClient);
|
await buildPackage(clientCore, 'es', buildClient);
|
||||||
}
|
}
|
||||||
|
const esmPackages = cjsPackages.filter(pkg => ESM_PACKAGES.includes(pkg.name));
|
||||||
|
await buildPackages(esmPackages, 'es', buildEsm);
|
||||||
|
|
||||||
// plugins/*、samples/*
|
// plugins/*、samples/*
|
||||||
await buildPackages(pluginPackages, 'dist', buildPlugin);
|
await buildPackages(pluginPackages, 'dist', buildPlugin);
|
||||||
|
@ -19,14 +19,14 @@ export async function buildClient(cwd: string, userConfig: UserConfig, sourcemap
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
await buildEsm(cwd, userConfig, sourcemap, external, log);
|
await buildClientEsm(cwd, userConfig, sourcemap, external, log);
|
||||||
await buildLib(cwd, userConfig, sourcemap, external, log);
|
await buildClientLib(cwd, userConfig, sourcemap, external, log);
|
||||||
await buildLocale(cwd, userConfig, log);
|
await buildLocale(cwd, userConfig, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
type External = (id: string) => boolean;
|
type External = (id: string) => boolean;
|
||||||
|
|
||||||
export function buildEsm(cwd: string, userConfig: UserConfig, sourcemap: boolean, external: External, log: PkgLog) {
|
function buildClientEsm(cwd: string, userConfig: UserConfig, sourcemap: boolean, external: External, log: PkgLog) {
|
||||||
log('build client esm');
|
log('build client esm');
|
||||||
const entry = path.join(cwd, 'src/index.ts').replaceAll(/\\/g, '/');
|
const entry = path.join(cwd, 'src/index.ts').replaceAll(/\\/g, '/');
|
||||||
const outDir = path.resolve(cwd, 'es');
|
const outDir = path.resolve(cwd, 'es');
|
||||||
@ -61,7 +61,7 @@ export function buildEsm(cwd: string, userConfig: UserConfig, sourcemap: boolean
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function buildLib(
|
async function buildClientLib(
|
||||||
cwd: string,
|
cwd: string,
|
||||||
userConfig: UserConfig,
|
userConfig: UserConfig,
|
||||||
sourcemap: boolean,
|
sourcemap: boolean,
|
||||||
|
66
packages/core/build/src/buildEsm.ts
Normal file
66
packages/core/build/src/buildEsm.ts
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
import path from 'path';
|
||||||
|
import { PkgLog, UserConfig } from './utils';
|
||||||
|
import { build as viteBuild } from 'vite';
|
||||||
|
import fg from 'fast-glob';
|
||||||
|
|
||||||
|
export async function buildEsm(cwd: string, userConfig: UserConfig, sourcemap: boolean = false, log: PkgLog) {
|
||||||
|
log('build esm');
|
||||||
|
|
||||||
|
const indexEntry = path.join(cwd, 'src/index.ts').replaceAll(/\\/g, '/');
|
||||||
|
const outDir = path.resolve(cwd, 'es');
|
||||||
|
|
||||||
|
await build(cwd, indexEntry, outDir, userConfig, sourcemap, log);
|
||||||
|
|
||||||
|
const clientEntry = fg.sync(['src/client/index.ts', 'src/client.ts'], { cwd, absolute: true, onlyFiles: true })?.[0]?.replaceAll(/\\/g, '/');
|
||||||
|
const clientOutDir = path.resolve(cwd, 'es/client');
|
||||||
|
if (clientEntry) {
|
||||||
|
await build(cwd, clientEntry, clientOutDir, userConfig, sourcemap, log);
|
||||||
|
}
|
||||||
|
|
||||||
|
const pkg = require(path.join(cwd, 'package.json'));
|
||||||
|
if (pkg.name === '@nocobase/test') {
|
||||||
|
const e2eEntry = path.join(cwd, 'src/e2e/index.ts').replaceAll(/\\/g, '/');
|
||||||
|
const e2eOutDir = path.resolve(cwd, 'es/e2e');
|
||||||
|
await build(cwd, e2eEntry, e2eOutDir, userConfig, sourcemap, log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(cwd: string, entry: string, outDir: string, userConfig: UserConfig, sourcemap: boolean = false, log: PkgLog) {
|
||||||
|
const cwdWin = cwd.replaceAll(/\\/g, '/');
|
||||||
|
const cwdUnix = cwd.replaceAll(/\//g, '\\');
|
||||||
|
const external = function (id: string) {
|
||||||
|
if (id.startsWith('.') || id.startsWith(cwdUnix) || id.startsWith(cwdWin)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
return viteBuild(
|
||||||
|
userConfig.modifyViteConfig({
|
||||||
|
mode: process.env.NODE_ENV || 'production',
|
||||||
|
define: {
|
||||||
|
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production'),
|
||||||
|
'process.env.__TEST__': false,
|
||||||
|
'process.env.__E2E__': process.env.__E2E__ ? true : false,
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
minify: false,
|
||||||
|
outDir,
|
||||||
|
cssCodeSplit: true,
|
||||||
|
emptyOutDir: true,
|
||||||
|
sourcemap,
|
||||||
|
lib: {
|
||||||
|
entry,
|
||||||
|
formats: ['es'],
|
||||||
|
fileName: 'index',
|
||||||
|
},
|
||||||
|
target: ['node16'],
|
||||||
|
rollupOptions: {
|
||||||
|
cache: true,
|
||||||
|
treeshake: true,
|
||||||
|
external,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
@ -39,6 +39,7 @@ export const getPresetsPackages = (packages: Package[]) =>
|
|||||||
packages.filter((item) => item.location.startsWith(PRESETS_DIR));
|
packages.filter((item) => item.location.startsWith(PRESETS_DIR));
|
||||||
export const CORE_APP = path.join(PACKAGES_PATH, 'core/app');
|
export const CORE_APP = path.join(PACKAGES_PATH, 'core/app');
|
||||||
export const CORE_CLIENT = path.join(PACKAGES_PATH, 'core/client');
|
export const CORE_CLIENT = path.join(PACKAGES_PATH, 'core/client');
|
||||||
|
export const ESM_PACKAGES = ['@nocobase/test'];
|
||||||
export const CJS_EXCLUDE_PACKAGES = [
|
export const CJS_EXCLUDE_PACKAGES = [
|
||||||
path.join(PACKAGES_PATH, 'core/build'),
|
path.join(PACKAGES_PATH, 'core/build'),
|
||||||
path.join(PACKAGES_PATH, 'core/cli'),
|
path.join(PACKAGES_PATH, 'core/cli'),
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
import { defineConfig } from '@nocobase/test';
|
import { defineConfig } from '@nocobase/test/vitest.mjs';
|
||||||
|
|
||||||
export default defineConfig();
|
export default defineConfig();
|
||||||
|
@ -12,8 +12,8 @@
|
|||||||
"default": "./lib/index.js"
|
"default": "./lib/index.js"
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"types": "./vitest.d.ts",
|
"types": "./es/index.d.ts",
|
||||||
"default": "./vitest.mjs"
|
"default": "./es/index.mjs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"./client": {
|
"./client": {
|
||||||
@ -22,8 +22,8 @@
|
|||||||
"default": "./lib/client/index.js"
|
"default": "./lib/client/index.js"
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"types": "./lib/client/index.d.ts",
|
"types": "./es/client/index.d.ts",
|
||||||
"default": "./lib/client/index.js"
|
"default": "./es/client/index.mjs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"./e2e": {
|
"./e2e": {
|
||||||
@ -32,11 +32,12 @@
|
|||||||
"default": "./lib/e2e/index.js"
|
"default": "./lib/e2e/index.js"
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"types": "./lib/e2e/index.d.ts",
|
"types": "./es/e2e/index.d.ts",
|
||||||
"default": "./lib/e2e/index.js"
|
"default": "./es/e2e/index.mjs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"./package.json": "./package.json"
|
"./package.json": "./package.json",
|
||||||
|
"./vitest.mjs": "./vitest.mjs"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@faker-js/faker": "8.1.0",
|
"@faker-js/faker": "8.1.0",
|
||||||
|
22
packages/core/test/src/defineConfig.d.ts
vendored
22
packages/core/test/src/defineConfig.d.ts
vendored
@ -1,22 +0,0 @@
|
|||||||
declare global {
|
|
||||||
const suite: (typeof import('vitest'))['suite'];
|
|
||||||
const test: (typeof import('vitest'))['test'];
|
|
||||||
const describe: (typeof import('vitest'))['describe'];
|
|
||||||
const it: (typeof import('vitest'))['it'];
|
|
||||||
const expectTypeOf: (typeof import('vitest'))['expectTypeOf'];
|
|
||||||
const assertType: (typeof import('vitest'))['assertType'];
|
|
||||||
const expect: (typeof import('vitest'))['expect'];
|
|
||||||
const assert: (typeof import('vitest'))['assert'];
|
|
||||||
const vitest: (typeof import('vitest'))['vitest'];
|
|
||||||
const vi: (typeof import('vitest'))['vitest'];
|
|
||||||
const beforeAll: (typeof import('vitest'))['beforeAll'];
|
|
||||||
const afterAll: (typeof import('vitest'))['afterAll'];
|
|
||||||
const beforeEach: (typeof import('vitest'))['beforeEach'];
|
|
||||||
const afterEach: (typeof import('vitest'))['afterEach'];
|
|
||||||
}
|
|
||||||
import { type UserConfig } from 'vitest/config';
|
|
||||||
export declare const defineConfig: (
|
|
||||||
config?: UserConfig & {
|
|
||||||
server: boolean;
|
|
||||||
},
|
|
||||||
) => UserConfig;
|
|
@ -1,2 +0,0 @@
|
|||||||
// @ts-ignore
|
|
||||||
export * from '../vitest';
|
|
@ -1,2 +1 @@
|
|||||||
export * from './defineConfig';
|
|
||||||
export * from './server';
|
export * from './server';
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { mockDatabase } from '@nocobase/database';
|
import { mockDatabase } from '@nocobase/database';
|
||||||
import Application, { ApplicationOptions, AppSupervisor, Gateway, PluginManager } from '@nocobase/server';
|
import { Application, ApplicationOptions, AppSupervisor, Gateway, PluginManager } from '@nocobase/server';
|
||||||
import jwt from 'jsonwebtoken';
|
import jwt from 'jsonwebtoken';
|
||||||
import qs from 'qs';
|
import qs from 'qs';
|
||||||
import supertest, { SuperAgentTest } from 'supertest';
|
import supertest, { SuperAgentTest } from 'supertest';
|
||||||
@ -240,7 +240,7 @@ export async function createMockServer(
|
|||||||
} = {},
|
} = {},
|
||||||
) {
|
) {
|
||||||
const { version, beforeInstall, skipInstall, skipStart, ...others } = options;
|
const { version, beforeInstall, skipInstall, skipStart, ...others } = options;
|
||||||
const app = mockServer(others);
|
const app: any = mockServer(others);
|
||||||
if (!skipInstall) {
|
if (!skipInstall) {
|
||||||
if (beforeInstall) {
|
if (beforeInstall) {
|
||||||
await beforeInstall(app);
|
await beforeInstall(app);
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
import { defineConfig } from '@nocobase/test';
|
import { defineConfig } from '@nocobase/test/vitest.mjs';
|
||||||
|
|
||||||
export default defineConfig();
|
export default defineConfig();
|
||||||
|
Loading…
Reference in New Issue
Block a user