Skip to content

Commit

Permalink
feat(cli): support config set autoImport and generateTypeDeclarations…
Browse files Browse the repository at this point in the history
…File #22
  • Loading branch information
seho-dev committed Apr 2, 2023
1 parent ed12b1c commit c8a20ab
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 22 deletions.
3 changes: 2 additions & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@
"@types/mv": "^2.1.2",
"openapi-types": "^11.0.0",
"typescript": "^4.3.5",
"unbuild": "^0.6.9"
"unbuild": "^0.6.9",
"unplugin": "^1.3.1"
},
"dependencies": {
"@swordjs/esbuild-plugin-condition-comment-macro": "^1.0.1",
Expand Down
38 changes: 29 additions & 9 deletions packages/cli/src/core/autoImport.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
import { createUnimport } from 'unimport';
import { resolve } from 'path';
import { createUnimport, TypeDeclarationOptions } from 'unimport';
import Unimport from 'unimport/unplugin';
import { APP_SRC_DIR, AUTO_IMPORT_TYPE_DECLARATION_FILE } from '~util/constants';
import { writeFileRecursive } from '~util/file';
import { configData } from '../core/config';
import type { Preset } from 'unimport';
import type { EsbuildPlugin } from 'unplugin';

const autoImportsPresets = [
const autoImportsPresets: Preset[] = [
{
from: '@swordjs/sword-framework',
imports: ['useApi', 'useApp', 'usePipeline', 'usePlugin', 'useGetApiMap', 'usePlatform', 'usePlatformHook', 'useIsDev', 'useIsProd']
}
];

const { toExports } = createUnimport({
presets: autoImportsPresets
});

const esbuildPluginAutoImport = Unimport.esbuild({ presets: autoImportsPresets });

let importCode: string;
let toExports: (filepath?: string | undefined) => Promise<string>;
let generateTypeDeclarations: (options?: TypeDeclarationOptions | undefined) => Promise<string>;
let esbuildPluginAutoImport: EsbuildPlugin | undefined;

const getImportCode = async () => {
if (importCode) return importCode;
Expand All @@ -26,4 +29,21 @@ const getImportCode = async () => {
return importCode;
};

export { getImportCode, esbuildPluginAutoImport };
const generateTypeDeclarationsFile = async () => {
const typeDeclarationsCode = await generateTypeDeclarations();
// typeDeclarationsCode is the automatically imported type declarations
writeFileRecursive(resolve(process.cwd(), APP_SRC_DIR, AUTO_IMPORT_TYPE_DECLARATION_FILE), typeDeclarationsCode);
};

export default () => {
const options = {
presets: autoImportsPresets.concat(configData.autoImport?.presets || []),
imports: configData.autoImport?.imports || []
};
const unimport = createUnimport(options);
toExports = unimport.toExports;
generateTypeDeclarations = unimport.generateTypeDeclarations;
esbuildPluginAutoImport = Unimport.esbuild(options);
};

export { getImportCode, generateTypeDeclarationsFile, esbuildPluginAutoImport };
7 changes: 7 additions & 0 deletions packages/cli/src/core/config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { cwd } from 'process';
import { loadConfig } from 'unconfig';
import { getPackageJson } from '~util/package';
import autoImport from '../core/autoImport';
import type { Config } from '../../typings/config';

export let configData: Required<Config>;
Expand Down Expand Up @@ -44,6 +45,7 @@ export const initConfig = async () => {
});
if (typeof config === 'undefined') return defaultConfig;
configData = mergeConfig(config, defaultConfig) as any;
await afterInitConfig();
return configData;
};

Expand All @@ -61,4 +63,9 @@ const mergeConfig = (config: Config, defaultConfig: Config) => {
return config;
};

const afterInitConfig = async () => {
// The automatically imported configuration items are initialized in autoImport
await autoImport();
};

export type { Config } from '../../typings/config';
3 changes: 2 additions & 1 deletion packages/cli/src/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { generateSchema } from './core/api';
import { devUnicloudApp } from './platform/unicloud';
import { presetApi } from './util/presetApi';
import log from './core/log';
import { getImportCode } from './core/autoImport';
import { getImportCode, generateTypeDeclarationsFile } from './core/autoImport';

import type { Argv } from 'mri';
import type { CommandConfig } from '~types/config';
Expand Down Expand Up @@ -51,6 +51,7 @@ const start = async (args: Argv<CommandConfig>) => {
stdio: 'inherit'
}
);
generateTypeDeclarationsFile();
// 运行成功
log.info(`启动入口文件: src/index.ts`);
} else if (args.platform === 'unicloud') devUnicloudApp(args);
Expand Down
37 changes: 27 additions & 10 deletions packages/cli/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,42 @@
#! /usr/bin/env node

import * as esbuildRegister from 'esbuild-register/dist/node';
import { register } from 'esbuild-register/dist/node';
import dev from './dev';
import build from './build';
import init from './init';
import doc from './doc';
import util from './util';
import share from './share';
import packageJSON from './../package.json';
import { getImportCode } from './core/autoImport';
import { processShim } from './core/shim';
import { initConfig } from './core/config';
import { commandArgs as args } from '~util/config';
import { resolve } from 'path';
esbuildRegister.register();
import { PRIVATE_CACHE_DIR, PRIVATE_SHIM_DIR, SHIM_PROCESS_FILE } from '~util/constants';

type commands = 'dev' | 'build' | 'init' | 'doc' | 'share' | 'util';

async function main() {
const main = async () => {
// parse config params
const config = await initConfig();
// The cli compiler may execute some ts files at runtime,
// especially the program runtime logic in the dev environment
await registerTsRuntimeByEsbuild();
// check version
if (args['v']) {
console.log(`cli version: ${packageJSON.version}`);
return;
}
// 解析config参数
const config = await initConfig();
if (['dev', 'build'].includes(args._[0])) {
// 创建shim
// create shim when dev or build
processShim(args._[0] as 'dev' | 'build', args.platform, config);
}
// 加载可能已经预定义的shim
// Load the shim that may have been predefined
try {
await import(resolve(process.cwd(), './.sword/shim/process.js'));
await import(resolve(process.cwd(), PRIVATE_CACHE_DIR, PRIVATE_SHIM_DIR, SHIM_PROCESS_FILE));
} catch (error) {}
// 解析命令行参数
// Parsing command line parameters
const cliHandler = {
dev,
build,
Expand All @@ -43,7 +48,19 @@ async function main() {
if (args._[0]) {
cliHandler[args._[0] as commands](args);
}
}
};

/**
*
* @description When using cli to compile api to api.json, the dev environment needs to run the ts file directly to get the information of each api
*/
const registerTsRuntimeByEsbuild = async () => {
// get auto import code
const code = await getImportCode();
register({
banner: code
});
};

main().catch((err) => {
console.error(err);
Expand Down
7 changes: 6 additions & 1 deletion packages/cli/typings/config.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { PackageJson } from '~types/package';
import type { TransProtoReturn } from '../src/doc';
import type { Map } from '@runtime/core/map';
import type {} from 'wrangler';
import type { Import, Preset } from 'unimport';

export interface Config {
server?: {
Expand Down Expand Up @@ -32,5 +32,10 @@ export interface Config {
output: (markdownMap: Record<string, string>) => void;
};
};
// AutoImport
autoImport?: {
imports?: Import[];
presets?: Preset[];
};
language?: 'CN' | 'EN';
}
2 changes: 2 additions & 0 deletions util/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@ export const PRIVATE_DEV_DIR = 'dev';
export const PRIVATE_SHIM_DIR = 'shim';

export const SHIM_PROCESS_FILE = 'process.js';

export const AUTO_IMPORT_TYPE_DECLARATION_FILE = 'auto-import.d.ts';

0 comments on commit c8a20ab

Please sign in to comment.