Skip to content

Commit

Permalink
perf: migrate to esbuild
Browse files Browse the repository at this point in the history
  • Loading branch information
antongolub committed Jan 5, 2024
1 parent 106717e commit 2f86181
Show file tree
Hide file tree
Showing 16 changed files with 1,411 additions and 4,438 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
with:
coverageLocations: |
${{github.workspace}}/coverage/lcov.info:lcov
${{github.workspace}}/target/coverage/lcov.info:lcov
- name: Semantic Release
if: github.ref == 'refs/heads/master'
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ build
dist
lib
target
buildstamp.json

#Docs
docs
Expand Down
85 changes: 41 additions & 44 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,45 +3,42 @@
"version": "2.0.0",
"description": "QIWI OSS License",
"bin": {
"qiwilicense": "target/es6/cli.js"
"qiwilicense": "./target/esm/cli.mjs"
},
"type": "module",
"main": "target/cjs/index.cjs",
"exports": {
"import": "./target/es6/index.mjs",
"require": "./target/es5/index.js",
"types": "./typings/index.d.ts"
},
"main": "target/bundle/license.cjs",
"module": "target/bundle/license.mjs",
"unpkg": "target/bundle/license.umd.js",
"source": "target/bundle/license.cjs.map",
"types": "typings/index.d.ts",
"typescript": {
"definition": "typings/index.d.ts"
".": {
"types": "./target/dts/index.d.ts",
"require": "./target/cjs/index.cjs",
"import": "./target/esm/index.mjs",
"default": "./target/esm/index.mjs"
}
},
"module": "target/esm/index.mjs",
"types": "target/dts/index.d.ts",
"files": [
"README.md",
"CHANGELOG.md",
"target",
"typings",
"flow-typed"
"target/cjs",
"target/esm",
"target/dts",
"target/tpl"
],
"scripts": {
"lint": "eslint src/**/*.{ts,js}",
"lint:fix": "yarn lint --fix",
"test": "yarn lint && yarn test:unit",
"test:unit": "c8 uvu -r tsm ./src/test '.+\\.test\\.[tj]s' && c8 report -r lcov",
"format": "yarn test:lint --fix",
"test": "concurrently 'npm:test:*'",
"test:lint": "eslint src/**/*.{ts,js}",
"test:unit": "c8 -x '**/target' -x '**/src/test' --allowExternal -o target/coverage -r lcov -r text uvu -r tsm ./src/test '.+\\.test\\.[tj]s'",
"clean": "rimraf target typings",
"build:fix": "tsc-esm-fix --target=target/es6 --ext=.mjs",
"build": "yarn clean && yarn build:tpl && yarn build:es5 && yarn build:es6 && yarn build:fix && yarn build:ts && yarn build:libdef && yarn docs && yarn uglify && yarn build:bundle",
"build": "concurrently 'npm:build:*'",
"build:esm": "node ./src/scripts/build.cjs",
"build:cjs": "node ./src/scripts/build.cjs --cjs",
"build:dts": "tsc --emitDeclarationOnly --skipLibCheck --outDir target/dts",
"build:docs": "typedoc --options src/main/typedoc",
"build:stamp": "npm_config_yes=true npx buildstamp",
"build:tpl": "mkdir -p target/tpl && cp src/main/tpl/* target/tpl",
"build:es5": "mkdir -p target/es5 && tsc -p tsconfig.es5.json",
"build:es6": "mkdir -p target/es6 && tsc -p tsconfig.es6.json",
"build:ts": "cp -r src/main/ts/ target/ts/",
"build:bundle": "microbundle build src/main/ts/index.ts -o target/bundle",
"build:libdef": "libdefkit --tsconfig=tsconfig.es5.json --tsconfig=tsconfig.es6.json",
"docs": "typedoc",
"uglify": "for f in $(find target -name '*.js'); do short=${f%.js}; terser -c -m -o $short.js -- $f; done",
"publish:draft": "yarn build && npm publish --no-git-tag-version --tag draft",
"postupdate": "yarn && yarn build && yarn test"
},
"repository": {
Expand All @@ -59,30 +56,30 @@
"homepage": "https://github.com/qiwi/license#readme",
"dependencies": {
"lodash-es": "^4.17.21",
"meow": "^12.0.1",
"tslib": "^2.5.0"
"meow": "^12.1.1",
"tslib": "^2.6.2"
},
"devDependencies": {
"@qiwi/libdefkit": "^5.0.0",
"@qiwi/substrate": "^2.0.3",
"@types/jest": "^29.5.1",
"@types/jest-json-schema": "^6.1.1",
"@types/lodash-es": "^4.17.7",
"@types/meow": "^6.0.0",
"@types/node": "^20.1.4",
"@qiwi/substrate": "^2.0.4",
"@types/jest": "^29.5.11",
"@types/jest-json-schema": "^6.1.4",
"@types/lodash-es": "^4.17.12",
"@types/node": "^20.10.6",
"c8": "^9.0.0",
"concurrently": "^8.2.2",
"earljs": "^0.2.3",
"eslint": "^8.40.0",
"eslint-config-prettier": "^8.8.0",
"esbuild": "^0.19.11",
"esbuild-node-externals": "^1.12.0",
"esbuild-plugin-entry-chunks": "^0.1.3",
"eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-qiwi": "^2.1.3",
"execa": "^7.1.1",
"microbundle": "^0.15.1",
"rimraf": "^5.0.0",
"terser": "^5.17.3",
"tsc-esm-fix": "^2.20.14",
"rimraf": "^5.0.5",
"tsm": "^2.3.0",
"typedoc": "^0.24.7",
"typescript": "^5.0.4",
"typedoc": "^0.25.6",
"typescript": "^5.3.3",
"uvu": "^0.5.6"
},
"author": "QIWI <orensource@qiwi.com>",
Expand Down
2 changes: 1 addition & 1 deletion src/main/ts/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import meow from 'meow'

import {generate} from './license'
import {generate} from './license.ts'

export const cli = meow(`
Usage
Expand Down
4 changes: 2 additions & 2 deletions src/main/ts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ export {
DEFAULT_OPTS,
render,
loadTemplate,
} from './license'
export * from './interface'
} from './license.ts'
export * from './interface.ts'
7 changes: 6 additions & 1 deletion src/main/ts/license.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import {mkdirSync,readFileSync, writeFileSync} from 'node:fs'
import {resolve} from 'node:path'
import process from 'node:process'
import url from 'node:url'
import {template} from 'lodash-es'

import {
IRenderOpts,
TLanguage,
} from './interface'
} from './interface.ts'


const __dirname = url.fileURLToPath(new URL('.', import.meta.url))

const readPkgPkgJson = (cwd: string = process.cwd()) => {
try {
Expand Down
15 changes: 15 additions & 0 deletions src/main/typedoc/typedoc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "@qiwi/license",
"out": "../../../target/docs",
"entryPoints": ["../../../src/main/ts/"],
"exclude": ["../../../src/test", "**/node_modules/**"],
"externalPattern": ["**/node_modules/**"],
"excludeExternals": true,
"excludePrivate": true,
"excludeProtected": true,
"includeVersion": false,
"hideGenerator": true,
"readme": "../../../README.md",
"tsconfig": "../../../tsconfig.json",
"theme": "default"
}
51 changes: 51 additions & 0 deletions src/scripts/build.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env node

const esbuild = require('esbuild')
const { nodeExternalsPlugin } = require('esbuild-node-externals')
const { entryChunksPlugin } = require('esbuild-plugin-entry-chunks')

const esmConfig = {
entryPoints: ['./src/main/ts/index.ts', './src/main/ts/cli.ts'],
outdir: './target/esm',
bundle: true,
minify: false,
sourcemap: true,
sourcesContent: false,
platform: 'node',
target: 'ES2020',
format: 'esm',
outExtension: {
'.js': '.mjs'
},
external: ['node:*'], // https://github.com/evanw/esbuild/issues/1466
plugins: [ // https://github.com/evanw/esbuild/issues/619
nodeExternalsPlugin(),
entryChunksPlugin()
],
tsconfig: './tsconfig.json'
}

const cjsConfig = {
...esmConfig,
outdir: './target/cjs',
target: 'es6',
format: 'cjs',
plugins: [
entryChunksPlugin()
],
outExtension: {
'.js': '.cjs'
},
define: {
'import.meta': 'import_meta'
},
inject: ['./src/scripts/import.meta-polyfill.js']
}

const config = process.argv.includes('--cjs')
? cjsConfig
: esmConfig

esbuild
.build(config)
.catch(() => process.exit(1))
5 changes: 5 additions & 0 deletions src/scripts/import.meta-polyfill.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const import_meta = {
url: typeof document === 'undefined'
? new (require('url'.replace('', '')).URL)('file:' + __filename).href
: (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)
}
3 changes: 3 additions & 0 deletions src/scripts/import.meta.url-polyfill.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const import_meta_url = typeof document === 'undefined'
? new (require('url'.replace('', '')).URL)('file:' + __filename).href
: (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)
2 changes: 1 addition & 1 deletion src/test/js/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ import {describe, expect} from '../ts/test-utils'
describe('bundles have proper exports', (it) => {
it('es5 exposes `generate()`', () => {
// eslint-disable-next-line @typescript-eslint/no-var-requires
expect(require('../../../target/es5').generate).toEqual(expect.a(Function))
expect(require('@qiwi/license').generate).toEqual(expect.a(Function))
})
})
6 changes: 3 additions & 3 deletions src/test/ts/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import {readFileSync, writeFileSync} from 'node:fs'
import {resolve} from 'node:path'
import {promisify} from 'node:util'

import {generate, render, TLanguage} from '../../main/ts'
import {describe, expect} from './test-utils'
import {generate, render, TLanguage} from '../../main/ts/index.ts'
import {describe, expect} from './test-utils.ts'

const dir = resolve(__dirname, '../tmp')
const exec = promisify(_exec)
Expand Down Expand Up @@ -75,7 +75,7 @@ describe('bin', (it) => {
const filePath = resolve(dir, file)
const pkgJsonPath = resolve(dir, 'package.json')
const args = [
'./target/es6/cli.mjs',
'./target/cjs/cli.cjs',
'-l', lang,
'--cwd', dir,
`--file=${file}`,
Expand Down
9 changes: 0 additions & 9 deletions tsconfig.es5.json

This file was deleted.

8 changes: 0 additions & 8 deletions tsconfig.es6.json

This file was deleted.

34 changes: 14 additions & 20 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,30 +1,24 @@
{
"compilerOptions": {
"esModuleInterop": true,
"rootDir": "./src/main/ts/",
"baseUrl": "./src/main/ts/",
"moduleResolution": "node",
"target": "es5",
"lib": [
"esnext"
],
"strict": true,
"sourceMap": false,
"declaration": false,
"noEmitHelpers": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"importHelpers": true,
"allowSyntheticDefaultImports": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"experimentalDecorators": true,

"incremental": true,
"tsBuildInfoFile": "./buildcache/.tsbuildinfo"
"target": "esnext",
"module": "nodenext",
"moduleResolution": "nodenext",
"esModuleInterop": true,
"allowJs": false,
"allowImportingTsExtensions": true,
"noImplicitAny": true,
"declaration": true,
"forceConsistentCasingInFileNames": true
},
"ts-node": {
"transpileOnly": true,
"files": true,
},
"include": [
"src/main/**/*"
"src/main/ts/"
],
"exclude": [
"node_modules",
Expand Down
Loading

0 comments on commit 2f86181

Please sign in to comment.