Skip to content

Commit 4971bb1

Browse files
committed
cleanup and use tsconfig
1 parent bce344f commit 4971bb1

File tree

1 file changed

+102
-39
lines changed

1 file changed

+102
-39
lines changed

src/index.ts

Lines changed: 102 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,128 @@
11
#!/usr/bin/env node
2-
3-
import { build, BuildOptions } from "esbuild";
4-
import glob from "globby";
2+
import ts, { BuildOptions } from "typescript";
3+
import { build } from "esbuild";
54
import cpy from "cpy";
65
import path from "path";
76
//@ts-ignore
87
import rimraf from "rimraf";
98

10-
const cwd = process.cwd();
11-
12-
const config: {
13-
src: string;
14-
dest: string;
15-
esbuild: BuildOptions;
16-
assets: {
17-
files: string[];
18-
};
19-
} = {
20-
src: "src",
21-
dest: "dist",
9+
const config: Config = {
10+
outDir: "dist",
2211
esbuild: {
23-
entryPoints: ["**/*.{js,ts,tsx,jsx}"],
12+
entryPoints: [] as string[],
2413
minify: false,
25-
sourcemap: "inline",
2614
target: "es2015",
27-
bundle: false,
28-
format: "cjs",
29-
platform: "node",
30-
tsconfig: "./tsconfig.json",
3115
},
3216
assets: {
33-
files: ["**", `!**/*.{ts,js,tsx,jsx}`],
17+
baseDir: "src",
18+
filePatterns: ["**", `!**/*.{ts,js,tsx,jsx}`],
3419
},
3520
};
3621

37-
async function buildSourceFiles(srcDir: string, destDir: string) {
38-
const esbuildOptions = {
39-
...config.esbuild,
40-
entryPoints: await glob(
41-
config.esbuild.entryPoints?.map((p) => path.resolve(srcDir, p)) || []
42-
),
43-
outdir: destDir,
22+
type Config = {
23+
outDir?: string;
24+
esbuild?: {
25+
entryPoints?: string[];
26+
minify?: boolean;
27+
target?: string;
28+
};
29+
assets?: {
30+
baseDir?: string;
31+
filePatterns?: string[];
4432
};
45-
return await build(esbuildOptions);
33+
};
34+
35+
function getTSConfig() {
36+
const tsConfigFile = ts.findConfigFile(
37+
process.cwd(),
38+
ts.sys.fileExists,
39+
"tsconfig.json"
40+
);
41+
const configFile = ts.readConfigFile(tsConfigFile!, ts.sys.readFile);
42+
const tsConfig = ts.parseJsonConfigFileContent(
43+
configFile.config,
44+
ts.sys,
45+
process.cwd()
46+
);
47+
return { tsConfig, tsConfigFile };
48+
}
49+
50+
type TSConfig = ReturnType<typeof getTSConfig>["tsConfig"];
51+
52+
function esBuildSourceMapOptions(tsConfig: TSConfig) {
53+
let sourcemap = tsConfig.options.sourceMap;
54+
if (!sourcemap) {
55+
return false;
56+
}
57+
if (tsConfig.options.inlineSourceMap) {
58+
return "inline";
59+
}
60+
return "external";
61+
}
62+
63+
async function buildSourceFiles(esbuildOptions: Partial<BuildOptions>) {
64+
return await build({
65+
...esbuildOptions,
66+
bundle: false,
67+
format: "cjs",
68+
platform: "node",
69+
});
4670
}
4771

48-
async function copyNonSourceFiles(srcDir: string, destDir: string) {
49-
const relativeDestDir = path.relative(srcDir, destDir);
50-
return await cpy(["**", `!**/*.{ts,js,tsx,jsx}`], relativeDestDir, {
51-
cwd: srcDir,
72+
type AssetsOptions = { baseDir: string; outDir: string; patterns: string[] };
73+
74+
async function copyNonSourceFiles({
75+
baseDir,
76+
outDir,
77+
patterns,
78+
}: AssetsOptions) {
79+
const relativeOutDir = path.relative(baseDir, outDir);
80+
return await cpy(patterns, relativeOutDir, {
81+
cwd: baseDir,
5282
parents: true,
5383
});
5484
}
5585

86+
function getBuildMetadata(userConfig: Config) {
87+
const { tsConfig, tsConfigFile } = getTSConfig();
88+
89+
const outDir = tsConfig.options.outDir || config.outDir || "dist";
90+
91+
const esbuildEntryPoints = userConfig.esbuild?.entryPoints || [];
92+
const srcFiles = [...tsConfig.fileNames, ...esbuildEntryPoints];
93+
const sourcemap = esBuildSourceMapOptions(tsConfig);
94+
const target =
95+
config.esbuild?.target || tsConfig?.raw?.compilerOptions?.target || "es6";
96+
const minify = config.esbuild?.minify || false;
97+
98+
const esbuildOptions: BuildOptions = {
99+
outdir: outDir,
100+
entryPoints: srcFiles,
101+
sourcemap,
102+
target,
103+
minify,
104+
tsconfig: tsConfigFile,
105+
};
106+
107+
const assetsOptions = {
108+
baseDir: userConfig.assets?.baseDir || "src",
109+
outDir: outDir,
110+
patterns: userConfig.assets?.filePatterns || [
111+
"**",
112+
`!**/*.{ts,js,tsx,jsx}`,
113+
],
114+
};
115+
116+
return { outDir, esbuildOptions, assetsOptions };
117+
}
118+
56119
async function main() {
57-
const src = config.src;
58-
const dest = config.dest;
59-
rimraf.sync(dest);
120+
const { outDir, esbuildOptions, assetsOptions } = getBuildMetadata(config);
121+
rimraf.sync(outDir);
122+
60123
await Promise.all([
61-
buildSourceFiles(src, dest),
62-
copyNonSourceFiles(src, dest),
124+
buildSourceFiles(esbuildOptions),
125+
copyNonSourceFiles(assetsOptions),
63126
]);
64127
}
65128

0 commit comments

Comments
 (0)