Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow tsConfigRaw to be passed so that decorators can be enabled. #90

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "esbuild-jest",
"version": "0.5.0",
"version": "0.6.0",
"description": "Jest plugin to use esbuild for transformation",
"main": "esbuild-jest.js",
"module": "esbuild-jest.es.js",
Expand Down
100 changes: 57 additions & 43 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,77 +1,91 @@
import { extname } from 'path'
import { extname } from "path";

import { Config } from '@jest/types'
import { TransformOptions as JestTransformOptions, Transformer } from '@jest/transform'
import { Format, Loader, TransformOptions, transformSync } from 'esbuild'
import { Config } from "@jest/types";
import {
TransformOptions as JestTransformOptions,
Transformer,
} from "@jest/transform";
import { Format, Loader, TransformOptions, transformSync } from "esbuild";

import { Options } from './options'
import { getExt, loaders } from './utils'
import { Options } from "./options";
import { getExt, loaders } from "./utils";

const createTransformer = (options?: Options) => ({
process(content: string,
filename: string,
config: Config.ProjectConfig,
process(
content: string,
filename: string,
config: Config.ProjectConfig,
opts?: JestTransformOptions
) {
const sources = { code: content }
const ext = getExt(filename), extName = extname(filename).slice(1)
const sources = { code: content };
const ext = getExt(filename),
extName = extname(filename).slice(1);

const enableSourcemaps = options?.sourcemap || false
const loader = (options?.loaders && options?.loaders[ext]
const enableSourcemaps = options?.sourcemap || false;
const loader = (options?.loaders && options?.loaders[ext]
? options.loaders[ext]
: loaders.includes(extName) ? extName: 'text'
) as Loader
const sourcemaps: Partial<TransformOptions> = enableSourcemaps
? { sourcemap: true, sourcesContent: false, sourcefile: filename }
: {}
: loaders.includes(extName)
? extName
: "text") as Loader;
const sourcemaps: Partial<TransformOptions> = enableSourcemaps
? { sourcemap: true, sourcesContent: false, sourcefile: filename }
: {};

/// this logic or code from
const tsconfigRaw = options?.tsconfigRaw
? { tsconfigRaw: options.tsconfigRaw }
: {};

/// this logic or code from
/// https://github.com/threepointone/esjest-transform/blob/main/src/index.js
/// this will support the jest.mock
/// https://github.com/aelbore/esbuild-jest/issues/12
/// TODO: transform the jest.mock to a function using babel traverse/parse then hoist it
if (sources.code.indexOf("ock(") >= 0 || opts?.instrument) {
const source = require('./transformer').babelTransform({
const source = require("./transformer").babelTransform({
sourceText: content,
sourcePath: filename,
config,
options: opts
})
sources.code = source
options: opts,
});
sources.code = source;
}

const result = transformSync(sources.code, {
loader,
format: options?.format as Format || 'cjs',
target: options?.target || 'es2018',
...(options?.jsxFactory ? { jsxFactory: options.jsxFactory }: {}),
...(options?.jsxFragment ? { jsxFragment: options.jsxFragment }: {}),
...sourcemaps
})

format: (options?.format as Format) || "cjs",
target: options?.target || "es2018",
...(options?.jsxFactory ? { jsxFactory: options.jsxFactory } : {}),
...(options?.jsxFragment ? { jsxFragment: options.jsxFragment } : {}),
...sourcemaps,
...tsconfigRaw,
});

let { map, code } = result;
if (enableSourcemaps) {
map = {
...JSON.parse(result.map),
sourcesContent: null,
}
};

// Append the inline sourcemap manually to ensure the "sourcesContent"
// is null. Otherwise, breakpoints won't pause within the actual source.
code = code + '\n//# sourceMappingURL=data:application/json;base64,' + Buffer.from(JSON.stringify(map)).toString('base64')
code =
code +
"\n//# sourceMappingURL=data:application/json;base64," +
Buffer.from(JSON.stringify(map)).toString("base64");
} else {
map = null
map = null;
}

return { code, map }
}
})

const transformer: Pick<Transformer, 'canInstrument' | 'createTransformer'> = {
return { code, map };
},
});

const transformer: Pick<Transformer, "canInstrument" | "createTransformer"> = {
canInstrument: true,
createTransformer
}
createTransformer,
};

export * from './options'
export * from "./options";

export default transformer
export default transformer;
19 changes: 10 additions & 9 deletions src/options.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { Loader } from 'esbuild'
import type { Loader, TransformOptions } from "esbuild";

export interface Options {
jsxFactory?: string
jsxFragment?: string
sourcemap?: boolean | 'inline' | 'external'
jsxFactory?: string;
jsxFragment?: string;
sourcemap?: boolean | "inline" | "external";
loaders?: {
[ext: string]: Loader
},
target?: string
format?: string
}
[ext: string]: Loader;
};
target?: string;
format?: string;
tsconfigRaw?: TransformOptions["tsconfigRaw"];
}