Skip to content

Commit ae80690

Browse files
mayorandrewAndrey Starostin
authored andcommitted
fix(package): specify side-effects in package.json
This prevents bundlers from tree-shaking Web Streams API compatibility extensions. Closes #382
1 parent 7221be2 commit ae80690

File tree

1 file changed

+48
-12
lines changed

1 file changed

+48
-12
lines changed

gulp/package-task.js

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,61 @@
1-
import { metadataFiles, packageJSONFields, npmPkgName, npmOrgName, targetDir, packageName, observableFromStreams } from './util.js';
1+
import {
2+
metadataFiles,
3+
npmOrgName,
4+
npmPkgName,
5+
observableFromStreams,
6+
packageJSONFields,
7+
packageName,
8+
targetDir,
9+
} from './util.js';
210

311
import gulp from 'gulp';
412
import { memoizeTask } from './memoize-task.js';
513
import { EMPTY as ObservableEmpty, forkJoin as ObservableForkJoin } from 'rxjs';
614
import gulpJsonTransform from 'gulp-json-transform';
15+
import { sync as globSync } from 'glob';
16+
import path from 'node:path';
717

8-
export const packageTask = ((cache) => memoizeTask(cache, function bundle(target, format) {
18+
export const packageTask = ((cache) =>
19+
memoizeTask(cache, function bundle(target, format) {
920
if (target === `src`) return ObservableEmpty();
1021
const out = targetDir(target, format);
11-
const jsonTransform = gulpJsonTransform(target === npmPkgName ? createMainPackageJson(target, format) :
12-
target === `ts` ? createTypeScriptPackageJson(target, format)
13-
: createScopedPackageJSON(target, format),
14-
2);
22+
const jsonTransform = gulpJsonTransform(
23+
target === npmPkgName
24+
? createMainPackageJson(target, format)
25+
: target === `ts`
26+
? createTypeScriptPackageJson(target, format)
27+
: createScopedPackageJSON(target, format),
28+
2
29+
);
1530
return ObservableForkJoin([
16-
observableFromStreams(gulp.src(metadataFiles), gulp.dest(out)), // copy metadata files
17-
observableFromStreams(gulp.src(`package.json`), jsonTransform, gulp.dest(out)) // write packageJSONs
31+
observableFromStreams(gulp.src(metadataFiles), gulp.dest(out)), // copy metadata files
32+
observableFromStreams(gulp.src(`package.json`), jsonTransform, gulp.dest(out)), // write packageJSONs
1833
]).toPromise();
19-
}))({});
34+
}))({});
2035

2136
export default packageTask;
2237

38+
function createSideEffectsList() {
39+
const patterns = ['add/**/*.ts', 'asynciterable/todomstream.ts'];
40+
41+
const tsFilePaths = globSync(patterns.map((p) => `./src/${p}`));
42+
43+
// Generate .mjs and .js paths for each .ts file
44+
const sideEffectPaths = [];
45+
for (const filePath of tsFilePaths) {
46+
// Get the relative path from srcDir to the file
47+
const relativePath = path.relative('./src', filePath);
48+
// Normalize path separators to forward slashes
49+
const normalizedPath = relativePath.replace(/\\/g, '/');
50+
// Remove the .ts extension and add .mjs and .js
51+
const basePath = normalizedPath.replace(/\.ts$/, '');
52+
sideEffectPaths.push(`./${basePath}.mjs`);
53+
sideEffectPaths.push(`./${basePath}.js`);
54+
}
55+
56+
return sideEffectPaths;
57+
}
58+
2359
const createMainPackageJson = (target, format) => (orig) => ({
2460
...createTypeScriptPackageJson(target, format)(orig),
2561
bin: orig.bin,
@@ -48,7 +84,7 @@ const createMainPackageJson = (target, format) => (orig) => ({
4884
},
4985
'./*': createDualExport('*'),
5086
},
51-
sideEffects: false,
87+
sideEffects: createSideEffectsList(),
5288
esm: { mode: `all`, sourceMap: true }
5389
});
5490

@@ -60,7 +96,7 @@ const createTypeScriptPackageJson = (target, format) => (orig) => ({
6096
types: `node.ts`,
6197
browser: `dom.ts`,
6298
type: 'module',
63-
sideEffects: false,
99+
sideEffects: createSideEffectsList(),
64100
esm: { mode: `auto`, sourceMap: true },
65101
dependencies: {
66102
'@types/node': '*',
@@ -88,7 +124,7 @@ const createScopedPackageJSON = (target, format) => (({ name, ...orig }) =>
88124
// set "module" if building scoped ESM target
89125
module: format === 'esm' || format === 'cls' ? `node.js` : undefined,
90126
// set "sideEffects" to false as a hint to Webpack that it's safe to tree-shake the ESM target
91-
sideEffects: format === 'esm' || format === 'cls' ? false : undefined,
127+
sideEffects: format === 'esm' || format === 'cls' ? createSideEffectsList() : undefined,
92128
// include "esm" settings for https://www.npmjs.com/package/esm if building scoped ESM target
93129
esm: format === `esm` ? { mode: `auto`, sourceMap: true } : undefined,
94130
// set "types" to "dom" if building scoped UMD target, otherwise "node"

0 commit comments

Comments
 (0)