Skip to content

Commit

Permalink
feat: pass all options to esbuild's transform api, closes #331
Browse files Browse the repository at this point in the history
  • Loading branch information
EGOIST committed Apr 6, 2022
1 parent d39fed7 commit b05c627
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 69 deletions.
78 changes: 30 additions & 48 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { existsSync, statSync } from 'fs'
import { extname, resolve, dirname, join } from 'path'
import { Plugin as RollupPlugin } from 'rollup'
import { transform, Loader, CommonOptions } from 'esbuild'
import { transform, Loader, TransformOptions } from 'esbuild'
import { MarkOptional } from 'ts-essentials'
import { createFilter, FilterPattern } from '@rollup/pluginutils'
import createDebug from 'debug'
import { getOptions } from './options'
import { minify, getRenderChunk } from './minify'
import { warn } from './warn'
import {
optimizeDeps,
optimizeDeps as doOptimizeDeps,
OptimizeDepsOptions,
OptimizeDepsResult,
} from './optimizer/optmize-deps'
Expand All @@ -25,27 +25,13 @@ const defaultLoaders: { [ext: string]: Loader } = {
'.tsx': 'tsx',
}

export type Options = {
export type Options = Omit<
TransformOptions,
'sourcemap' | 'loader' | 'tsconfigRaw'
> & {
include?: FilterPattern
exclude?: FilterPattern
sourceMap?: boolean
minify?: boolean
minifyWhitespace?: boolean
minifyIdentifiers?: boolean
minifySyntax?: boolean
charset?: CommonOptions['charset']
keepNames?: boolean
legalComments?: CommonOptions['legalComments']
target?: string | string[]
/**
* Requires esbuild >= 0.12.1
*/
jsx?: 'transform' | 'preserve'
jsxFactory?: string
jsxFragment?: string
define?: {
[k: string]: string
}
optimizeDeps?: MarkOptional<OptimizeDepsOptions, 'cwd' | 'sourceMap'>
/**
* Use this tsconfig file instead
Expand All @@ -59,19 +45,24 @@ export type Options = {
loaders?: {
[ext: string]: Loader | false
}
pure?: string[]
}

export default (options: Options = {}): RollupPlugin => {
let target: string | string[]

export default ({
include,
exclude,
sourceMap: _sourceMap,
optimizeDeps,
tsconfig,
loaders: _loaders,
...esbuildOptions
}: Options = {}): RollupPlugin => {
const loaders = {
...defaultLoaders,
}

if (options.loaders) {
for (const key of Object.keys(options.loaders)) {
const value = options.loaders[key]
if (_loaders) {
for (const key of Object.keys(_loaders)) {
const value = _loaders[key]
if (typeof value === 'string') {
loaders[key] = value
} else if (value === false) {
Expand All @@ -87,8 +78,8 @@ export default (options: Options = {}): RollupPlugin => {
const EXCLUDE_REGEXP = /node_modules/

const filter = createFilter(
options.include || INCLUDE_REGEXP,
options.exclude || EXCLUDE_REGEXP
include || INCLUDE_REGEXP,
exclude || EXCLUDE_REGEXP
)

const resolveFile = (resolved: string, index: boolean = false) => {
Expand All @@ -109,22 +100,21 @@ export default (options: Options = {}): RollupPlugin => {
options({ context }) {
if (context) {
cwd = context
options
}
return null
},
outputOptions({ sourcemap }) {
sourceMap = options.sourceMap ?? !!sourcemap
sourceMap = _sourceMap ?? !!sourcemap
return null
},

async buildStart() {
if (!options.optimizeDeps || optimizeDepsResult) return
if (!optimizeDeps || optimizeDepsResult) return

optimizeDepsResult = await optimizeDeps({
optimizeDepsResult = await doOptimizeDeps({
cwd,
sourceMap,
...options.optimizeDeps,
...optimizeDeps,
})

debugOptimizeDeps('optimized %O', optimizeDepsResult.optimized)
Expand Down Expand Up @@ -165,24 +155,16 @@ export default (options: Options = {}): RollupPlugin => {
}

const defaultOptions =
options.tsconfig === false
? {}
: await getOptions(dirname(id), options.tsconfig)

target = options.target || defaultOptions.target || 'es2017'
tsconfig === false ? {} : await getOptions(dirname(id), tsconfig)

const result = await transform(code, {
loader,
target,
jsx: options.jsx,
jsxFactory: options.jsxFactory || defaultOptions.jsxFactory,
jsxFragment: options.jsxFragment || defaultOptions.jsxFragment,
define: options.define,
target: defaultOptions.target || 'es2017',
jsxFactory: defaultOptions.jsxFactory,
jsxFragment: defaultOptions.jsxFragment,
sourcemap: sourceMap,
sourcefile: id,
pure: options.pure,
charset: options.charset,
legalComments: options.legalComments,
...esbuildOptions,
})

await warn(this, result.warnings)
Expand All @@ -196,7 +178,7 @@ export default (options: Options = {}): RollupPlugin => {
},

renderChunk: getRenderChunk({
...options,
...esbuildOptions,
sourceMap,
}),
}
Expand Down
28 changes: 8 additions & 20 deletions src/minify.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Plugin, InternalModuleFormat, RenderChunkHook } from 'rollup'
import { transform, CommonOptions, Format } from 'esbuild'
import { transform, TransformOptions, Format } from 'esbuild'
import { warn } from './warn'

const getEsbuildFormat = (
Expand All @@ -13,19 +13,14 @@ const getEsbuildFormat = (
}
}

export type Options = {
export type Options = Omit<TransformOptions, 'sourcemap'> & {
sourceMap?: boolean
minify?: boolean
minifyWhitespace?: boolean
minifyIdentifiers?: boolean
minifySyntax?: boolean
charset?: CommonOptions['charset']
keepNames?: boolean
legalComments?: CommonOptions['legalComments']
target?: CommonOptions['target']
}

export const getRenderChunk = (options: Options): RenderChunkHook =>
export const getRenderChunk = ({
sourceMap,
...options
}: Options): RenderChunkHook =>
async function (code, _, rollupOptions) {
if (
options.minify ||
Expand All @@ -37,15 +32,8 @@ export const getRenderChunk = (options: Options): RenderChunkHook =>
const result = await transform(code, {
format,
loader: 'js',
minify: options.minify,
minifyWhitespace: options.minifyWhitespace,
minifyIdentifiers: options.minifyIdentifiers,
minifySyntax: options.minifySyntax,
charset: options.charset,
keepNames: options.keepNames,
legalComments: options.legalComments,
sourcemap: options.sourceMap !== false,
target: options.target,
sourcemap: sourceMap !== false,
...options,
})
await warn(this, result.warnings)
if (result.code) {
Expand Down
2 changes: 1 addition & 1 deletion test/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ describe('esbuild plugin', () => {
})
expect(eval(output[0].code).name).toBe('Foo')
expect(output[0].code).toMatchInlineSnapshot(`
"\\"use strict\\";var r=Object.defineProperty;var t=(s,e)=>r(s,\\"name\\",{value:e,configurable:!0});class c{}t(c,\\"Foo\\"),module.exports=c;
"\\"use strict\\";var o=Object.defineProperty;var a=(e,r)=>o(e,\\"name\\",{value:r,configurable:!0});var s=Object.defineProperty,c=a((e,r)=>s(e,\\"name\\",{value:r,configurable:!0}),\\"e\\");class t{}a(t,\\"l\\"),c(t,\\"Foo\\"),module.exports=t;
"
`)
})
Expand Down

0 comments on commit b05c627

Please sign in to comment.