From 51c83ed60dd0c01af4c3aaac09d2eb97dce6f432 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 10 Nov 2021 23:09:38 +0300 Subject: [PATCH] closes #21 --- esbuild.mjs | 89 ------------------- package.json | 4 +- packages/vscode-extra/tsconfig.prod.json | 1 - .../src/cli/buildExtension.ts | 17 +--- packages/vscode-framework/src/cli/commands.ts | 28 +++--- packages/vscode-framework/tsconfig.prod.json | 1 - packages/vscode-manifest/tsconfig.prod.json | 1 - patch-ts-output.mjs | 19 ++++ prepare.mjs | 8 +- scripts/formMonorepo.ts | 14 +-- tsconfig.prod.json | 2 +- 11 files changed, 43 insertions(+), 141 deletions(-) delete mode 100644 esbuild.mjs create mode 100644 patch-ts-output.mjs diff --git a/esbuild.mjs b/esbuild.mjs deleted file mode 100644 index 6910e51..0000000 --- a/esbuild.mjs +++ /dev/null @@ -1,89 +0,0 @@ -//@ts-check - -import { build } from 'esbuild' -import fs from 'fs' -import jsonfile from 'jsonfile' -import { posix as pathPosix } from 'path' - -import { globby } from 'globby' -import { fileURLToPath } from 'url' - -const { dirname, join, extname } = pathPosix -;(async () => { - // @ts-ignore - const __dirname = dirname(fileURLToPath(import.meta.url)) - - const fromPackages = (...p) => join(__dirname, 'packages', ...p) - - const packagesPath = fromPackages() - const packagesDirs = (await fs.promises.readdir(packagesPath)).filter(monorepoPackage => { - const fromPackage = (...p) => join(__dirname, 'packages', monorepoPackage, ...p) - if (!fs.existsSync(fromPackage('package.json'))) return false - const packageJson = jsonfile.readFileSync(fromPackage('package.json')) - if (!packageJson.types) return false - return true - }) - /** @type{"development" | "production"} */ - // @ts-ignore - const mode = process.argv[2] - let entryPoints = {} - for (const pkg of packagesDirs) { - const srcPath = fromPackages(pkg, 'src') - Object.assign( - entryPoints, - Object.fromEntries( - (await globby(fromPackages(pkg, 'src'))).map(path => { - const ext = extname(path) - return [join(pkg, 'build', path.slice(srcPath.length + 1, -ext.length)), path] - }), - ), - ) - } - if (!mode) throw new TypeError('mode is not specified') - await build({ - define: { - __DEV__: `${mode === 'development'}`, - }, - // watch: mode === 'development', - platform: 'node', - format: 'cjs', - logLevel: 'info', - // @ts-ignore - entryPoints, - outdir: 'packages', - banner: { - js: `/* vscode-framework ${mode === 'production' ? 'build' : 'dev'} */`, - }, - plugins: [ - { - name: 'writer', - setup(build) { - build.onEnd(async ({ errors }) => { - if (errors.length) return - const pathsToPatch = { - 'packages/vscode-framework/build/index.d.ts'(contents) { - return contents - .replace("RegularCommandsTypeToReplace: '';", '') - .replace("SettingsTypeToReplace: '';", '') - }, - 'packages/vscode-framework/build/framework/commands.d.ts'(contents) { - return contents.replace(/RegularCommandsTypeToReplace/g, '[k in keyof RegularCommands]') - }, - 'packages/vscode-framework/build/framework/settings.d.ts'(contents) { - return contents.replace(/"SettingsTypeToReplace"/g, 'keyof Settings') - }, - } - // TODO! combine with incremental - for (const [path, patch] of Object.entries(pathsToPatch)) { - const contents = await fs.promises.readFile(path, 'utf-8') - await fs.promises.writeFile(path, patch(contents), 'utf-8') - } - }) - }, - }, - ], - }) -})().catch(err => { - console.error(err) - process.exit(1) -}) diff --git a/package.json b/package.json index bfd9d1f..0f69c29 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,10 @@ "name": "vscode-framework", "private": true, "scripts": { - "start": "node prepare.mjs && tsc-watch -b tsconfig.dev.json --onSuccess \"node esbuild.mjs development\"", + "start": "node prepare.mjs && tsc-watch -b tsconfig.dev.json --onSuccess \"node patch-ts-output.mjs\"", "eslint": "eslint packages/*/src/**/*.ts", "test": "jest", - "build": "node prepare.mjs && tsc -b tsconfig.prod.json && tsc -p tsconfig.only-typechecking.json && node esbuild.mjs production" + "build": "node prepare.mjs && tsc -b tsconfig.prod.json && tsc -p tsconfig.only-typechecking.json" }, "devDependencies": { "@babel/cli": "^7.16.0", diff --git a/packages/vscode-extra/tsconfig.prod.json b/packages/vscode-extra/tsconfig.prod.json index 9e2a177..401cabd 100644 --- a/packages/vscode-extra/tsconfig.prod.json +++ b/packages/vscode-extra/tsconfig.prod.json @@ -2,7 +2,6 @@ "extends": "@zardoy/tsconfig/node-lib", "compilerOptions": { "composite": true, - "emitDeclarationOnly": true, "rootDir": "src", "outDir": "build" }, diff --git a/packages/vscode-framework/src/cli/buildExtension.ts b/packages/vscode-framework/src/cli/buildExtension.ts index c3fde32..3118a4b 100644 --- a/packages/vscode-framework/src/cli/buildExtension.ts +++ b/packages/vscode-framework/src/cli/buildExtension.ts @@ -19,7 +19,6 @@ import { LauncherCLIParams, launchVscode } from './launcher' import { generateAndWriteManifest } from './manifest-generator' import { newTypesGenerator } from './typesGenerator' import { WebSocketServer } from 'ws' -declare const __DEV__: boolean const debug = Debug('vscode-framework:bulid-extension') @@ -56,9 +55,7 @@ export const startExtensionDevelopment = async ( mode, outDir, }) - await del( - Object.values(EXTENSION_ENTRYPOINTS).flatMap(jsOut => [join(outDir, jsOut), join(outDir, `${jsOut}.map`)]), - ) + await del(Object.values(EXTENSION_ENTRYPOINTS).flatMap(jsOut => [join(outDir, jsOut), join(outDir, `${jsOut}.map`)])) if (mode === 'production') { await buildExtension(params) return @@ -170,8 +167,7 @@ export const startExtensionDevelopment = async ( watcher.on('add', onFileChange) watcher.on('unlink', async path => { // TODO also run typesGenerator - if (path.endsWith(manifestPath)) - console.log(kleur.red('[vscode-framework] Manifest is missing! Return it back.')) + if (path.endsWith(manifestPath)) console.log(kleur.red('[vscode-framework] Manifest is missing! Return it back.')) // TODO! run typesGenerator configurationType.ts was removed, for now need to rerun start script }) return { @@ -254,11 +250,7 @@ export const buildExtension = async ({ outDir, resolvedManifest: generatedManifest, defineEnv: { - IDS_PREFIX: config.prependIds - ? config.prependIds.style === 'camelCase' - ? camelCase(generatedManifest.name) - : generatedManifest.name - : undefined, + IDS_PREFIX: config.prependIds ? (config.prependIds.style === 'camelCase' ? camelCase(generatedManifest.name) : generatedManifest.name) : undefined, ...define, }, config, @@ -287,8 +279,7 @@ export const checkEntrypoint = (config: Config) => { }) const source = project.addSourceFileAtPath(entryPoint) // TODO fancy errors - if (!source.getVariableDeclarationOrThrow('activate').isExported()) - throw new Error("activate function isn't exported") + if (!source.getVariableDeclarationOrThrow('activate').isExported()) throw new Error("activate function isn't exported") console.timeEnd('check') } diff --git a/packages/vscode-framework/src/cli/commands.ts b/packages/vscode-framework/src/cli/commands.ts index 6867b16..1a6cb21 100644 --- a/packages/vscode-framework/src/cli/commands.ts +++ b/packages/vscode-framework/src/cli/commands.ts @@ -13,7 +13,6 @@ import { SuperCommander } from './commander' import { addStandaloneCommands } from './standaloneCommands' import { generateTypes } from './typesGenerator' import { generateAndWriteManifest } from '.' -declare const __DEV__: boolean const debug = Debug('vscode-framework:cli') @@ -55,16 +54,17 @@ commander.command( }, ) -commander.command( - 'generate-types', - 'Generate TypeScript typings (from contribution points) and place them to nearest node_modules for working with framework', - { - hidden: true, - }, - async () => { - await generateTypes({ nodeModulesDir: __DEV__ ? (await pkdDir(__dirname))! : process.cwd() }) - }, -) +// OLD types generator, isn't ready for this TS world +// commander.command( +// 'generate-types', +// 'Generate TypeScript typings (from contribution points) and place them to nearest node_modules for working with framework', +// { +// hidden: true, +// }, +// async () => { +// await generateTypes({ nodeModulesDir: __DEV__ ? (await pkdDir(__dirname))! : process.cwd() }) +// }, +// ) const useOutForDebugging = true const relativePath = useOutForDebugging ? 'out' : 'node_modules/.vscode-extension' @@ -92,8 +92,7 @@ commander.command( // TODO use config's default defaultValue: false, // reformat description - description: - 'If --web is present, you can launch web extension in desktop VSCode, instead of in browser', + description: 'If --web is present, you can launch web extension in desktop VSCode, instead of in browser', }, '--skip-launching': { defaultValue: false, @@ -153,8 +152,7 @@ commander.command( // TODO build path // TODO move check to schema - if (!config.target.desktop && !config.target.web) - throw new Error('Both targets are disabled in config. Enable either desktop or wb') + if (!config.target.desktop && !config.target.web) throw new Error('Both targets are disabled in config. Enable either desktop or wb') if (!skipTypechecking && fsExtra.existsSync('./tsconfig.json')) { const date = Date.now() diff --git a/packages/vscode-framework/tsconfig.prod.json b/packages/vscode-framework/tsconfig.prod.json index 9e2a177..401cabd 100644 --- a/packages/vscode-framework/tsconfig.prod.json +++ b/packages/vscode-framework/tsconfig.prod.json @@ -2,7 +2,6 @@ "extends": "@zardoy/tsconfig/node-lib", "compilerOptions": { "composite": true, - "emitDeclarationOnly": true, "rootDir": "src", "outDir": "build" }, diff --git a/packages/vscode-manifest/tsconfig.prod.json b/packages/vscode-manifest/tsconfig.prod.json index 9e2a177..401cabd 100644 --- a/packages/vscode-manifest/tsconfig.prod.json +++ b/packages/vscode-manifest/tsconfig.prod.json @@ -2,7 +2,6 @@ "extends": "@zardoy/tsconfig/node-lib", "compilerOptions": { "composite": true, - "emitDeclarationOnly": true, "rootDir": "src", "outDir": "build" }, diff --git a/patch-ts-output.mjs b/patch-ts-output.mjs new file mode 100644 index 0000000..fec883e --- /dev/null +++ b/patch-ts-output.mjs @@ -0,0 +1,19 @@ +//@ts-check +import fs from 'fs' + +const pathsToPatch = { + 'packages/vscode-framework/build/index.d.ts'(contents) { + return contents.replace("RegularCommandsTypeToReplace: '';", '').replace("SettingsTypeToReplace: '';", '') + }, + 'packages/vscode-framework/build/framework/commands.d.ts'(contents) { + return contents.replace(/RegularCommandsTypeToReplace/g, '[k in keyof RegularCommands]') + }, + 'packages/vscode-framework/build/framework/settings.d.ts'(contents) { + return contents.replace(/"SettingsTypeToReplace"/g, 'keyof Settings') + }, +} +// TODO! combine with incremental +for (const [path, patch] of Object.entries(pathsToPatch)) { + const contents = await fs.promises.readFile(path, 'utf-8') + await fs.promises.writeFile(path, patch(contents), 'utf-8') +} diff --git a/prepare.mjs b/prepare.mjs index c013b29..d4e0ac8 100644 --- a/prepare.mjs +++ b/prepare.mjs @@ -5,15 +5,13 @@ import * as globby from 'globby' let buildDel = await globby.globby(['packages/**/*.tsbuildinfo', 'packages/*/build/**']) -buildDel = buildDel.filter( - v => - v !== 'packages/vscode-framework/build/client.d.ts' && - v !== 'packages/vscode-framework/build/extensionBootstrap.ts', -) +buildDel = buildDel.filter(v => v !== 'packages/vscode-framework/build/client.d.ts' && v !== 'packages/vscode-framework/build/extensionBootstrap.ts') await del(buildDel, { // TODO! read gitignores automatically // gitignore: true, }) +// projects with compiste: true must run twice +// we're losing a lot of time here await execa('tsc', '-b tsconfig.prod.json'.split(' '), { preferLocal: true }).catch(e => {}) diff --git a/scripts/formMonorepo.ts b/scripts/formMonorepo.ts index 8bbd1b7..460ae92 100644 --- a/scripts/formMonorepo.ts +++ b/scripts/formMonorepo.ts @@ -17,18 +17,6 @@ import { getMonorepoPackages } from './common' for (const monorepoPackage of packagesDirs) { const fromPackage = (...p: string[]) => join('packages', monorepoPackage, ...p) - // eslint-disable-next-line no-await-in-loop - await modifyPackageJsonFile({ dir: fromPackage() }, packageJson => { - // temporarily - packageJson.repository = { - url: 'https://github.com/zardoy/vscode-framework.git', - directory: fromPackage().replace('\\', '/'), - } - return packageJson - }) - // if (fs.existsSync(fromPackage(packageTsconfigName))) { - // console.warn(monorepoPackage, 'has tsconfig.json') - // } for (const { path, tsconfig } of [ { path: packageTsconfigs.dev, @@ -45,7 +33,7 @@ import { getMonorepoPackages } from './common' extends: '@zardoy/tsconfig/node-lib', compilerOptions: { composite: true, - emitDeclarationOnly: true, + // emitDeclarationOnly: true, rootDir: 'src', outDir: 'build', }, diff --git a/tsconfig.prod.json b/tsconfig.prod.json index 3a32641..cfffc1e 100644 --- a/tsconfig.prod.json +++ b/tsconfig.prod.json @@ -12,4 +12,4 @@ } ], "files": [] -} +} \ No newline at end of file