Skip to content

Commit 2bb3dd4

Browse files
committed
feat: rollup plugin copyMeta
1 parent 240ad8e commit 2bb3dd4

File tree

6 files changed

+114
-8
lines changed

6 files changed

+114
-8
lines changed

src/rollup/bundle.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { promises as fsp } from "fs";
2-
import { compilePlugins } from "./common-plugins";
2+
import {
3+
commonPlugins,
4+
CommonPluginsOptions,
5+
compilePlugins,
6+
} from "./common-plugins";
37
import { terser } from "rollup-plugin-terser";
48
import { pascalCase } from "pascal-case";
59
import commonjs from "@rollup/plugin-commonjs";
@@ -71,7 +75,8 @@ export interface RollupBundleOutputConfig {
7175
}
7276

7377
export interface RollupBundleOptions
74-
extends Partial<ResolvableDict<RollupBundleOutputConfig>> {
78+
extends Partial<ResolvableDict<RollupBundleOutputConfig>>,
79+
CommonPluginsOptions {
7580
input?: Resolvable<string | undefined>;
7681
output?: Resolvable<GenOutputOptions, [RollupBundleOutputConfig]>;
7782
inputBaseDir?: string;
@@ -92,6 +97,7 @@ export async function rollupBundle({
9297
outputRootDir = "bundle",
9398
min = false,
9499
globalNamespace = inferGlobalNamespace,
100+
...commonPluginsOpts
95101
}: RollupBundleOptions = {}): Promise<RollupOptions> {
96102
const { input: inputFile, ...conf } = await resolveDict({
97103
input,
@@ -115,6 +121,7 @@ export async function rollupBundle({
115121
...compilePlugins(),
116122
nodeResolve(),
117123
commonjs(),
124+
...commonPlugins({ outputBaseDir, ...commonPluginsOpts }),
118125
],
119126
};
120127
}

src/rollup/common-plugins.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import typescript, { RollupTypescriptOptions } from "@rollup/plugin-typescript";
22
import babel, { RollupBabelInputPluginOptions } from "@rollup/plugin-babel";
33
import json from "@rollup/plugin-json";
44
import type { Plugin } from "rollup";
5+
import { copyMeta, CopyMetaPluginOptions } from "./copy-meta";
6+
import { isTruthy } from "../util/func";
57

68
export interface CompilePluginsOptions {
79
typescript?: Partial<RollupTypescriptOptions>;
@@ -30,3 +32,24 @@ export function compilePlugins(options: CompilePluginsOptions = {}): Plugin[] {
3032
}),
3133
];
3234
}
35+
36+
export interface CommonPluginsOptions {
37+
outputBaseDir?: string;
38+
/**
39+
* whether to copy meta files to outputBaseDir.
40+
*
41+
* e.g. `README*` `CHANGELOG*` `LICENSE*`
42+
*/
43+
copyMeta?: boolean | CopyMetaPluginOptions;
44+
}
45+
46+
export function commonPlugins({
47+
outputBaseDir = "dist",
48+
copyMeta: copyMetaOpts,
49+
}: CommonPluginsOptions = {}): Plugin[] {
50+
return [
51+
copyMetaOpts
52+
? copyMeta(copyMetaOpts === true ? { to: outputBaseDir } : copyMetaOpts)
53+
: null,
54+
].filter(isTruthy);
55+
}

src/rollup/copy-meta.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { PluginImpl } from "rollup";
2+
import glob from "fast-glob";
3+
import * as fs from "fs";
4+
import { promises as fsp } from "fs";
5+
import * as path from "path";
6+
7+
export const COPY_META_DEFAULT_SOURCE = ["README*", "LICENSE*", "CHANGELOG*"];
8+
9+
export interface CopyMetaPluginOptions {
10+
to: string;
11+
source?: string | string[];
12+
caseSensitiveMatch?: boolean;
13+
overwriteExisting?: boolean;
14+
}
15+
16+
export const copyMeta: PluginImpl<CopyMetaPluginOptions> = (
17+
{
18+
//
19+
to,
20+
source = COPY_META_DEFAULT_SOURCE,
21+
caseSensitiveMatch = false,
22+
overwriteExisting = false,
23+
} = { to: "" },
24+
) => ({
25+
name: "@tlib/rollup-plugin-copy-meta",
26+
buildEnd: async () => {
27+
if (!to) throw new Error("copyMeta options.dir cannot be falsy");
28+
29+
await fsp.mkdir(to, { recursive: true });
30+
31+
const files = await glob(source, {
32+
onlyFiles: true,
33+
caseSensitiveMatch,
34+
unique: true,
35+
});
36+
37+
const mode = overwriteExisting ? undefined : fs.constants.COPYFILE_EXCL;
38+
39+
await Promise.all(
40+
files.map((file) => {
41+
const filename = path.basename(file);
42+
const dest = path.join(to, filename);
43+
return fsp.copyFile(file, dest, mode);
44+
}),
45+
);
46+
},
47+
});

src/rollup/dts.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import type { InputOption, RollupOptions } from "rollup";
22
import { chunkFileNames } from "../util/common";
33
import { getEntryFiles } from "./entry";
44
import { Resolvable, resolve } from "../util/resolvable";
5+
import { commonPlugins, CommonPluginsOptions } from "./common-plugins";
56

6-
export interface RollupDtsOptions {
7+
export interface RollupDtsOptions extends CommonPluginsOptions {
78
inputBaseDir?: string;
89
outputBaseDir?: string;
910
input?: Resolvable<InputOption | undefined>;
@@ -13,6 +14,7 @@ export async function rollupDts({
1314
inputBaseDir = "src",
1415
outputBaseDir = "dist",
1516
input,
17+
...commonPluginsOpts
1618
}: RollupDtsOptions = {}): Promise<RollupOptions> {
1719
const dts = (await import("rollup-plugin-dts")).default;
1820

@@ -32,6 +34,10 @@ export async function rollupDts({
3234
.replace(/\.js$/, ".d.ts");
3335
},
3436
},
35-
plugins: [dts()],
37+
plugins: [
38+
//
39+
dts(),
40+
...commonPlugins({ outputBaseDir, ...commonPluginsOpts }),
41+
],
3642
};
3743
}

src/rollup/node.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import externals from "rollup-plugin-node-externals";
22
import generatePackageJson from "rollup-plugin-generate-package-json";
3-
import { compilePlugins } from "./common-plugins";
3+
import {
4+
commonPlugins,
5+
CommonPluginsOptions,
6+
compilePlugins,
7+
} from "./common-plugins";
48
import { getEntryPointsFromRollup, getPkgJsonBaseContents } from "./gen-pkg";
59
import { chunkFileNames } from "../util/common";
610
import type {
@@ -20,7 +24,7 @@ const commonOutputOptions: OutputOptions = {
2024
chunkFileNames,
2125
};
2226

23-
export interface RollupNodeOptions {
27+
export interface RollupNodeOptions extends CommonPluginsOptions {
2428
inputBaseDir?: string;
2529
inputPatterns?: MatchFilesPatterns;
2630
input?: Resolvable<InputOption | undefined>;
@@ -58,6 +62,7 @@ export async function rollupNode({
5862
outputBaseDir = "dist",
5963
output,
6064
outputRootDir,
65+
...commonPluginsOpts
6166
}: RollupNodeOptions = {}): Promise<RollupOptions> {
6267
const inputFiles =
6368
(await resolve(input)) ??
@@ -102,6 +107,7 @@ export async function rollupNode({
102107
outputFolder: outputRootDir,
103108
}),
104109
pkgModuleAfterBuild({ baseDir: joinPath(outputRootDir, "es") }),
110+
...commonPlugins({ outputBaseDir, ...commonPluginsOpts }),
105111
],
106112
};
107113
}

src/rollup/options.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import { rollupBundle, RollupBundleOptions } from "./bundle";
33
import { rollupNode, RollupNodeOptions } from "./node";
44
import { rollupDts, RollupDtsOptions } from "./dts";
55
import { getEntryFiles, MatchFilesPatterns } from "./entry";
6+
import { isTruthy } from "../util/func";
7+
import { CommonPluginsOptions } from "./common-plugins";
68

7-
export interface GenRollupOptions {
9+
export interface GenRollupOptions extends CommonPluginsOptions {
810
inputBaseDir?: string;
911
inputPatterns?: MatchFilesPatterns;
1012
outputBaseDir?: string;
@@ -20,9 +22,22 @@ export async function rollupOptions({
2022
bundle,
2123
node,
2224
dts,
25+
copyMeta,
2326
}: GenRollupOptions = {}): Promise<RollupOptions[]> {
27+
// take copyMeta options so that it can only be used once
28+
const takeCopyMeta = () => {
29+
const v = copyMeta;
30+
copyMeta = undefined;
31+
return v;
32+
};
33+
2434
const bundleOptions: RollupBundleOptions | null = bundle
25-
? { outputBaseDir, inputBaseDir, ...(bundle === true ? null : bundle) }
35+
? {
36+
outputBaseDir,
37+
inputBaseDir,
38+
copyMeta: takeCopyMeta(),
39+
...(bundle === true ? null : bundle),
40+
}
2641
: null;
2742

2843
let cachedInput: Promise<InputOption> | null = null;
@@ -42,6 +57,7 @@ export async function rollupOptions({
4257
inputBaseDir,
4358
inputPatterns,
4459
outputBaseDir,
60+
copyMeta: takeCopyMeta(),
4561
...(node === true ? null : node),
4662
}
4763
: null;
@@ -51,6 +67,7 @@ export async function rollupOptions({
5167
input,
5268
inputBaseDir,
5369
outputBaseDir,
70+
copyMeta: takeCopyMeta(),
5471
...(dts === true ? null : dts),
5572
}
5673
: null;

0 commit comments

Comments
 (0)