Skip to content

Commit

Permalink
Remove src to lib rewrites on package.json files (#9612)
Browse files Browse the repository at this point in the history
* Remove src to lib rewrites on package.json files

This commit modifies the strategy to local src/lib rewrites, so that the
package.json files are never modified.

Intead, the package.json files always point at `bin/...`; which in turn
requires `lib/bin.js`.

During development, `lib/bin.js` can just require `src/bin.js` and rely on
require.extensions register. But on distribution `lib/**` can be pre-built.

By maintaining a stable `bin/...` entry-point, the following benefits are
achieved:

* The git workspace does not become dirty after a build
* It's not possible to get into a state where `node_modules/.bin/parcel` points
  at a non existant `lib/` file, which can only be fixed by removing
  node_modules and yarn installing again

* Fix a few issues around rimraf and the 'files' list

* Try to prevent publishing if we're in dev state

* Fix our dev-lib commands

* Don't duplicate scripts, instead symlink

---------

Co-authored-by: Pedro Yamada <pyamada@atlassian.com>
  • Loading branch information
yamadapc and pyamada-atlassian committed Apr 30, 2024
1 parent 03983cb commit 0eaf926
Show file tree
Hide file tree
Showing 22 changed files with 90 additions and 48 deletions.
39 changes: 1 addition & 38 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,6 @@ const paths = {
...IGNORED_PACKAGES,
],
packageOther: ['packages/*/*/src/**/dev-prelude.js'],
packageJson: [
'packages/core/parcel/package.json',
'packages/utils/create-react-app/package.json',
'packages/dev/query/package.json',
'packages/dev/bundle-stats-cli/package.json',
],
packages: 'packages/',
};

Expand Down Expand Up @@ -65,16 +59,7 @@ exports.clean = function clean(cb) {
);
};

exports.default = exports.build = gulp.series(
gulp.parallel(buildBabel, copyOthers),
// Babel reads from package.json so update these after babel has run
paths.packageJson.map(
packageJsonPath =>
function updatePackageJson() {
return _updatePackageJson(packageJsonPath);
},
),
);
exports.default = exports.build = gulp.parallel(buildBabel, copyOthers);

function buildBabel() {
return gulp
Expand All @@ -91,28 +76,6 @@ function copyOthers() {
.pipe(gulp.dest(paths.packages));
}

function _updatePackageJson(file) {
return gulp
.src(file)
.pipe(
new TapStream(vinyl => {
let json = JSON.parse(vinyl.contents);
// Replace all references to `src` in package.json bin entries
// `lib` equivalents.
if (typeof json.bin === 'object' && json.bin != null) {
for (let [binName, binPath] of Object.entries(json.bin)) {
json.bin[binName] = binPath.replace('src', 'lib');
}
} else if (typeof json.bin === 'string') {
json.bin = json.bin.replace('src', 'lib');
}

vinyl.contents = Buffer.from(JSON.stringify(json, null, 2));
}),
)
.pipe(gulp.dest(path.dirname(file)));
}

function renameStream(fn) {
return new TapStream(vinyl => {
let relative = path.relative(vinyl.base, vinyl.path);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
],
"scripts": {
"build": "yarn build-bundles && cross-env NODE_ENV=production PARCEL_BUILD_ENV=production gulp",
"build-bundles": "rimraf --glob packages/*/*/lib && cross-env NODE_ENV=production PARCEL_BUILD_ENV=production PARCEL_SELF_BUILD=true parcel build packages/core/{fs,codeframe,package-manager,utils} packages/reporters/{cli,dev-server} packages/utils/{parcel-lsp,parcel-lsp-protocol}",
"build-bundles": "rimraf --glob packages/*/*/lib && lerna run dev:prepare && cross-env NODE_ENV=production PARCEL_BUILD_ENV=production PARCEL_SELF_BUILD=true parcel build packages/core/{fs,codeframe,package-manager,utils} packages/reporters/{cli,dev-server} packages/utils/{parcel-lsp,parcel-lsp-protocol}",
"build-ts": "lerna run build-ts && lerna run check-ts",
"build-native": "node scripts/build-native.js",
"build-native-release": "node scripts/build-native.js --release",
Expand Down
1 change: 1 addition & 0 deletions packages/core/parcel/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/bin/dev-bin.js
8 changes: 8 additions & 0 deletions packages/core/parcel/bin/dev-bin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* DEV BIN - DO NOT PUBLISH
*
* This file is copied into /lib/ by `yarn run dev:prepare`
*
* When babel build runs it is overwritten by another asset.
*/
require('../src/bin');
2 changes: 2 additions & 0 deletions packages/core/parcel/bin/parcel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env node
require('../lib/bin');
1 change: 1 addition & 0 deletions packages/core/parcel/ensure-no-dev-lib.sh
9 changes: 7 additions & 2 deletions packages/core/parcel/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,13 @@
"type": "git",
"url": "https://github.com/parcel-bundler/parcel.git"
},
"bin": "src/bin.js",
"bin": "bin/parcel.js",
"main": "lib/bin.js",
"source": "src/bin.js",
"scripts": {
"prepack": "./ensure-no-dev-lib.sh",
"dev:prepare": "rimraf ./lib/ && mkdir -p lib && cp ./bin/dev-bin.js ./lib/bin.js"
},
"engines": {
"node": ">= 16.0.0"
},
Expand All @@ -39,6 +43,7 @@
},
"devDependencies": {
"@babel/core": "^7.22.11",
"@parcel/babel-register": "2.12.0"
"@parcel/babel-register": "2.12.0",
"rimraf": "^5.0.5"
}
}
1 change: 1 addition & 0 deletions packages/dev/bundle-stats-cli/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/bin/dev-bin.js
2 changes: 2 additions & 0 deletions packages/dev/bundle-stats-cli/bin/bundle-stats.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env node
require('../lib/bin');
8 changes: 8 additions & 0 deletions packages/dev/bundle-stats-cli/bin/dev-bin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* DEV BIN - DO NOT PUBLISH
*
* This file is copied into /lib/ by `yarn run dev:prepare`
*
* When babel build runs it is overwritten by another asset.
*/
require('../src/bin');
1 change: 1 addition & 0 deletions packages/dev/bundle-stats-cli/ensure-no-dev-lib.sh
9 changes: 7 additions & 2 deletions packages/dev/bundle-stats-cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@
"main": "lib/cli.js",
"source": "src/cli.js",
"bin": {
"parcel-bundle-stats": "src/bin.js"
"parcel-bundle-stats": "bin/bundle-stats.js"
},
"scripts": {
"prepack": "./ensure-no-dev-lib.sh",
"dev:prepare": "rimraf ./lib/ && mkdir -p lib && cp ./bin/dev-bin.js ./lib/bin.js"
},
"engines": {
"node": ">= 16.0.0",
Expand All @@ -31,6 +35,7 @@
},
"devDependencies": {
"@parcel/babel-register": "2.12.0",
"@parcel/types": "2.12.0"
"@parcel/types": "2.12.0",
"rimraf": "^5.0.5"
}
}
1 change: 1 addition & 0 deletions packages/dev/query/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/bin/dev-bin.js
8 changes: 8 additions & 0 deletions packages/dev/query/bin/dev-bin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* DEV BIN - DO NOT PUBLISH
*
* This file is copied into /lib/ by `yarn run dev:prepare`
*
* When babel build runs it is overwritten by another asset.
*/
require('../src/bin');
2 changes: 2 additions & 0 deletions packages/dev/query/bin/parcel-query.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env node
require('../lib/bin');
1 change: 1 addition & 0 deletions packages/dev/query/ensure-no-dev-lib.sh
9 changes: 7 additions & 2 deletions packages/dev/query/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@
"type": "opencollective",
"url": "https://opencollective.com/parcel"
},
"scripts": {
"prepack": "./ensure-no-dev-lib.sh",
"dev:prepare": "rimraf ./lib/ && mkdir -p lib && cp ./bin/dev-bin.js ./lib/bin.js"
},
"repository": {
"type": "git",
"url": "https://github.com/parcel-bundler/parcel.git"
},
"bin": {
"parcel-query": "src/bin.js"
"parcel-query": "bin/parcel-query.js"
},
"main": "src/index.js",
"dependencies": {
Expand All @@ -27,6 +31,7 @@
},
"devDependencies": {
"@babel/core": "^7.22.11",
"@parcel/babel-register": "2.12.0"
"@parcel/babel-register": "2.12.0",
"rimraf": "^5.0.5"
}
}
1 change: 1 addition & 0 deletions packages/utils/create-react-app/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/bin/dev-bin.js
8 changes: 8 additions & 0 deletions packages/utils/create-react-app/bin/dev-bin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* DEV BIN - DO NOT PUBLISH
*
* This file is copied into /lib/ by `yarn run dev:prepare`
*
* When babel build runs it is overwritten by another asset.
*/
require('../src/bin');
1 change: 1 addition & 0 deletions packages/utils/create-react-app/ensure-no-dev-lib.sh
12 changes: 9 additions & 3 deletions packages/utils/create-react-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "@parcel/create-react-app",
"version": "2.12.0",
"bin": {
"parcel-create-react-app": "src/bin.js"
"parcel-create-react-app": "lib/bin.js"
},
"main": "src/bin.js",
"repository": {
Expand All @@ -13,8 +13,13 @@
"source": "src/bin.js",
"files": [
"templates",
"lib"
"lib",
"bin"
],
"scripts": {
"prepack": "./ensure-no-dev-lib.sh",
"dev:prepare": "rimraf ./lib/ && mkdir -p lib && cp ./bin/dev-bin.js ./lib/bin.js"
},
"license": "MIT",
"publishConfig": {
"access": "public"
Expand All @@ -32,6 +37,7 @@
},
"devDependencies": {
"@babel/core": "^7.22.11",
"@parcel/babel-register": "2.12.0"
"@parcel/babel-register": "2.12.0",
"rimraf": "^5.0.5"
}
}
12 changes: 12 additions & 0 deletions scripts/ensure-no-dev-lib.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash

set -e

if grep -q "DEV BIN - DO NOT PUBLISH" lib/bin.js
then
echo "found dev files in lib"
exit 1
else
echo "no dev files in lib"
exit 0
fi

0 comments on commit 0eaf926

Please sign in to comment.