Skip to content

Commit d2a2586

Browse files
mayorandrewAndrey Starostin
authored and
Andrey Starostin
committed
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 d2a2586

File tree

1 file changed

+26
-3
lines changed

1 file changed

+26
-3
lines changed

gulp/package-task.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import gulp from 'gulp';
44
import { memoizeTask } from './memoize-task.js';
55
import { EMPTY as ObservableEmpty, forkJoin as ObservableForkJoin } from 'rxjs';
66
import gulpJsonTransform from 'gulp-json-transform';
7+
import { sync as globSync } from 'glob';
8+
import path from 'node:path';
79

810
export const packageTask = ((cache) => memoizeTask(cache, function bundle(target, format) {
911
if (target === `src`) return ObservableEmpty();
@@ -20,6 +22,27 @@ export const packageTask = ((cache) => memoizeTask(cache, function bundle(target
2022

2123
export default packageTask;
2224

25+
function createSideEffectsList() {
26+
const patterns = ['add/**/*.ts', 'asynciterable/todomstream.ts'];
27+
28+
const tsFilePaths = globSync(patterns.map((p) => `./src/${p}`));
29+
30+
// Generate .mjs and .js paths for each .ts file
31+
const sideEffectPaths = [];
32+
for (const filePath of tsFilePaths) {
33+
// Get the relative path from srcDir to the file
34+
const relativePath = path.relative('./src', filePath);
35+
// Normalize path separators to forward slashes
36+
const normalizedPath = relativePath.replace(/\\/g, '/');
37+
// Remove the .ts extension and add .mjs and .js
38+
const basePath = normalizedPath.replace(/\.ts$/, '');
39+
sideEffectPaths.push(`./${basePath}.mjs`);
40+
sideEffectPaths.push(`./${basePath}.js`);
41+
}
42+
43+
return sideEffectPaths;
44+
}
45+
2346
const createMainPackageJson = (target, format) => (orig) => ({
2447
...createTypeScriptPackageJson(target, format)(orig),
2548
bin: orig.bin,
@@ -48,7 +71,7 @@ const createMainPackageJson = (target, format) => (orig) => ({
4871
},
4972
'./*': createDualExport('*'),
5073
},
51-
sideEffects: false,
74+
sideEffects: createSideEffectsList(),
5275
esm: { mode: `all`, sourceMap: true }
5376
});
5477

@@ -60,7 +83,7 @@ const createTypeScriptPackageJson = (target, format) => (orig) => ({
6083
types: `node.ts`,
6184
browser: `dom.ts`,
6285
type: 'module',
63-
sideEffects: false,
86+
sideEffects: createSideEffectsList(),
6487
esm: { mode: `auto`, sourceMap: true },
6588
dependencies: {
6689
'@types/node': '*',
@@ -88,7 +111,7 @@ const createScopedPackageJSON = (target, format) => (({ name, ...orig }) =>
88111
// set "module" if building scoped ESM target
89112
module: format === 'esm' || format === 'cls' ? `node.js` : undefined,
90113
// 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,
114+
sideEffects: format === 'esm' || format === 'cls' ? createSideEffectsList() : undefined,
92115
// include "esm" settings for https://www.npmjs.com/package/esm if building scoped ESM target
93116
esm: format === `esm` ? { mode: `auto`, sourceMap: true } : undefined,
94117
// set "types" to "dom" if building scoped UMD target, otherwise "node"

0 commit comments

Comments
 (0)