From 0a62abe423ad417696555e63c264caac93d78345 Mon Sep 17 00:00:00 2001 From: "guo.xu" Date: Tue, 23 Feb 2021 17:34:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(shared):=20=E6=96=B0=E5=A2=9E=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9B=B8=E5=85=B3=E5=B7=A5=E5=85=B7=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/cli-shared/package.json | 4 ++ .../cli-shared/src/BabelRegister/index.ts | 40 +++++++++++++++++++ .../index.ts => file/getFileMeta.ts} | 0 packages/cli-shared/src/file/index.ts | 2 + packages/cli-shared/src/file/lookUpFile.ts | 19 +++++++++ packages/cli-shared/src/index.ts | 6 ++- packages/cli-shared/src/pkg/getPkgName.ts | 9 +++++ packages/cli-shared/src/pkg/index.ts | 1 + packages/cli-shared/src/pkg/isLerna.ts | 6 +++ 9 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 packages/cli-shared/src/BabelRegister/index.ts rename packages/cli-shared/src/{getFileMeta/index.ts => file/getFileMeta.ts} (100%) create mode 100644 packages/cli-shared/src/file/index.ts create mode 100644 packages/cli-shared/src/file/lookUpFile.ts create mode 100644 packages/cli-shared/src/pkg/getPkgName.ts create mode 100644 packages/cli-shared/src/pkg/index.ts create mode 100644 packages/cli-shared/src/pkg/isLerna.ts diff --git a/packages/cli-shared/package.json b/packages/cli-shared/package.json index d115d58..4c865ca 100644 --- a/packages/cli-shared/package.json +++ b/packages/cli-shared/package.json @@ -28,13 +28,16 @@ "url": "https://github.com/xus-code/cli/issues" }, "dependencies": { + "@babel/register": "^7.13.0", "@types/debug": "^4.1.5", "@types/yargs-parser": "^20.2.0", + "@xus/babel-preset": "^0.1.6", "assert": "^2.0.0", "chalk": "^4.1.0", "debug": "^4.3.1", "deepmerge": "^4.2.2", "joi": "^17.4.0", + "lodash": "^4.17.21", "log-symbols": "^4.0.0", "ora": "^5.3.0", "resolve": "^1.20.0", @@ -42,6 +45,7 @@ }, "devDependencies": { "@types/debug": "^4.1.5", + "@types/lodash": "^4.14.168", "@types/yargs-parser": "^20.2.0" } } diff --git a/packages/cli-shared/src/BabelRegister/index.ts b/packages/cli-shared/src/BabelRegister/index.ts new file mode 100644 index 0000000..d385766 --- /dev/null +++ b/packages/cli-shared/src/BabelRegister/index.ts @@ -0,0 +1,40 @@ +import { createDebug, lodash, winPath } from '../' + +const debug = createDebug('xus:shared:BabelRegister') + +export class BabelRegister { + only: Record = {} + + setOnlyMap({ key, value }: { key: string; value: string[] }) { + debug(`set ${key} of only map:`) + debug(value) + this.only[key] = value + this.register() + } + + register() { + const only = lodash.uniq( + Object.keys(this.only) + .reduce((memo, key) => { + return memo.concat(this.only[key]) + }, []) + .map(winPath) + ) + // eslint-disable-next-line @typescript-eslint/no-var-requires + require('@babel/register')({ + presets: [ + require.resolve('@xus/babel-preset'), + { + targets: { node: 'current' }, + useTransformRuntime: false, + useTypescript: true + } + ], + ignore: [/node_modules/], + only, + extensions: ['.jsx', '.js', '.ts', '.tsx'], + babelrc: false, + cache: false + }) + } +} diff --git a/packages/cli-shared/src/getFileMeta/index.ts b/packages/cli-shared/src/file/getFileMeta.ts similarity index 100% rename from packages/cli-shared/src/getFileMeta/index.ts rename to packages/cli-shared/src/file/getFileMeta.ts diff --git a/packages/cli-shared/src/file/index.ts b/packages/cli-shared/src/file/index.ts new file mode 100644 index 0000000..a3d0cd3 --- /dev/null +++ b/packages/cli-shared/src/file/index.ts @@ -0,0 +1,2 @@ +export * from './getFileMeta' +export * from './lookUpFile' diff --git a/packages/cli-shared/src/file/lookUpFile.ts b/packages/cli-shared/src/file/lookUpFile.ts new file mode 100644 index 0000000..9e7873e --- /dev/null +++ b/packages/cli-shared/src/file/lookUpFile.ts @@ -0,0 +1,19 @@ +import { existsSync, statSync, readFileSync } from 'fs' +import { join, dirname } from 'path' + +export function lookUpFile( + dir: string, + formats: string[], + pathOnly = false +): string | undefined { + for (const format of formats) { + const fullPath = join(dir, format) + if (existsSync(fullPath) && statSync(fullPath).isFile()) { + return pathOnly ? fullPath : readFileSync(fullPath, 'utf-8') + } + } + const parentDir = dirname(dir) + if (parentDir !== dir) { + return lookUpFile(parentDir, formats, pathOnly) + } +} diff --git a/packages/cli-shared/src/index.ts b/packages/cli-shared/src/index.ts index 8961c2d..bc24eac 100644 --- a/packages/cli-shared/src/index.ts +++ b/packages/cli-shared/src/index.ts @@ -5,6 +5,8 @@ export { default as yParser } from 'yargs-parser' export { default as assert } from 'assert' export { default as deepmerge } from 'deepmerge' export { default as resolve } from 'resolve' +export { default as lodash } from 'lodash' + // custom export { Logger } from './logger' export { Spinner } from './spinner' @@ -12,8 +14,10 @@ export { createSchema, validateSchema } from './schema' export { compatESModuleRequire } from './compatESModuleRequire' export { winPath } from './winPath' export { createEnvNameWithXusPrefix } from './env' -export { getFileMeta } from './getFileMeta' +export * from './file' export { loadModule } from './loadModule' +export * from './pkg' +export { BabelRegister } from './BabelRegister' // types export export type { diff --git a/packages/cli-shared/src/pkg/getPkgName.ts b/packages/cli-shared/src/pkg/getPkgName.ts new file mode 100644 index 0000000..57eb390 --- /dev/null +++ b/packages/cli-shared/src/pkg/getPkgName.ts @@ -0,0 +1,9 @@ +import { lookUpFile } from '../file' + +export const getPkgName = (root: string) => { + const { name } = JSON.parse(lookUpFile(root, ['package.json']) || `{}`) + + if (!name) throw new Error('no name found in package.json') + + return name.startsWith('@') ? name.split('/')[1] : name +} diff --git a/packages/cli-shared/src/pkg/index.ts b/packages/cli-shared/src/pkg/index.ts new file mode 100644 index 0000000..678e6a9 --- /dev/null +++ b/packages/cli-shared/src/pkg/index.ts @@ -0,0 +1 @@ +export * from './isLerna' diff --git a/packages/cli-shared/src/pkg/isLerna.ts b/packages/cli-shared/src/pkg/isLerna.ts new file mode 100644 index 0000000..5120fe9 --- /dev/null +++ b/packages/cli-shared/src/pkg/isLerna.ts @@ -0,0 +1,6 @@ +import { existsSync } from 'fs' +import { join } from 'path' + +export const isLernaPkg = (root: string) => { + return existsSync(join(root, 'lerna.json')) +}