From 5049e1a5ff49a86558c737e5463128daccc97c3a Mon Sep 17 00:00:00 2001 From: luhc228 Date: Wed, 8 Mar 2023 12:21:58 +0800 Subject: [PATCH] feat: @iceworks/generate-project@2.x (#1053) * feat: support generate ice3 project * chore: update ci node version * chore: update registry * chore: remove registry * feat: dist format * chore: version * fix: test fail * fix: ts error * feat: update test case * fix: package not found * fix: build error * fix: export function is not correct * fix: lint * fix: test * fix: tsconfig * chore: remove beta version * test: add timeout --- .github/workflows/auto-publisher.yml | 2 +- .github/workflows/beta-publisher.yml | 2 +- .github/workflows/ci.yml | 2 +- package.json | 5 +- packages/generate-project/CHANGELOG.md | 4 + packages/generate-project/README.md | 12 +- packages/generate-project/package.json | 15 +- .../downloadAndGenerateProject.test.ts | 196 ++++++++++++++++++ .../generate-project/src/__tests__/index.ts | 45 ---- .../src/addDependenciesToPkgJson.ts | 23 ++ packages/generate-project/src/ejsRenderDir.ts | 52 ++--- .../generate-project/src/formatFileContent.ts | 11 + .../generate-project/src/formatFilename.ts | 4 +- .../generate-project/src/formatPkgJson.ts | 29 +++ .../generate-project/src/formatProject.ts | 172 --------------- .../src/formatScaffoldToProject.ts | 48 ++++- packages/generate-project/src/index.ts | 55 ++--- packages/generate-project/src/writeAbcJson.ts | 22 ++ packages/generate-project/tsconfig.json | 4 +- .../src/page/utils/renderEjsTemplates.ts | 3 +- scripts/watch.ts | 26 +-- tsconfig.json | 3 +- yarn.lock | 115 +++++++++- 23 files changed, 519 insertions(+), 331 deletions(-) create mode 100644 packages/generate-project/src/__tests__/downloadAndGenerateProject.test.ts delete mode 100644 packages/generate-project/src/__tests__/index.ts create mode 100644 packages/generate-project/src/addDependenciesToPkgJson.ts create mode 100644 packages/generate-project/src/formatFileContent.ts create mode 100644 packages/generate-project/src/formatPkgJson.ts delete mode 100644 packages/generate-project/src/formatProject.ts create mode 100644 packages/generate-project/src/writeAbcJson.ts diff --git a/.github/workflows/auto-publisher.yml b/.github/workflows/auto-publisher.yml index 63d856fe4..9708d9908 100644 --- a/.github/workflows/auto-publisher.yml +++ b/.github/workflows/auto-publisher.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 14 registry-url: https://registry.npmjs.org/ - run: | npm i diff --git a/.github/workflows/beta-publisher.yml b/.github/workflows/beta-publisher.yml index a8f806ad5..3415645fe 100644 --- a/.github/workflows/beta-publisher.yml +++ b/.github/workflows/beta-publisher.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 14 registry-url: https://registry.npmjs.org/ - run: | npm i diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bca9b6fb3..45399b2cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [14.x] steps: - uses: actions/checkout@v2 diff --git a/package.json b/package.json index cbfa89a86..aa0ffd39c 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,11 @@ ], "scripts": { "setup": "npm run setup:packages && npm run setup:extensions", - "setup:packages": "npm run packages:install && lerna clean --yes && npm run packages:link && npm run packages:build", + "setup:packages": "npm run packages:install && npm run packages:link && npm run packages:build", "setup:extensions": "npm run extensions:install && npm run extensions:link", "ci:setup": "npm run env && npm run setup:packages", "test": "NODE_ENV=unittest LOG_LEVEL=verbose jest", - "packages:install": "rm -rf node_modules && rm -rf ./packages/*/node_modules && rm -rf ./packages/*/package-lock.json && SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ yarn install", + "packages:install": "rm -rf node_modules && rm -rf ./packages/*/node_modules && rm -rf ./packages/*/package-lock.json && yarn install", "packages:link": "lerna link", "packages:watch": "ts-node ./scripts/watch.ts", "packages:build": "npm run packages:clean && ts-node ./scripts/build.ts", @@ -87,7 +87,6 @@ "lodash.padstart": "^4.6.1", "lodash.unionby": "^4.8.0", "markdownlint": "^0.20.4", - "nsfw": "^1.2.7", "package-json": "^6.5.0", "pify": "^5.0.0", "prettier": "^2.2.1", diff --git a/packages/generate-project/CHANGELOG.md b/packages/generate-project/CHANGELOG.md index 0c90f54c4..d102080e9 100644 --- a/packages/generate-project/CHANGELOG.md +++ b/packages/generate-project/CHANGELOG.md @@ -1,5 +1,9 @@ # `@iceworks/generate-project` +## 2.0.0 + +- [chore]: support generate ice.js 3 scaffolds + ## 1.4.6 - [chore]: update taobao npm registry from `https://registry.npm.taobao.org` to `https://registry.npmmirror.com` diff --git a/packages/generate-project/README.md b/packages/generate-project/README.md index bf5730967..950e68577 100644 --- a/packages/generate-project/README.md +++ b/packages/generate-project/README.md @@ -9,10 +9,12 @@ import { downloadAndGenerateProject } from '@iceworks/generate-project'; await downloadAndGenerateProject( projectDir, - npmName, - npmVersion, - npmRegistry?, - projectName?, - ejsOptions?, + scaffoldNpmName, + { + version, + registry, + extraDependencies, + ejsOptions, + } ); ``` diff --git a/packages/generate-project/package.json b/packages/generate-project/package.json index 19a82e73a..3a7c6e95f 100644 --- a/packages/generate-project/package.json +++ b/packages/generate-project/package.json @@ -1,12 +1,12 @@ { "name": "@iceworks/generate-project", - "version": "1.4.6", + "version": "2.0.0", "description": "Generator project", "files": [ "lib/" ], "engines": { - "node": ">=12" + "node": ">=12.20.0" }, "main": "lib/index.js", "repository": { @@ -22,14 +22,17 @@ }, "dependencies": { "@appworks/constant": "^0.1.0", - "ejs": "^3.1.3", + "ejs": "^3.1.8", "fs-extra": "^8.1.0", "glob": "^7.1.6", "ice-npm-utils": "^3.0.0", - "ora": "^4.0.3" + "ora": "^5.4.1", + "prettier": "^2.7.1" }, - "gitHead": "fc5b35f95ab4cc24898845916acf598c2f34d576", "devDependencies": { - "@types/fs-extra": "^9.0.1" + "@types/ejs": "^3.1.2", + "@types/fs-extra": "^8.0.0", + "@types/prettier": "^2.7.2", + "typescript": "^4.9.5" } } diff --git a/packages/generate-project/src/__tests__/downloadAndGenerateProject.test.ts b/packages/generate-project/src/__tests__/downloadAndGenerateProject.test.ts new file mode 100644 index 000000000..5fd6bd686 --- /dev/null +++ b/packages/generate-project/src/__tests__/downloadAndGenerateProject.test.ts @@ -0,0 +1,196 @@ +import * as path from 'path'; +import * as fs from 'fs-extra'; +import { downloadAndGenerateProject } from '..'; + +const tmpPath = path.resolve(__dirname, '../../.tmp'); + +jest.setTimeout(60 * 1000); + +beforeAll(async () => { + await fs.ensureDir(tmpPath); +}) + +test('generate ice3-lite scaffold', async () => { + const projectDir = path.resolve(tmpPath, 'ice-lite'); + await fs.ensureDir(projectDir); + + await downloadAndGenerateProject( + projectDir, + '@ice/lite-scaffold', + { + ejsOptions: { + appConfig: { + importDeclarationsStr: `import type { Manifest } from '@ice/plugin-pha/types'; +import { defineSpmConfig } from '@ali/ice-plugin-spm/types'; + `, + exportDeclarationsStr: ` +export const spmConfig = defineSpmConfig(() => { + return { + spmA: 'spmA', + } +}); + +export const phaManifest: Manifest = { + routes: [ + 'index', + ], +} + `, + }, + iceConfig: { + importDeclarationsStr: `import def from '@ali/ice-plugin-def'; +import pha from '@ice/plugin-pha'; +import spm from '@ali/ice-plugin-spm';\n`, + optionsStr: ` +plugins: [ + def(), + pha(), + spm(), +], + `, + }, + esLintConfigOptions: `{ + extends: [] + }`, + }, + extraDependencies: { + devDependencies: { + '@ali/ice-plugin-def': '^1.0.0', + '@ali/ice-plugin-spm': '^1.0.0', + '@ice/plugin-pha': '^2.0.0', + }, + }, + } + ); + + const pkgJsonPath = path.join(projectDir, 'package.json'); + const pkgJsonContent = await fs.readJSON(pkgJsonPath); + expect(pkgJsonContent.version).toBe('0.1.0'); + expect(Object.keys(pkgJsonContent.devDependencies).includes('@ali/ice-plugin-def')).toBeTruthy(); + expect(Object.keys(pkgJsonContent.devDependencies).includes('@ali/ice-plugin-spm')).toBeTruthy(); + expect(Object.keys(pkgJsonContent.devDependencies).includes('@ice/plugin-pha')).toBeTruthy(); + + const appConfigPath = path.join(projectDir, 'src/app.ts'); + const appConfigContent = await fs.readFile(appConfigPath, 'utf-8'); + expect(appConfigContent.includes('export const phaManifest')).toBeTruthy(); + expect(appConfigContent.includes('export const spmConfig')).toBeTruthy(); + expect(appConfigContent.includes(`import type { Manifest } from '@ice/plugin-pha/types'; +import { defineSpmConfig } from '@ali/ice-plugin-spm/types';`)).toBeTruthy(); + + const configPath = path.join(projectDir, 'ice.config.mts'); + const configContent = await fs.readFile(configPath, 'utf-8'); + expect(configContent.includes(`import def from '@ali/ice-plugin-def'; +import pha from '@ice/plugin-pha'; +import spm from '@ali/ice-plugin-spm';`)).toBeTruthy(); + expect(configContent.includes('plugins: [def(), pha(), spm()]')).toBeTruthy(); + + const eslintConfig = path.join(projectDir, '.eslintrc.cjs'); + const eslintConfigContent = await fs.readFile(eslintConfig, 'utf-8'); + expect(eslintConfigContent.includes("extends: [],")).toBeTruthy(); +}) + +test('generate antd-pro scaffold', async () => { + const projectDir = path.resolve(tmpPath, 'antd-pro'); + await fs.ensureDir(projectDir); + + await downloadAndGenerateProject( + projectDir, + '@ice/antd-pro-scaffold', + { + ejsOptions: { + appConfig: { + configStr: `router: { + type: 'hash', + },`, + }, + iceConfig: { + importDeclarationsStr: `import def from '@ali/ice-plugin-def';\n`, + options: { + pluginItemsStr: `def(),` + }, + }, + esLintConfigOptions: `{ + extends: [] + }`, + }, + extraDependencies: { + devDependencies: { + '@ali/ice-plugin-def': '^1.0.0', + }, + } + } + ); + + const pkgJsonPath = path.join(projectDir, 'package.json'); + const pkgJsonContent = await fs.readJSON(pkgJsonPath); + expect(pkgJsonContent.version).toBe('0.1.0'); + expect(Object.keys(pkgJsonContent.devDependencies).includes('@ali/ice-plugin-def')).toBeTruthy(); + + const appConfigPath = path.join(projectDir, 'src/app.ts'); + const appConfigContent = await fs.readFile(appConfigPath, 'utf-8'); + expect(appConfigContent.includes(`router: { + type: 'hash', + },`)).toBeTruthy(); + + const configPath = path.join(projectDir, 'ice.config.mts'); + const configContent = await fs.readFile(configPath, 'utf-8'); + expect(configContent.includes(`import def from '@ali/ice-plugin-def';`)).toBeTruthy(); + expect(configContent.includes('plugins: [request(), store(), auth(), def()]')).toBeTruthy(); + + const eslintConfig = path.join(projectDir, '.eslintrc.cjs'); + const eslintConfigContent = await fs.readFile(eslintConfig, 'utf-8'); + expect(eslintConfigContent.includes("extends: [],")).toBeTruthy(); +}) + +test('generate fusion-pro scaffold', async () => { + const projectDir = path.resolve(tmpPath, 'fusion-pro'); + await fs.ensureDir(projectDir); + + await downloadAndGenerateProject( + projectDir, + '@ice/fusion-pro-scaffold', + { + ejsOptions: { + appConfig: { + configStr: `router: { + type: 'hash', + },`, + }, + iceConfig: { + importDeclarationsStr: `import def from '@ali/ice-plugin-def';\n`, + options: { + pluginItemsStr: `def(),` + }, + }, + esLintConfigOptions: `{ + extends: [] + }`, + }, + extraDependencies: { + devDependencies: { + '@ali/ice-plugin-def': '^1.0.0', + }, + } + } + ); + + const pkgJsonPath = path.join(projectDir, 'package.json'); + const pkgJsonContent = await fs.readJSON(pkgJsonPath); + expect(pkgJsonContent.version).toBe('0.1.0'); + expect(Object.keys(pkgJsonContent.devDependencies).includes('@ali/ice-plugin-def')).toBeTruthy(); + + const appConfigPath = path.join(projectDir, 'src/app.ts'); + const appConfigContent = await fs.readFile(appConfigPath, 'utf-8'); + expect(appConfigContent.includes(`router: { + type: 'hash', + },`)).toBeTruthy(); + + const configPath = path.join(projectDir, 'ice.config.mts'); + const configContent = await fs.readFile(configPath, 'utf-8'); + expect(configContent.includes(`import def from '@ali/ice-plugin-def';`)).toBeTruthy(); + expect(configContent.includes('plugins: [request(), store(), auth(), def()]')).toBeTruthy(); + + const eslintConfig = path.join(projectDir, '.eslintrc.cjs'); + const eslintConfigContent = await fs.readFile(eslintConfig, 'utf-8'); + expect(eslintConfigContent.includes("extends: [],")).toBeTruthy(); +}) diff --git a/packages/generate-project/src/__tests__/index.ts b/packages/generate-project/src/__tests__/index.ts deleted file mode 100644 index 3cf398ddc..000000000 --- a/packages/generate-project/src/__tests__/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as path from 'path'; -import * as fs from 'fs-extra'; -import { downloadAndGenerateProject } from '..'; - -jest.setTimeout(60 * 1000); - -const registry = 'https://registry.npmjs.org'; -const tmpPath = path.resolve(__dirname, '../../.tmp'); -fs.removeSync(tmpPath); - -test('downloadAndGenerateProject build-scripts', async () => { - const projectDir = path.resolve(tmpPath, 'build-scripts'); - await fs.ensureDir(projectDir); - - await downloadAndGenerateProject(projectDir, '@alifd/scaffold-lite', null, registry); - // await fs.remove(projectDir); -}); - -test('downloadAndGenerateProject raxjs with ejs options', async () => { - const projectDir = path.resolve(tmpPath, 'raxjs-ejs'); - await fs.ensureDir(projectDir); - - await downloadAndGenerateProject(projectDir, '@rax-materials/scaffolds-app-js', null, registry, null, { - targets: ['web', 'miniapp'], - mpa: true, - pha: true, - }); - // await fs.remove(projectDir); -}); - -test('downloadAndGenerateProject ice-scripts@2.x', async () => { - const projectDir = path.resolve(tmpPath, 'ice-scripts-2.x'); - await fs.ensureDir(projectDir); - - await downloadAndGenerateProject(projectDir, '@icedesign/pro-scaffold', '3.0.12', registry); - // await fs.remove(projectDir); -}); - -test('downloadAndGenerateProject ice-scripts@1.x', async () => { - const projectDir = path.resolve(tmpPath, 'ice-scripts-1.x'); - await fs.ensureDir(projectDir); - - await downloadAndGenerateProject(projectDir, '@icedesign/pro-scaffold', '2.0.12', registry); - // await fs.remove(projectDir); -}); diff --git a/packages/generate-project/src/addDependenciesToPkgJson.ts b/packages/generate-project/src/addDependenciesToPkgJson.ts new file mode 100644 index 000000000..f74e4a62e --- /dev/null +++ b/packages/generate-project/src/addDependenciesToPkgJson.ts @@ -0,0 +1,23 @@ +import * as path from 'path'; +import * as fse from 'fs-extra'; + +export interface ExtraDependencies { + dependencies?: Record; + devDependencies?: Record; +} + +export default async function addDependencies(extraDependencies: ExtraDependencies, projectDir: string) { + const pkgJsonPath = path.join(projectDir, 'package.json'); + if (!await fse.pathExists(pkgJsonPath)) { + throw new Error(`Path ${pkgJsonPath} does not exist.`); + } + const pkgJson = await fse.readJSON(path.join(projectDir, 'package.json')); + Object.entries(extraDependencies).forEach(([depType, value]) => { + if (!pkgJson[depType]) { + pkgJson[depType] = {}; + } + pkgJson[depType] = { ...value, ...pkgJson[depType] }; + }); + + await fse.writeJSON(pkgJsonPath, pkgJson, { spaces: 2 }); +} diff --git a/packages/generate-project/src/ejsRenderDir.ts b/packages/generate-project/src/ejsRenderDir.ts index 07cd0566d..782ba4362 100644 --- a/packages/generate-project/src/ejsRenderDir.ts +++ b/packages/generate-project/src/ejsRenderDir.ts @@ -1,10 +1,13 @@ import * as path from 'path'; -import * as glob from 'glob'; import * as ejs from 'ejs'; import * as fse from 'fs-extra'; +import type { Data as ejsData } from 'ejs'; +import formatFileContent from './formatFileContent'; -export default async function (dir: string, options: any): Promise { - return new Promise((resolve, reject) => { +import glob = require('glob'); + +export default async function ejsRenderDir(dir: string, data: ejsData): Promise { + const files: string[] = await new Promise((resolve, reject) => { glob( '**/*.ejs', { @@ -13,38 +16,25 @@ export default async function (dir: string, options: any): Promise { dot: true, ignore: ['node_modules/**'], }, - (err, files) => { - if (err) { - return reject(err); + (error, matches) => { + if (error) { + reject(error); } - - Promise.all( - files.map((file) => { - const filepath = path.join(dir, file); - return renderFile(filepath, options); - }), - ) - .then(() => { - resolve(); - }) - .catch((error) => { - reject(error); - }); + resolve(matches); }, ); }); -} -function renderFile(filepath: string, options: any): Promise { - return new Promise((resolve, reject) => { - ejs.renderFile(filepath, options, (err, result) => { - if (err) { - return reject(err); - } + await Promise.all( + files.map((file) => { + const filepath = path.join(dir, file); + return renderAndFormatFile(filepath, data); + }), + ); +} - fse.removeSync(filepath); - fse.writeFileSync(filepath.replace(/\.ejs$/, ''), result); - resolve(); - }); - }); +async function renderAndFormatFile(filepath: string, data: ejsData): Promise { + const fileContent = await ejs.renderFile(filepath, data); + await fse.writeFile(filepath.replace(/\.ejs$/, ''), formatFileContent(fileContent)); + await fse.remove(filepath); } diff --git a/packages/generate-project/src/formatFileContent.ts b/packages/generate-project/src/formatFileContent.ts new file mode 100644 index 000000000..5fc2a1823 --- /dev/null +++ b/packages/generate-project/src/formatFileContent.ts @@ -0,0 +1,11 @@ +import * as prettier from 'prettier'; +import type { Options } from 'prettier'; + +export default function formatFileContent(text: string, options: Options = {}) { + return prettier.format(text, { + singleQuote: true, + tabWidth: 2, + parser: 'babel-ts' as any, + ...options, + }); +} diff --git a/packages/generate-project/src/formatFilename.ts b/packages/generate-project/src/formatFilename.ts index 5c91f4735..5995d0448 100644 --- a/packages/generate-project/src/formatFilename.ts +++ b/packages/generate-project/src/formatFilename.ts @@ -4,11 +4,13 @@ export default function formatFilename(filename: string) { // 只转换特定文件,防止误伤 const dotFilenames = [ + '_gitignore', '_eslintrc.js', + '_eslintrc.cjs', '_eslintrc', '_eslintignore', - '_gitignore', '_stylelintrc.js', + '_stylelintrc.cjs', '_stylelintrc', '_stylelintignore', '_editorconfig', diff --git a/packages/generate-project/src/formatPkgJson.ts b/packages/generate-project/src/formatPkgJson.ts new file mode 100644 index 000000000..dc3c52e83 --- /dev/null +++ b/packages/generate-project/src/formatPkgJson.ts @@ -0,0 +1,29 @@ +import * as path from 'path'; +import * as fse from 'fs-extra'; + +export default async function formatPkgJson(projectDir: string) { + const pkgJsonPath = path.join(projectDir, 'package.json'); + if (!await fse.pathExists(pkgJsonPath)) { + throw new Error(`Path ${pkgJsonPath} does not exist.`); + } + + let pkgJsonContent = await fse.readJSON(pkgJsonPath); + pkgJsonContent = initVersion(pkgJsonContent); + pkgJsonContent = deleteFields(pkgJsonContent); + + await fse.writeJSON(pkgJsonPath, pkgJsonContent, { spaces: 2 }); +} + +function initVersion(pkgJsonContent: Record) { + pkgJsonContent['version'] = '0.1.0'; + return pkgJsonContent; +} + +function deleteFields(pkgJsonContent: Record) { + delete pkgJsonContent.files; + delete pkgJsonContent.description; + delete pkgJsonContent.publishConfig; + delete pkgJsonContent.name; + + return pkgJsonContent; +} diff --git a/packages/generate-project/src/formatProject.ts b/packages/generate-project/src/formatProject.ts deleted file mode 100644 index 33f93b8d5..000000000 --- a/packages/generate-project/src/formatProject.ts +++ /dev/null @@ -1,172 +0,0 @@ -import * as path from 'path'; -import * as fse from 'fs-extra'; -import { ALI_YUEQU_URL } from '@appworks/constant'; -import { checkAliInternal } from 'ice-npm-utils'; - -export default async function formatProject(projectDir: string, projectName?: string, ejsOptions: any = {}): Promise { - await fse.remove(path.join(projectDir, 'build')); - - const { targets = [] } = ejsOptions; - let abcData = {}; - const abcPath = path.join(projectDir, 'abc.json'); - const pkgPath = path.join(projectDir, 'package.json'); - const miniProjectJsonPath = path.join(projectDir, 'mini.project.json'); - const appJSONPath = path.join(projectDir, 'src/app.json'); - const pkgData = fse.readJsonSync(pkgPath); - const isAliInternal = await checkAliInternal(); - const initialVersion = '0.1.0'; - - pkgData.dependencies = pkgData.dependencies || {}; - pkgData.devDependencies = pkgData.devDependencies || {}; - - // 通过 pkg.bizTeam 定制生成逻辑 - const bizTeam: 'govfe' | null = pkgData.bizTeam; - - console.log('clean package.json...'); - - // modify package.json - if (bizTeam !== 'govfe') { - pkgData.private = true; - } - pkgData.originTemplate = pkgData.name; - if (projectName) { - pkgData.name = projectName; - } - pkgData.version = initialVersion; - delete pkgData.files; - delete pkgData.bizTeam; - delete pkgData.publishConfig; - delete pkgData.scaffoldConfig; - delete pkgData.homepage; - if (pkgData.scripts) { - delete pkgData.scripts.screenshot; - delete pkgData.scripts.prepublishOnly; - } - delete pkgData.devDependencies['@ice/screenshot']; - - // modify build.json - const buildJsonPath = path.join(projectDir, 'build.json'); - if (fse.existsSync(buildJsonPath)) { - const buildData = fse.readJsonSync(buildJsonPath); - buildData.plugins = buildData.plugins || []; - - delete buildData.publicPath; - - if (!isAliInternal) { - // 对社区不透出 pha - delete buildData.web?.pha; - } - - // generate abcData && add plugin-def to build.json&package.json - if (isAliInternal && bizTeam !== 'govfe') { - if (pkgData.dependencies.rax) { - // For Rax project - abcData = { - type: 'rax', - builder: '@ali/builder-rax-v1', - }; - - // add @ali/build-plugin-rax-app-def - if (!pkgData.devDependencies['@ali/build-plugin-rax-app-def']) { - let defPluginVersion = '^3.0.0'; - if (pkgData.devDependencies['build-plugin-rax-app'] && !pkgData.devDependencies['rax-app']) { - // 兼容 rax-app@2.0 - defPluginVersion = '^1.0.2'; - } - pkgData.devDependencies['@ali/build-plugin-rax-app-def'] = defPluginVersion; - } - - buildData.plugins.push('@ali/build-plugin-rax-app-def'); - - // add @ali/build-plugin-event-tracking-register and @ali/universal-event-tracking - pkgData.devDependencies['@ali/build-plugin-event-tracking-register'] = '^1.0.0'; - pkgData.dependencies['@ali/universal-event-tracking'] = '^1.0.0'; - buildData.plugins.push(['@ali/build-plugin-event-tracking-register', { - goldlog: false, // 默认关闭埋点方案的创建和同步,免于在初建时,出现权限相关提示,预留手动指定 appInfoId 的时机 - }]); - - // TODO: remove src/app.js for mpa project - // if ( - // (buildData.web && buildData.web.mpa) - // || buildData.mpa // 未来有可能把 mpa 提上去 - // ) { - // try { - // fse.removeSync(path.join(projectDir, './src/app.js')); - // fse.removeSync(path.join(projectDir, './src/app.ts')); - // } catch (err) { - // // ignore error - // } - // } - } else { - abcData = { - type: 'ice-app', - builder: '@ali/builder-ice-app', - }; - - // add @ali/build-plugin-ice-def - pkgData.devDependencies['@ali/build-plugin-ice-def'] = '^0.1.0'; - buildData.plugins.push('@ali/build-plugin-ice-def'); - } - } - // delete build-plugin-fusion-material - const index = buildData.plugins.findIndex((item) => { - const pluginName = typeof item === 'string' ? item : item[0]; - return pluginName === 'build-plugin-fusion-material'; - }); - if (index !== -1) { - buildData.plugins.splice(index, 1); - delete pkgData.devDependencies['build-plugin-fusion-material']; - } - - fse.writeJSONSync(buildJsonPath, buildData, { - spaces: 2, - }); - } else if (pkgData.devDependencies['ice-scripts']) { - const buildVersion = pkgData.devDependencies['ice-scripts']; - // ^1.y.z, ~1.y.z, 1.x - const is1X = /^(\^|~|)1\./.test(buildVersion); - abcData = { - type: 'ice-scripts', - builder: is1X ? '@ali/builder-iceworks' : '@ali/builder-ice-scripts', - }; - - if (!is1X) { - // TODO: 操作 ice.config.js 加入 ice-plugin-def;删除 publicPath; - console.log(`If you need to deploy with DEF, please refer to the doc: ${ALI_YUEQU_URL}`); - } else if (pkgData.buildConfig) { - delete pkgData.buildConfig.output; - delete pkgData.buildConfig.localization; - } - } - - if (isAliInternal) { - if (!fse.existsSync(abcPath)) { - fse.writeJSONSync(abcPath, abcData, { - spaces: 2, - }); - } - // Only Alibaba (Taobao) MiniApp needs mini.project.json - if (targets.includes('miniapp') && !fse.existsSync(miniProjectJsonPath)) { - fse.writeJSONSync(miniProjectJsonPath, { - miniprogramRoot: 'build/miniapp', - scripts: { - beforeUpload: 'npm run build', - }, - }, { spaces: 2 }); - } - // Add builtInLibrary: { lib-mtop: false } to app.json - if (targets.includes('web') && fse.existsSync(appJSONPath)) { - const appJSONData = fse.readJsonSync(appJSONPath); - fse.writeJSONSync(appJSONPath, { - ...appJSONData, - builtInLibrary: { - 'lib-mtop': false, - }, - }, { spaces: 2 }); - } - } - - fse.writeJSONSync(pkgPath, pkgData, { - spaces: 2, - }); -} diff --git a/packages/generate-project/src/formatScaffoldToProject.ts b/packages/generate-project/src/formatScaffoldToProject.ts index e1a895b62..ad1932cf1 100644 --- a/packages/generate-project/src/formatScaffoldToProject.ts +++ b/packages/generate-project/src/formatScaffoldToProject.ts @@ -1,18 +1,52 @@ import * as fse from 'fs-extra'; import * as path from 'path'; -import { glob } from 'glob'; import formatFilename from './formatFilename'; -import formatProject from './formatProject'; +import writeAbcJson from './writeAbcJson'; import ejsRenderDir from './ejsRenderDir'; +import type { ExtraDependencies } from './addDependenciesToPkgJson'; +import addDependencies from './addDependenciesToPkgJson'; +import formatPkgJson from './formatPkgJson'; -export default async function formatScaffoldToProject(projectDir: string, projectName?: string, ejsOptions: any = {}) { +import glob = require('glob'); + +interface Options { + extraDependencies?: ExtraDependencies; + ejsOptions?: Record; +} + +export default async function formatScaffoldToProject( + projectDir: string, + { + extraDependencies, + ejsOptions = {}, + }: Options, +) { // format filename - const files = glob.sync('**/*', { cwd: projectDir, ignore: ['node_modules/**', 'build/**', '.ice/**', '.rax/**'] }); + const files: string[] = await new Promise((resolve, reject) => { + glob( + '**/*', + { + cwd: projectDir, + ignore: ['node_modules/**', 'build/**', '.ice/**', '.rax/**'], + }, + (error, matches) => { + if (error) { + reject(error); + } + resolve(matches); + }, + ); + }); + files.forEach((file) => { fse.renameSync(path.join(projectDir, file), path.join(projectDir, formatFilename(file))); }); - // render ejs template + // Render ejs templates. await ejsRenderDir(projectDir, ejsOptions); - // format project - await formatProject(projectDir, projectName, ejsOptions); + // Format project. + await writeAbcJson(projectDir); + // Add dependencies to package.json. + await addDependencies(extraDependencies, projectDir); + + await formatPkgJson(projectDir); } diff --git a/packages/generate-project/src/index.ts b/packages/generate-project/src/index.ts index 518a70be1..cc510e888 100644 --- a/packages/generate-project/src/index.ts +++ b/packages/generate-project/src/index.ts @@ -1,44 +1,39 @@ -import * as ora from 'ora'; import { isAliNpm, getNpmTarball, getAndExtractTarball } from 'ice-npm-utils'; import { ALI_NPM_REGISTRY } from '@appworks/constant'; -import formatProject from './formatProject'; import checkEmpty from './checkEmpty'; import formatScaffoldToProject from './formatScaffoldToProject'; +import type { ExtraDependencies } from './addDependenciesToPkgJson'; -export { formatProject, checkEmpty, formatScaffoldToProject }; +import ora = require('ora'); -export interface IEjsOptions { - targets?: string[]; - miniappType?: 'runtime' | 'compile'; - mpa?: boolean; - pha?: boolean; +export { checkEmpty, formatScaffoldToProject }; + +interface Options { + version?: string; + registry?: string; + projectName?: string; + extraDependencies?: ExtraDependencies; + ejsOptions?: Record; } export async function downloadAndGenerateProject( projectDir: string, - npmName: string, - version?: string, - registry?: string, - projectName?: string, - ejsOptions?: IEjsOptions, + scaffoldNpmName: string, + { + version, + registry, + extraDependencies, + ejsOptions, + }: Options, ): Promise { - registry = registry || (await getNpmRegistry(npmName)); - - // 根据模板创建项目支持的参数 - ejsOptions = { - targets: ['web'], - miniappType: 'runtime', - mpa: false, - pha: false, - ...ejsOptions, - }; + registry = registry || (await getNpmRegistry(scaffoldNpmName)); let tarballURL: string; try { - tarballURL = await getNpmTarball(npmName, version || 'latest', registry); + tarballURL = await getNpmTarball(scaffoldNpmName, version || 'latest', registry); } catch (error) { if (error.response && error.response.status === 404) { - return Promise.reject(new Error(`获取模板 npm 信息失败,当前的模板地址是:${registry}/${npmName}。`)); + return Promise.reject(new Error(`获取模板 npm 信息失败,当前的模板地址是:${registry}/${scaffoldNpmName}。`)); } else { return Promise.reject(error); } @@ -57,9 +52,15 @@ export async function downloadAndGenerateProject( spinner.succeed('download npm tarball successfully.'); try { - await formatScaffoldToProject(projectDir, projectName, ejsOptions); + await formatScaffoldToProject( + projectDir, + { + ejsOptions, + extraDependencies, + }, + ); } catch (err) { - console.warn('format scaffold to project error', err.message); + console.warn('format scaffold to project error', err); } } diff --git a/packages/generate-project/src/writeAbcJson.ts b/packages/generate-project/src/writeAbcJson.ts new file mode 100644 index 000000000..3a39add7c --- /dev/null +++ b/packages/generate-project/src/writeAbcJson.ts @@ -0,0 +1,22 @@ +import * as path from 'path'; +import * as fse from 'fs-extra'; +import { checkAliInternal } from 'ice-npm-utils'; + +export default async function writeAbcJson(projectDir: string) { + const isAliInternal = await checkAliInternal(); + + // abc.json for internal. + if (isAliInternal) { + const abcPath = path.join(projectDir, 'abc.json'); + if (!fse.existsSync(abcPath)) { + const abcData = { + type: 'ice-app', + builder: '@ali/builder-ice-v3', + }; + fse.writeJSONSync(abcPath, abcData, { + spaces: 2, + }); + console.log(`Generated ${abcPath}.\n`); + } + } +} diff --git a/packages/generate-project/tsconfig.json b/packages/generate-project/tsconfig.json index 79f4dae05..ca5c4e410 100644 --- a/packages/generate-project/tsconfig.json +++ b/packages/generate-project/tsconfig.json @@ -2,9 +2,11 @@ "extends": "../../tsconfig.settings.json", "compilerOptions": { "baseUrl": "./", + "target": "ES2017", + "module": "CommonJS", "rootDir": "src", "outDir": "lib", "moduleResolution": "node" }, - "exclude": ["src/__tests__", "lib"] + "exclude": ["src/__tests__"] } diff --git a/packages/material-engine/src/page/utils/renderEjsTemplates.ts b/packages/material-engine/src/page/utils/renderEjsTemplates.ts index 70982d87c..681749699 100644 --- a/packages/material-engine/src/page/utils/renderEjsTemplates.ts +++ b/packages/material-engine/src/page/utils/renderEjsTemplates.ts @@ -36,7 +36,8 @@ export default async function renderEjsTemplates(templateData: Record { - event.forEach((e) => { - if ( - e.action === nsfw.actions.CREATED || - e.action === nsfw.actions.MODIFIED || - e.action === nsfw.actions.RENAMED - ) { - const filePath = e.newFile ? path.join(e.directory, e.newFile!) : path.join(e.directory, e.file!); - if (fileSet.has(filePath)) { - console.log('non-ts change detected:', filePath); - copyOneFile(path.relative(cwd, filePath), cwd); - } + const watcher = chokidar.watch(cwd, { ignoreInitial: true }); + watcher + .on('all', (event, filePath) => { + const availableEvents = ['add', 'change']; + if (availableEvents.includes(event) + && filePath.match(/.+[\\/]src[\\/].+\.(?!ts$|tsx$|rs$)/)) { + console.log('non-ts change detected:', filePath); + copyOneFile(path.relative(cwd, filePath), cwd); } }); - }); - watcher.start(); } watchFiles(path.join(__dirname, '../packages'), '*/src/**/!(*.ts|*.tsx)').catch((e) => { diff --git a/tsconfig.json b/tsconfig.json index 7dafffa25..a16b3e516 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,8 @@ "references": [ { "path": "packages/constant" }, { "path": "packages/generate-material" }, - { "path": "packages/generate-project" }, + // Not compatible with @iceworks/generate-project@1.x which use in other extensions. + // { "path": "packages/generate-project" }, { "path": "packages/cli" }, { "path": "packages/doctor" }, { "path": "packages/i18n" }, diff --git a/yarn.lock b/yarn.lock index d050249e3..50c4f1853 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2055,6 +2055,18 @@ require-all "^3.0.0" semver "^7.3.2" +"@iceworks/generate-project@^1.2.2": + version "1.4.6" + resolved "https://registry.yarnpkg.com/@iceworks/generate-project/-/generate-project-1.4.6.tgz#d7373de48c212d281680e6c9327343c0a989df57" + integrity sha512-FdwxxD7yykmM63RIgjhzmrArNI2zBMpcP6cdk3n/B3s/OSCAg7vYoZppOBXM6qGDve/5smE+7NLjXMNlNSLVdg== + dependencies: + "@appworks/constant" "^0.1.0" + ejs "^3.1.3" + fs-extra "^8.1.0" + glob "^7.1.6" + ice-npm-utils "^3.0.0" + ora "^4.0.3" + "@iceworks/spec@^1.0.0", "@iceworks/spec@^1.3.0": version "1.3.2" resolved "https://registry.yarnpkg.com/@iceworks/spec/-/spec-1.3.2.tgz#b7ae37ec9cf83760985f113181463effd6bdac9e" @@ -3505,6 +3517,11 @@ dependencies: "@babel/types" "^7.3.0" +"@types/ejs@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.2.tgz#75d277b030bc11b3be38c807e10071f45ebc78d9" + integrity sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g== + "@types/execa@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/execa/-/execa-2.0.0.tgz#4dd5523520c51834bf8d0c280f460814e5238281" @@ -3512,7 +3529,7 @@ dependencies: execa "*" -"@types/fs-extra@^8.1.0": +"@types/fs-extra@^8.0.0", "@types/fs-extra@^8.1.0": version "8.1.2" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.2.tgz#7125cc2e4bdd9bd2fc83005ffdb1d0ba00cca61f" integrity sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg== @@ -3676,6 +3693,11 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== +"@types/prettier@^2.7.2": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + "@types/prop-types@*": version "15.7.4" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" @@ -4818,6 +4840,11 @@ async@^2.6.2: dependencies: lodash "^4.17.14" +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + async@~0.2.10: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -5401,6 +5428,15 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blamer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/blamer/-/blamer-1.0.1.tgz#0453b2e94764fb71d2a913c198fff0335fe875aa" @@ -5686,7 +5722,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.2.1: +buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -6182,6 +6218,14 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -6352,6 +6396,11 @@ cli-spinners@^2.2.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + cli-table3@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" @@ -8205,6 +8254,13 @@ ejs@^3.1.2, ejs@^3.1.3, ejs@^3.1.5, ejs@^3.1.6: dependencies: jake "^10.6.1" +ejs@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.723: version "1.3.784" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.784.tgz#c370be79374b02b7f13e8a8fb0d7a02641161dac" @@ -12089,6 +12145,16 @@ jake@^10.6.1: filelist "^1.0.1" minimatch "^3.0.4" +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + javascript-stringify@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" @@ -14707,7 +14773,7 @@ mz@^2.5.0, mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.0.0, nan@^2.12.1, nan@^2.13.2: +nan@^2.12.1, nan@^2.13.2: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== @@ -15140,13 +15206,6 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: gauge "~2.7.3" set-blocking "~2.0.0" -nsfw@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-1.2.9.tgz#e49ff5c12593cbcce3fcc90c533947eb4f15a99a" - integrity sha512-/2o89nygBRTTnGRxSHt2wjagbszyh36HlgF61Ec2iaJBTIIQ6QKcqp92EzVxxZX9U/6Qpy+LZL5i8532hXzAHg== - dependencies: - nan "^2.0.0" - nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -15477,6 +15536,21 @@ ora@^4.0.3: strip-ansi "^6.0.0" wcwidth "^1.0.1" +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -17045,6 +17119,11 @@ prettier@^2.1.0, prettier@^2.1.2, prettier@^2.2.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== +prettier@^2.7.1: + version "2.8.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + pretty-data@^0.40.0: version "0.40.0" resolved "https://registry.yarnpkg.com/pretty-data/-/pretty-data-0.40.0.tgz#572aa8ea23467467ab94b6b5266a6fd9c8fddd72" @@ -17957,6 +18036,15 @@ readable-stream@1.1.x: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.4.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdir-scoped-modules@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -20832,11 +20920,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.0.0, typescript@^3.6.3, typescript@^3.7.2, typescript@^3.7.3, typescript@^3.8.2, typescript@^3.8.3: +typescript@^3.6.3, typescript@^3.7.2, typescript@^3.7.3, typescript@^3.8.2, typescript@^3.8.3: version "3.9.10" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"