Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9f1f323b09 | |||
| 0ba696e976 | |||
| 0f0869b292 | |||
| c5dabbf9b4 | |||
| e51b6b21a6 | |||
| 2b261728b4 | |||
| 017abb94cc | |||
| 32033b6d15 | |||
| bc1d579baa | |||
| 6ffd47f1f1 | |||
| c4e16fb6e0 | |||
| ea6f1f0808 | |||
| c1055149ab | |||
| 79fffc358a | |||
| c8cf13a9dd | |||
| 928b8134a7 | |||
| 0a2e8dba00 | |||
| 01c977bb3c |
@@ -0,0 +1 @@
|
||||
custom: https://www.paypal.me/calebsboyd
|
||||
@@ -49,7 +49,7 @@ Additional files or resources can be added to the binary by passing `-r "glob/pa
|
||||
|
||||
## Compiling Node
|
||||
|
||||
By default `nexe` will attempt to download a pre-built executable. These are listed on the [Nexe V3 releases page](https://github.com/nexe/nexe/releases/tag/v3.0.0). The exact version you want may be unavailable or you may want to customize what is built. See `nexe --help` for a list of options available when passing the [`--build`](#build-boolean) option. You will also need to ensure your environment is setup to [build node](https://github.com/nodejs/node/blob/master/BUILDING.md). Note: the `python` binary in your path should be an acceptable version of python 2. eg. Systems that have python2 will need to create a [symlink](https://github.com/nexe/nexe/issues/354#issuecomment-319874486).
|
||||
By default `nexe` will attempt to download a pre-built executable. These are listed on the [Nexe V3 releases page](https://github.com/nexe/nexe/releases/tag/v3.3.3). The exact version you want may be unavailable or you may want to customize what is built. See `nexe --help` for a list of options available when passing the [`--build`](#build-boolean) option. You will also need to ensure your environment is setup to [build node](https://github.com/nodejs/node/blob/master/BUILDING.md). Note: the `python` binary in your path should be an acceptable version of python 2. eg. Systems that have python2 will need to create a [symlink](https://github.com/nexe/nexe/issues/354#issuecomment-319874486).
|
||||
|
||||
## Node.js API
|
||||
|
||||
@@ -116,8 +116,8 @@ compile({
|
||||
- default: true
|
||||
- #### `build: boolean`
|
||||
- Build node from source, passing this flag tells nexe to download and build from source. Subsequently using this flag will cause nexe to use the previously built binary. To rebuild, first add [`--clean`](#clean-boolean)
|
||||
- #### `asset: string`
|
||||
- Provide a pre-built nexe binary asset, this can either be an http or https URL or a file path.
|
||||
- #### `remote: string`
|
||||
- Provide a custom remote location for fetching pre-built nexe binaries from. This can either be an HTTP or HTTPS URL or a file path.
|
||||
- default: `null`
|
||||
- #### `python: string`
|
||||
- On Linux this is the path pointing to your python2 executable
|
||||
@@ -202,7 +202,7 @@ For examples, see the built in patches: [src/patches](src/patches).
|
||||
- Quickly perform a replace in a file within the downloaded Node.js source. The rest arguments are passed along to `String.prototype.replace`
|
||||
- `readFileAsync(filename: string): Promise<NexeFile>`
|
||||
- Access (or create) a file within the downloaded Node.js source.
|
||||
- `addResource(filename: string, contents: Buffer): void`
|
||||
- `addResource(filename: string, contents: Buffer): Promise<void>`
|
||||
- Add a resource to the nexe bundle
|
||||
- `files: NexeFile[]`
|
||||
- The cache of the currently read, modified, or created files within the downloaded Node.js source.
|
||||
@@ -216,9 +216,7 @@ Any modifications made to `NexeFile#contents` will be maintained in the cache _w
|
||||
|
||||
## Native Modules
|
||||
|
||||
TODO
|
||||
|
||||
- [ ] Implement support for `node-pre-gyp#find`.
|
||||
In order to use native modules, the native binaries must be shipped alongside the binary generated by nexe.
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -226,20 +224,10 @@ Building
|
||||
```
|
||||
$ git clone git@github.com:nexe/nexe.git
|
||||
$ cd nexe
|
||||
$ yarn
|
||||
$ npm i && npm run build
|
||||
```
|
||||
|
||||
Testing
|
||||
```
|
||||
$ npm test
|
||||
```
|
||||
|
||||
## Maintainers
|
||||
|
||||
[](https://jaredallard.me/) | [](https://github.com/calebboyd) | [](https://github.com/dgreif) |
|
||||
---|---|---|
|
||||
[Jared Allard](https://github.com/jaredallard) | [Caleb Boyd](http://github.com/calebboyd) | [Dustin Greif](https://github.com/dgreif) |
|
||||
|
||||
### Former
|
||||
|
||||
- [Craig Condon](http://crcn.codes/)
|
||||
|
||||
+3
-2
@@ -25,7 +25,7 @@ jobs:
|
||||
linux:
|
||||
imageName: 'ubuntu-16.04'
|
||||
mac:
|
||||
imageName: 'macos-10.13'
|
||||
imageName: 'macos-10.15'
|
||||
windows_2017:
|
||||
imageName: 'vs2017-win2016'
|
||||
windows_2015:
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
- task: NodeTool@0
|
||||
displayName: Install Node
|
||||
inputs:
|
||||
versionSpec: '10.x'
|
||||
versionSpec: '12.x'
|
||||
- script: sudo apt-get update && sudo apt-get install -y libc6-dev-i386 gcc-multilib g++-multilib
|
||||
condition: contains(variables['Agent.JobName'], 'linux')
|
||||
displayName: Install Linux build dependencies
|
||||
@@ -55,6 +55,7 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: $(PersonalGithubToken)
|
||||
NEXE_VERBOSE: $(NEXE_VERBOSE)
|
||||
msbuild_args: /3G
|
||||
condition: not(contains(variables['Agent.JobName'], 'windows'))
|
||||
- powershell: |
|
||||
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
|
||||
|
||||
Generated
+79
-172
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "nexe",
|
||||
"version": "4.0.0-beta.6",
|
||||
"version": "4.0.0-beta.15",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -30,36 +30,31 @@
|
||||
"js-tokens": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@calebboyd/async": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@calebboyd/async/-/async-1.4.0.tgz",
|
||||
"integrity": "sha512-Q5tSWP28OF1nGd9KD6qspJselIfrHqk5+1gLGNNuQiUy80LE4g4ZAb+r+P8MYe1/FS5ICbm+OXiIalC7xhde3A=="
|
||||
},
|
||||
"@calebboyd/semaphore": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@calebboyd/semaphore/-/semaphore-1.3.1.tgz",
|
||||
"integrity": "sha512-17z9me12RgAEcMhIgR7f+BiXKbzwF9p1VraI69OxrUUSWGuSMOyOTEHQNVtMKuVrkEDVD0/Av5uiGZPBMYZljw=="
|
||||
},
|
||||
"@nodelib/fs.scandir": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz",
|
||||
"integrity": "sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg==",
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
|
||||
"integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
|
||||
"requires": {
|
||||
"@nodelib/fs.stat": "2.0.1",
|
||||
"@nodelib/fs.stat": "2.0.3",
|
||||
"run-parallel": "^1.1.9"
|
||||
}
|
||||
},
|
||||
"@nodelib/fs.stat": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz",
|
||||
"integrity": "sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw=="
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
|
||||
"integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
|
||||
},
|
||||
"@nodelib/fs.walk": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz",
|
||||
"integrity": "sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ==",
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
|
||||
"integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
|
||||
"requires": {
|
||||
"@nodelib/fs.scandir": "2.1.1",
|
||||
"@nodelib/fs.scandir": "2.1.3",
|
||||
"fastq": "^1.6.0"
|
||||
}
|
||||
},
|
||||
@@ -116,16 +111,8 @@
|
||||
"@types/events": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
|
||||
"integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA=="
|
||||
},
|
||||
"@types/execa": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/execa/-/execa-2.0.0.tgz",
|
||||
"integrity": "sha512-aBnkJ0r3khaZkHzu9pDZeWXrDg1N/ZtDGRQkK+KIqNVvvTvW+URXMUHQQCQMYdb2GPrcwu9Fq6l9iiT+pirIbg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"execa": "*"
|
||||
}
|
||||
"integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/glob": {
|
||||
"version": "7.1.1",
|
||||
@@ -161,7 +148,8 @@
|
||||
"@types/minimatch": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
|
||||
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
|
||||
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/minimist": {
|
||||
"version": "1.2.0",
|
||||
@@ -196,7 +184,8 @@
|
||||
"@types/node": {
|
||||
"version": "10.5.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.7.tgz",
|
||||
"integrity": "sha512-VkKcfuitP+Nc/TaTFH0B8qNmn+6NbI6crLkQonbedViVz7O2w8QV/GERPlkJ4bg42VGHiEWa31CoTOPs1q6z1w=="
|
||||
"integrity": "sha512-VkKcfuitP+Nc/TaTFH0B8qNmn+6NbI6crLkQonbedViVz7O2w8QV/GERPlkJ4bg42VGHiEWa31CoTOPs1q6z1w==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/ora": {
|
||||
"version": "3.2.0",
|
||||
@@ -336,9 +325,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"bl": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
|
||||
"integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
|
||||
"integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
|
||||
"requires": {
|
||||
"readable-stream": "^2.3.5",
|
||||
"safe-buffer": "^5.1.1"
|
||||
@@ -615,9 +604,9 @@
|
||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||
},
|
||||
"cross-spawn": {
|
||||
"version": "7.0.2",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
|
||||
"integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"path-key": "^3.1.0",
|
||||
@@ -881,9 +870,9 @@
|
||||
}
|
||||
},
|
||||
"enhanced-resolve": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
|
||||
"integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz",
|
||||
"integrity": "sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ==",
|
||||
"requires": {
|
||||
"graceful-fs": "^4.1.2",
|
||||
"memory-fs": "^0.5.0",
|
||||
@@ -950,9 +939,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"execa": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz",
|
||||
"integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==",
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz",
|
||||
"integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"cross-spawn": "^7.0.0",
|
||||
@@ -1022,16 +1011,23 @@
|
||||
"dev": true
|
||||
},
|
||||
"fast-glob": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz",
|
||||
"integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==",
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
|
||||
"integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
|
||||
"requires": {
|
||||
"@nodelib/fs.stat": "^2.0.1",
|
||||
"@nodelib/fs.walk": "^1.2.1",
|
||||
"glob-parent": "^5.0.0",
|
||||
"is-glob": "^4.0.1",
|
||||
"merge2": "^1.2.3",
|
||||
"micromatch": "^4.0.2"
|
||||
"@nodelib/fs.stat": "^2.0.2",
|
||||
"@nodelib/fs.walk": "^1.2.3",
|
||||
"glob-parent": "^5.1.0",
|
||||
"merge2": "^1.3.0",
|
||||
"micromatch": "^4.0.2",
|
||||
"picomatch": "^2.2.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"picomatch": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
|
||||
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"fastq": {
|
||||
@@ -1178,38 +1174,24 @@
|
||||
}
|
||||
},
|
||||
"glob-parent": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz",
|
||||
"integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==",
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
|
||||
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
|
||||
"requires": {
|
||||
"is-glob": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"globby": {
|
||||
"version": "10.0.1",
|
||||
"resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz",
|
||||
"integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==",
|
||||
"version": "11.0.1",
|
||||
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
|
||||
"integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
|
||||
"requires": {
|
||||
"@types/glob": "^7.1.1",
|
||||
"array-union": "^2.1.0",
|
||||
"dir-glob": "^3.0.1",
|
||||
"fast-glob": "^3.0.3",
|
||||
"glob": "^7.1.3",
|
||||
"ignore": "^5.1.1",
|
||||
"merge2": "^1.2.3",
|
||||
"fast-glob": "^3.1.1",
|
||||
"ignore": "^5.1.4",
|
||||
"merge2": "^1.3.0",
|
||||
"slash": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/glob": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
|
||||
"integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
|
||||
"requires": {
|
||||
"@types/events": "*",
|
||||
"@types/minimatch": "*",
|
||||
"@types/node": "*"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"got": {
|
||||
@@ -1346,9 +1328,9 @@
|
||||
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
|
||||
},
|
||||
"ignore": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz",
|
||||
"integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ=="
|
||||
"version": "5.1.8",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
|
||||
"integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
|
||||
},
|
||||
"inflight": {
|
||||
"version": "1.0.6",
|
||||
@@ -1365,9 +1347,9 @@
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
|
||||
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
|
||||
"version": "1.3.8",
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
|
||||
},
|
||||
"into-stream": {
|
||||
"version": "3.1.0",
|
||||
@@ -1544,9 +1526,9 @@
|
||||
}
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.15",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
||||
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
|
||||
"version": "4.17.19",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
|
||||
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
|
||||
"dev": true
|
||||
},
|
||||
"log-symbols": {
|
||||
@@ -1599,14 +1581,14 @@
|
||||
"dev": true
|
||||
},
|
||||
"merge2": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz",
|
||||
"integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A=="
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
||||
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
|
||||
},
|
||||
"meriyah": {
|
||||
"version": "1.9.12",
|
||||
"resolved": "https://registry.npmjs.org/meriyah/-/meriyah-1.9.12.tgz",
|
||||
"integrity": "sha512-EgnwghBfzhegstEg3GL17cyjXs/YZOzDGW4mDpiv+v4ZqZgfjNvjfjsAJ99IJMA3LyGvdC8nffZJRGX65FOqLQ=="
|
||||
"version": "1.9.15",
|
||||
"resolved": "https://registry.npmjs.org/meriyah/-/meriyah-1.9.15.tgz",
|
||||
"integrity": "sha512-D4rT6XIYGqZab0EI/xbihUpwh0WbNRVQ35l2J/5QC2atxaI8h3KvA55DEJLBB/FRdaji7JwkNehfCRjCyjCjqw=="
|
||||
},
|
||||
"micromatch": {
|
||||
"version": "4.0.2",
|
||||
@@ -2099,88 +2081,13 @@
|
||||
}
|
||||
},
|
||||
"resolve-dependencies": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-dependencies/-/resolve-dependencies-4.0.0.tgz",
|
||||
"integrity": "sha512-M5d5+5HSsei7JB9fLMcVh4F3Gn1xwYbo4W+pWNFUpDpd1+foJ7ruLpEy3VzG4O6dmkOrL7blTfoy15hJyGQXOw==",
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/resolve-dependencies/-/resolve-dependencies-6.0.2.tgz",
|
||||
"integrity": "sha512-amDlyIebiLquqRpX4odZ/LEC5QimkYlAAz4SyPxNI3nUbUa+lN74K7bYvuqrYcpuZB306EidpcpwfpI6F5q9Lw==",
|
||||
"requires": {
|
||||
"@calebboyd/async": "^1.4.0",
|
||||
"enhanced-resolve": "^4.1.1",
|
||||
"globby": "^11.0.0",
|
||||
"meriyah": "^1.9.12"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nodelib/fs.scandir": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
|
||||
"integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
|
||||
"requires": {
|
||||
"@nodelib/fs.stat": "2.0.3",
|
||||
"run-parallel": "^1.1.9"
|
||||
}
|
||||
},
|
||||
"@nodelib/fs.stat": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
|
||||
"integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
|
||||
},
|
||||
"@nodelib/fs.walk": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
|
||||
"integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
|
||||
"requires": {
|
||||
"@nodelib/fs.scandir": "2.1.3",
|
||||
"fastq": "^1.6.0"
|
||||
}
|
||||
},
|
||||
"fast-glob": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz",
|
||||
"integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==",
|
||||
"requires": {
|
||||
"@nodelib/fs.stat": "^2.0.2",
|
||||
"@nodelib/fs.walk": "^1.2.3",
|
||||
"glob-parent": "^5.1.0",
|
||||
"merge2": "^1.3.0",
|
||||
"micromatch": "^4.0.2",
|
||||
"picomatch": "^2.2.1"
|
||||
}
|
||||
},
|
||||
"glob-parent": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
|
||||
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
|
||||
"requires": {
|
||||
"is-glob": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"globby": {
|
||||
"version": "11.0.0",
|
||||
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
|
||||
"integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
|
||||
"requires": {
|
||||
"array-union": "^2.1.0",
|
||||
"dir-glob": "^3.0.1",
|
||||
"fast-glob": "^3.1.1",
|
||||
"ignore": "^5.1.4",
|
||||
"merge2": "^1.3.0",
|
||||
"slash": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"ignore": {
|
||||
"version": "5.1.4",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
|
||||
"integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A=="
|
||||
},
|
||||
"merge2": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
|
||||
"integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw=="
|
||||
},
|
||||
"picomatch": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
|
||||
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
|
||||
}
|
||||
"enhanced-resolve": "^4.2.0",
|
||||
"globby": "^11.0.1",
|
||||
"meriyah": "^1.9.15"
|
||||
}
|
||||
},
|
||||
"responselike": {
|
||||
@@ -2206,9 +2113,9 @@
|
||||
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
|
||||
},
|
||||
"rimraf": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
|
||||
"integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
|
||||
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
|
||||
"requires": {
|
||||
"glob": "^7.1.3"
|
||||
}
|
||||
|
||||
+6
-7
@@ -2,7 +2,7 @@
|
||||
"name": "nexe",
|
||||
"description": "Create a single executable out of your Node.js application",
|
||||
"license": "MIT",
|
||||
"version": "4.0.0-beta.6",
|
||||
"version": "4.0.0-beta.15",
|
||||
"contributors": [
|
||||
"Craig Condon <craig.j.condon@gmail.com> (http://crcn.io)",
|
||||
"Jared Allard <jaredallard@outlook.com>",
|
||||
@@ -30,7 +30,7 @@
|
||||
"nexe": "index.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
"node": ">=10"
|
||||
},
|
||||
"dependencies": {
|
||||
"@calebboyd/semaphore": "^1.3.1",
|
||||
@@ -39,20 +39,19 @@
|
||||
"chalk": "^2.4.2",
|
||||
"cherow": "1.6.9",
|
||||
"download": "^7.1.0",
|
||||
"globby": "^10.0.1",
|
||||
"globby": "^11.0.1",
|
||||
"got": "^9.6.0",
|
||||
"minimist": "^1.2.5",
|
||||
"mkdirp": "^1.0.4",
|
||||
"multistream": "^4.0.0",
|
||||
"ora": "^3.4.0",
|
||||
"pify": "^4.0.1",
|
||||
"resolve-dependencies": "^4.0.0",
|
||||
"rimraf": "^3.0.0"
|
||||
"resolve-dependencies": "^6.0.2",
|
||||
"rimraf": "^3.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chai": "^4.2.11",
|
||||
"@types/download": "^6.2.4",
|
||||
"@types/execa": "^2.0.0",
|
||||
"@types/globby": "^9.1.0",
|
||||
"@types/got": "^9.6.10",
|
||||
"@types/minimist": "^1.2.0",
|
||||
@@ -64,7 +63,7 @@
|
||||
"@types/rimraf": "3.0.0",
|
||||
"@types/semver": "^7.1.0",
|
||||
"chai": "^4.2.0",
|
||||
"execa": "^4.0.0",
|
||||
"execa": "^4.0.2",
|
||||
"mocha": "^7.1.1",
|
||||
"prettier": "^2.0.5",
|
||||
"ts-node": "^8.9.0",
|
||||
|
||||
+26
-30
@@ -12,11 +12,13 @@ import {
|
||||
isWindows,
|
||||
bound,
|
||||
semverGt,
|
||||
wrap,
|
||||
} from './util'
|
||||
import { NexeOptions, version } from './options'
|
||||
import { NexeTarget } from './target'
|
||||
import MultiStream = require('multistream')
|
||||
import { Bundle, toStream } from './fs/bundle'
|
||||
import { File } from 'resolve-dependencies'
|
||||
|
||||
const isBsd = Boolean(~process.platform.indexOf('bsd'))
|
||||
const make = isWindows ? 'vcbuild.bat' : isBsd ? 'gmake' : 'make'
|
||||
@@ -27,7 +29,7 @@ type StringReplacer = (match: string) => string
|
||||
export interface NexeFile {
|
||||
filename: string
|
||||
absPath: string
|
||||
contents: string
|
||||
contents: string | Buffer
|
||||
}
|
||||
|
||||
export { NexeOptions }
|
||||
@@ -108,12 +110,18 @@ export class NexeCompiler {
|
||||
//SOMEDAY iterate over multiple targets with `--outDir`
|
||||
this.targets = options.targets as NexeTarget[]
|
||||
this.target = this.targets[0]
|
||||
if (options.asset && options.asset.startsWith('http')) {
|
||||
this.remoteAsset = options.asset
|
||||
} else {
|
||||
this.remoteAsset =
|
||||
'https://github.com/nexe/nexe/releases/download/v3.0.0/' + this.target.toString()
|
||||
if (
|
||||
!(
|
||||
options.remote.startsWith('http://') ||
|
||||
options.remote.startsWith('https://') ||
|
||||
options.remote.startsWith('file://')
|
||||
)
|
||||
) {
|
||||
throw new NexeError(
|
||||
`Invalid remote URI scheme (must be http, https, or file): ${options.remote}`
|
||||
)
|
||||
}
|
||||
this.remoteAsset = options.remote + this.target.toString()
|
||||
this.src = join(this.options.temp, this.target.version)
|
||||
this.configureScript = configure + (semverGt(this.target.version, '10.10.0') ? '.py' : '')
|
||||
this.nodeSrcBinPath = isWindows
|
||||
@@ -136,18 +144,10 @@ export class NexeCompiler {
|
||||
}
|
||||
|
||||
@bound
|
||||
addResource(absoluteFileName: string, content?: Buffer | string) {
|
||||
addResource(absoluteFileName: string, content?: Buffer | string | File) {
|
||||
return this.bundle.addResource(absoluteFileName, content)
|
||||
}
|
||||
|
||||
get binaryConfiguration() {
|
||||
return { resources: this.bundle.index }
|
||||
}
|
||||
|
||||
get resourceSize() {
|
||||
return this.bundle.blobSize
|
||||
}
|
||||
|
||||
@bound
|
||||
async readFileAsync(file: string) {
|
||||
this.assertBuild()
|
||||
@@ -176,11 +176,11 @@ export class NexeCompiler {
|
||||
@bound
|
||||
async replaceInFileAsync(file: string, replace: string | RegExp, value: string | StringReplacer) {
|
||||
const entry = await this.readFileAsync(file)
|
||||
entry.contents = entry.contents.replace(replace, value as any)
|
||||
entry.contents = entry.contents.toString().replace(replace, value as any)
|
||||
}
|
||||
|
||||
@bound
|
||||
async setFileContentsAsync(file: string, contents: string) {
|
||||
async setFileContentsAsync(file: string, contents: string | Buffer) {
|
||||
const entry = await this.readFileAsync(file)
|
||||
entry.contents = contents
|
||||
}
|
||||
@@ -198,9 +198,6 @@ export class NexeCompiler {
|
||||
}
|
||||
|
||||
public getNodeExecutableLocation(target?: NexeTarget) {
|
||||
if (this.options.asset && !this.options.asset.startsWith('http')) {
|
||||
return resolve(this.options.cwd, this.options.asset)
|
||||
}
|
||||
if (target) {
|
||||
return join(this.options.temp, target.toString())
|
||||
}
|
||||
@@ -261,10 +258,7 @@ export class NexeCompiler {
|
||||
return createReadStream(this.getNodeExecutableLocation())
|
||||
}
|
||||
|
||||
private async _shouldCompileBinaryAsync(
|
||||
binary: NodeJS.ReadableStream | null,
|
||||
location: string | undefined
|
||||
) {
|
||||
private async _shouldCompileBinaryAsync(binary: NodeJS.ReadableStream | null, location: string) {
|
||||
//SOMEDAY combine make/configure/vcBuild/and modified times of included files
|
||||
const { snapshot, build } = this.options
|
||||
|
||||
@@ -298,20 +292,22 @@ export class NexeCompiler {
|
||||
return [this.shims.join(''), this.startup].join(';')
|
||||
}
|
||||
|
||||
private _assembleDeliverable(binary: NodeJS.ReadableStream) {
|
||||
private async _assembleDeliverable(binary: NodeJS.ReadableStream) {
|
||||
if (!this.options.mangle) {
|
||||
return binary
|
||||
}
|
||||
const resources = this.bundle.renderIndex()
|
||||
this.shims.unshift(wrap(`process.__nexe = ${JSON.stringify({ resources })};\n`))
|
||||
|
||||
const startup = this.code(),
|
||||
codeSize = Buffer.byteLength(startup)
|
||||
const code = this.code(),
|
||||
codeSize = Buffer.byteLength(code),
|
||||
lengths = Buffer.from(Array(16))
|
||||
|
||||
const lengths = Buffer.from(Array(16))
|
||||
lengths.writeDoubleLE(codeSize, 0)
|
||||
lengths.writeDoubleLE(this.bundle.blobSize, 8)
|
||||
lengths.writeDoubleLE(this.bundle.size, 8)
|
||||
return new (MultiStream as any)([
|
||||
binary,
|
||||
toStream(startup),
|
||||
toStream(code),
|
||||
this.bundle.toStream(),
|
||||
toStream(Buffer.concat([Buffer.from('<nexe~~sentinel>'), lengths])),
|
||||
])
|
||||
|
||||
+122
-39
@@ -1,18 +1,26 @@
|
||||
import { stat as getStat, Stats, createReadStream } from 'fs'
|
||||
import * as fs from 'fs'
|
||||
import { promisify } from 'util'
|
||||
import { relative } from 'path'
|
||||
import { Readable } from 'stream'
|
||||
import { argv } from '../options'
|
||||
import { File } from 'resolve-dependencies'
|
||||
import MultiStream = require('multistream')
|
||||
|
||||
const stat = (file: string): Promise<Stats> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
getStat(file, (err, stats) => (err ? reject(err) : resolve(stats)))
|
||||
})
|
||||
}
|
||||
const lstat = promisify(fs.lstat),
|
||||
realpath = promisify(fs.realpath),
|
||||
createReadStream = fs.createReadStream,
|
||||
stat = promisify(fs.stat)
|
||||
|
||||
export type MultiStreams = (Readable | (() => Readable))[]
|
||||
|
||||
function makeRelative(cwd: string, path: string) {
|
||||
return './' + relative(cwd, path)
|
||||
}
|
||||
|
||||
function sortEntry(a: [string, File], b: [string, File]) {
|
||||
return a[0] > b[0] ? 1 : -1
|
||||
}
|
||||
|
||||
export function toStream(content: Buffer | string) {
|
||||
const readable = new Readable({
|
||||
read() {
|
||||
@@ -23,51 +31,126 @@ export function toStream(content: Buffer | string) {
|
||||
return readable
|
||||
}
|
||||
|
||||
export type File = { absPath: string; contents: string; deps: FileMap }
|
||||
export type FileMap = { [absPath: string]: File | null }
|
||||
|
||||
export interface BundleOptions {
|
||||
entries: string[]
|
||||
cwd: string
|
||||
expand: boolean
|
||||
loadContent: boolean
|
||||
files: FileMap
|
||||
async function createFile(absoluteFileName: string) {
|
||||
const stats = await lstat(absoluteFileName),
|
||||
file: File = {
|
||||
size: stats.size,
|
||||
contents: '',
|
||||
absPath: absoluteFileName,
|
||||
deps: {},
|
||||
}
|
||||
if (stats.isSymbolicLink()) {
|
||||
file.size = stats.size
|
||||
const [realPath, realStat] = await Promise.all([
|
||||
realpath(absoluteFileName),
|
||||
stat(absoluteFileName),
|
||||
])
|
||||
file.realPath = realPath
|
||||
file.realSize = realStat.size
|
||||
}
|
||||
return file
|
||||
}
|
||||
|
||||
export class Bundle {
|
||||
size = 0
|
||||
cwd: string
|
||||
rendered = false
|
||||
private offset = 0
|
||||
private index: { [key: string]: [number, number] } = {}
|
||||
private files: { [key: string]: File } = {}
|
||||
streams: MultiStreams = []
|
||||
constructor({ cwd }: { cwd: string } = { cwd: process.cwd() }) {
|
||||
this.cwd = cwd
|
||||
}
|
||||
cwd: string
|
||||
blobSize: number = 0
|
||||
index: { [relativeFilePath: string]: [number, number] } = {}
|
||||
streams: (Readable | (() => Readable))[] = []
|
||||
|
||||
async addResource(absoluteFileName: string, content?: Buffer | string) {
|
||||
let length = 0
|
||||
if (content !== undefined) {
|
||||
length = Buffer.byteLength(content)
|
||||
} else {
|
||||
const stats = await stat(absoluteFileName)
|
||||
length = stats.size
|
||||
}
|
||||
|
||||
const start = this.blobSize
|
||||
|
||||
this.blobSize += length
|
||||
this.index[makeRelative(this.cwd, absoluteFileName)] = [start, length]
|
||||
this.streams.push(() => (content ? toStream(content) : createReadStream(absoluteFileName)))
|
||||
get list() {
|
||||
return Object.keys(this.files)
|
||||
}
|
||||
|
||||
concat() {
|
||||
throw new Error('Not Implemented')
|
||||
public async addResource(
|
||||
absoluteFileName: string,
|
||||
content?: File | Buffer | string
|
||||
): Promise<number> {
|
||||
if (this.files[absoluteFileName]) {
|
||||
return this.size
|
||||
}
|
||||
if (typeof content === 'string' || Buffer.isBuffer(content)) {
|
||||
this.files[absoluteFileName] = {
|
||||
size: Buffer.byteLength(content),
|
||||
contents: content as any, //todo type is wrong here... should allow buffer
|
||||
deps: {},
|
||||
absPath: absoluteFileName,
|
||||
}
|
||||
} else if (content) {
|
||||
this.files[content.absPath] = content
|
||||
} else {
|
||||
this.files[absoluteFileName] = {
|
||||
absPath: absoluteFileName,
|
||||
contents: '',
|
||||
deps: {},
|
||||
size: 0,
|
||||
}
|
||||
this.files[absoluteFileName] = await createFile(absoluteFileName)
|
||||
}
|
||||
return (this.size += this.files[absoluteFileName].size)
|
||||
}
|
||||
|
||||
/**
|
||||
* De-dupe files by absolute path, partition by symlink/real
|
||||
* Iterate over real, add entries
|
||||
* Iterate over symlinks, add symlinks
|
||||
*/
|
||||
renderIndex() {
|
||||
if (this.rendered) {
|
||||
throw new Error('Bundle index already rendered')
|
||||
}
|
||||
const files = Object.entries(this.files),
|
||||
realFiles: [string, File][] = [],
|
||||
symLinks: [string, File][] = []
|
||||
for (const entry of files) {
|
||||
if (entry[1].realPath) {
|
||||
symLinks.push(entry)
|
||||
} else {
|
||||
realFiles.push(entry)
|
||||
}
|
||||
}
|
||||
realFiles.sort(sortEntry)
|
||||
symLinks.sort(sortEntry)
|
||||
|
||||
for (const [absPath, file] of realFiles) {
|
||||
this.addEntry(absPath, file)
|
||||
}
|
||||
for (const [absPath, file] of symLinks) {
|
||||
this.addEntry(file.realPath as string, file)
|
||||
this.addEntry(absPath, file, file.realPath)
|
||||
}
|
||||
this.rendered = true
|
||||
return this.index
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a stream if needed and an entry with the required offset and size
|
||||
* Ensure the calling order of this method is idempotent (eg, while iterating a sorted set)
|
||||
* @param entryPath
|
||||
* @param file
|
||||
* @param useEntry
|
||||
*/
|
||||
addEntry(entryPath: string, file: File, useEntry?: string) {
|
||||
const existingName = useEntry && makeRelative(this.cwd, useEntry),
|
||||
name = makeRelative(this.cwd, entryPath),
|
||||
size = file.realSize ?? file.size,
|
||||
existingEntry = this.index[existingName ?? name]
|
||||
|
||||
this.index[name] = existingEntry || [this.offset, size]
|
||||
if (!existingEntry) {
|
||||
this.streams.push(() =>
|
||||
file.contents ? toStream(file.contents) : createReadStream(file.absPath)
|
||||
)
|
||||
this.offset += size
|
||||
}
|
||||
}
|
||||
|
||||
toStream() {
|
||||
return new (MultiStream as any)(this.streams)
|
||||
}
|
||||
|
||||
toJSON() {
|
||||
return this.index
|
||||
}
|
||||
}
|
||||
|
||||
+8
-1
@@ -317,7 +317,14 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
|
||||
log('read (miss) ' + filepath)
|
||||
return original.call(this, ...args)
|
||||
}
|
||||
patches.internalModuleReadJSON = patches.internalModuleReadFile
|
||||
let returningArray: boolean
|
||||
patches.internalModuleReadJSON = function (this: any, original: any, ...args: any[]) {
|
||||
if (returningArray == null) returningArray = Array.isArray(original.call(this, ''))
|
||||
const res = patches.internalModuleReadFile.call(this, original, ...args)
|
||||
return returningArray && !Array.isArray(res)
|
||||
? [res, /"(main|name|type|exports|imports)"/.test(res)]
|
||||
: res
|
||||
}
|
||||
patches.internalModuleStat = function (this: any, original: any, ...args: any[]) {
|
||||
setupManifest()
|
||||
const filepath = getKey(args[0])
|
||||
|
||||
+8
-4
@@ -21,7 +21,7 @@ export interface NexeOptions {
|
||||
output: string
|
||||
targets: (string | NexeTarget)[]
|
||||
name: string
|
||||
asset: string
|
||||
remote: string
|
||||
cwd: string
|
||||
fs: boolean | string[]
|
||||
flags: string[]
|
||||
@@ -71,6 +71,7 @@ const defaults = {
|
||||
bundle: true,
|
||||
patches: [],
|
||||
plugins: [],
|
||||
remote: 'https://github.com/nexe/nexe/releases/download/v3.3.3/',
|
||||
}
|
||||
const alias = {
|
||||
i: 'input',
|
||||
@@ -80,7 +81,6 @@ const alias = {
|
||||
b: 'build',
|
||||
n: 'name',
|
||||
r: 'resource',
|
||||
a: 'asset',
|
||||
p: 'python',
|
||||
f: 'flag',
|
||||
c: 'configure',
|
||||
@@ -101,7 +101,7 @@ ${c.bold('nexe <entry-file> [options]')}
|
||||
-t --target -- node version description
|
||||
-n --name -- main app module name
|
||||
-r --resource -- *embed files (glob) within the binary
|
||||
-a --asset -- alternate asset path, file or url pointing to a base (nexe) binary
|
||||
--remote -- alternate location (URL) to download pre-built base (nexe) binaries from
|
||||
--plugin -- extend nexe runtime behavior
|
||||
|
||||
${c.underline.bold('Building from source:')}
|
||||
@@ -112,7 +112,7 @@ ${c.bold('nexe <entry-file> [options]')}
|
||||
-c --configure -- *arguments to the configure step
|
||||
-m --make -- *arguments to the make/build step
|
||||
--patch -- module with middleware default export for adding a build patch
|
||||
--no-mangle -- used when generating base binaries, or when patching _third_party_main manually.
|
||||
--no-mangle -- used when generating base binaries, or when patching _third_party_main manually
|
||||
--snapshot -- path to a warmup snapshot
|
||||
--ico -- file name for alternate icon file (windows)
|
||||
--rc-* -- populate rc file options (windows)
|
||||
@@ -249,6 +249,10 @@ function normalizeOptions(input?: Partial<NexeOptions>): NexeOptions {
|
||||
options.configure = flatten(options.configure)
|
||||
options.resources = flatten(opts.resource, options.resources)
|
||||
|
||||
if (!options.remote.endsWith('/')) {
|
||||
options.remote += '/'
|
||||
}
|
||||
|
||||
options.downloadOptions = options.downloadOptions || {}
|
||||
options.downloadOptions.headers = options.downloadOptions.headers || {}
|
||||
options.downloadOptions.headers['User-Agent'] = 'nexe (https://www.npmjs.com/package/nexe)'
|
||||
|
||||
@@ -12,14 +12,15 @@ export default async function nodeRc(compiler: NexeCompiler, next: () => Promise
|
||||
let value = options[key]
|
||||
const isVar = /^[A-Z_]+$/.test(value)
|
||||
value = isVar ? value : `"${value}"`
|
||||
file.contents = file.contents.replace(
|
||||
new RegExp(`VALUE "${key}",.*`),
|
||||
`VALUE "${key}", ${value}`
|
||||
)
|
||||
file.contents = file.contents
|
||||
.toString()
|
||||
.replace(new RegExp(`VALUE "${key}",.*`), `VALUE "${key}", ${value}`)
|
||||
})
|
||||
;['PRODUCTVERSION', 'FILEVERSION'].forEach((x) => {
|
||||
if (options[x]) {
|
||||
file.contents = file.contents.replace(new RegExp(x + ' .*$', 'm'), `${x} ${options[x]}`)
|
||||
file.contents = file.contents
|
||||
.toString()
|
||||
.replace(new RegExp(x + ' .*$', 'm'), `${x} ${options[x]}`)
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ export default async function main(compiler: NexeCompiler, next: () => Promise<v
|
||||
}
|
||||
|
||||
const file = await compiler.readFileAsync(bootFile),
|
||||
ast = parse(file.contents, {
|
||||
ast = parse(file.contents.toString(), {
|
||||
loc: true,
|
||||
tolerant: true,
|
||||
next: true,
|
||||
@@ -54,7 +54,7 @@ export default async function main(compiler: NexeCompiler, next: () => Promise<v
|
||||
}
|
||||
})
|
||||
|
||||
const fileLines = file.contents.split('\n')
|
||||
const fileLines = file.contents.toString().split('\n')
|
||||
fileLines.splice(
|
||||
location.start.line,
|
||||
0,
|
||||
@@ -65,22 +65,40 @@ export default async function main(compiler: NexeCompiler, next: () => Promise<v
|
||||
file.contents = fileLines.join('\n')
|
||||
|
||||
if (semverGt(version, '11.99')) {
|
||||
await compiler.replaceInFileAsync(
|
||||
bootFile,
|
||||
'initializePolicy();',
|
||||
'initializePolicy();\n' + wrap('{{replace:lib/patches/boot-nexe.js}}')
|
||||
)
|
||||
if (semverGt(version, '12.17.99')) {
|
||||
await compiler.replaceInFileAsync(
|
||||
bootFile,
|
||||
'initializeFrozenIntrinsics();',
|
||||
'initializeFrozenIntrinsics();\n' + wrap('{{replace:lib/patches/boot-nexe.js}}')
|
||||
)
|
||||
} else {
|
||||
await compiler.replaceInFileAsync(
|
||||
bootFile,
|
||||
'initializePolicy();',
|
||||
'initializePolicy();\n' + wrap('{{replace:lib/patches/boot-nexe.js}}')
|
||||
)
|
||||
}
|
||||
await compiler.replaceInFileAsync(
|
||||
bootFile,
|
||||
'assert(!CJSLoader.hasLoadedAnyUserCJSModule)',
|
||||
'/*assert(!CJSLoader.hasLoadedAnyUserCJSModule)*/'
|
||||
)
|
||||
await compiler.replaceInFileAsync(
|
||||
'src/node.cc',
|
||||
'MaybeLocal<Value> StartMainThreadExecution(Environment* env) {',
|
||||
'MaybeLocal<Value> StartMainThreadExecution(Environment* env) {\n' +
|
||||
' return StartExecution(env, "internal/main/run_main_module");\n'
|
||||
)
|
||||
const { contents: nodeccContents } = await compiler.readFileAsync('src/node.cc')
|
||||
if (nodeccContents.includes('if (env->worker_context() != nullptr) {')) {
|
||||
await compiler.replaceInFileAsync(
|
||||
'src/node.cc',
|
||||
'if (env->worker_context() != nullptr) {',
|
||||
'if (env->worker_context() == nullptr) {\n' +
|
||||
' return StartExecution(env, "internal/main/run_main_module"); } else {\n'
|
||||
)
|
||||
} else {
|
||||
await compiler.replaceInFileAsync(
|
||||
'src/node.cc',
|
||||
'MaybeLocal<Value> StartMainThreadExecution(Environment* env) {',
|
||||
'MaybeLocal<Value> StartMainThreadExecution(Environment* env) {\n' +
|
||||
' return StartExecution(env, "internal/main/run_main_module");\n'
|
||||
)
|
||||
}
|
||||
} else {
|
||||
await compiler.setFileContentsAsync(
|
||||
'lib/_third_party_main.js',
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import { join, dirname } from 'path'
|
||||
import { promises } from 'fs'
|
||||
import * as fs from 'fs'
|
||||
import { promisify } from 'util'
|
||||
import { readFileAsync, writeFileAsync, isDirectoryAsync } from '../util'
|
||||
import mkdirpAsync = require('mkdirp')
|
||||
import { NexeCompiler } from '../compiler'
|
||||
|
||||
const unlinkAsync = promises.unlink
|
||||
const readdirAsync = promises.readdir
|
||||
const unlinkAsync = promisify(fs.unlink),
|
||||
readdirAsync = promisify(fs.readdir)
|
||||
|
||||
function readDirAsync(dir: string): Promise<string[]> {
|
||||
return readdirAsync(dir).then((paths) => {
|
||||
|
||||
+15
-11
@@ -1,8 +1,7 @@
|
||||
import { NexeCompiler, NexeError } from '../compiler'
|
||||
import { resolve, relative } from 'path'
|
||||
import { each } from '@calebboyd/semaphore'
|
||||
import resolveFiles, { resolveSync } from 'resolve-dependencies'
|
||||
import { dequote, STDIN_FLAG, semverGt } from '../util'
|
||||
import { dequote, STDIN_FLAG, semverGt, each } from '../util'
|
||||
import { Readable } from 'stream'
|
||||
|
||||
function getStdIn(stdin: Readable): Promise<string> {
|
||||
@@ -26,7 +25,7 @@ function getStdIn(stdin: Readable): Promise<string> {
|
||||
}
|
||||
|
||||
export default async function bundle(compiler: NexeCompiler, next: any) {
|
||||
const { bundle, cwd, input: inputPath } = compiler.options
|
||||
const { bundle: doBundle, cwd, input: inputPath } = compiler.options
|
||||
let input = inputPath
|
||||
compiler.entrypoint = './' + relative(cwd, input)
|
||||
|
||||
@@ -36,14 +35,14 @@ export default async function bundle(compiler: NexeCompiler, next: any) {
|
||||
compiler.startup = ';require("module").runMain();'
|
||||
}
|
||||
|
||||
if (!bundle) {
|
||||
if (!doBundle) {
|
||||
await compiler.addResource(resolve(cwd, input))
|
||||
return next()
|
||||
}
|
||||
|
||||
let code = ''
|
||||
if (typeof bundle === 'string') {
|
||||
code = await require(bundle).createBundle(compiler.options)
|
||||
if (typeof doBundle === 'string') {
|
||||
code = await require(doBundle).createBundle(compiler.options)
|
||||
}
|
||||
|
||||
if (input === STDIN_FLAG && (code = code || dequote(await getStdIn(process.stdin)))) {
|
||||
@@ -62,9 +61,9 @@ export default async function bundle(compiler: NexeCompiler, next: any) {
|
||||
compiler.entrypoint = './' + relative(cwd, input)
|
||||
}
|
||||
|
||||
const { files, warnings } = await resolveFiles(
|
||||
const { files, warnings } = resolveFiles(
|
||||
input,
|
||||
...Object.keys(compiler.bundle.index).filter((x) => x.endsWith('.js')),
|
||||
...Object.keys(compiler.bundle.list).filter((x) => x.endsWith('.js')),
|
||||
{ cwd, expand: 'variable', loadContent: false }
|
||||
)
|
||||
|
||||
@@ -74,8 +73,13 @@ export default async function bundle(compiler: NexeCompiler, next: any) {
|
||||
throw new NexeError('Parsing Error:\n' + warnings.join('\n'))
|
||||
}
|
||||
|
||||
await each(Object.keys(files), (filename: string) => compiler.addResource(filename), {
|
||||
concurrency: 10,
|
||||
})
|
||||
//TODO: warnings.forEach((x) => console.log(x))
|
||||
|
||||
await Promise.all(
|
||||
Object.entries(files).map(([key, file]) => {
|
||||
return compiler.addResource(key, file)
|
||||
})
|
||||
)
|
||||
|
||||
return next()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { isDirectoryAsync, each } from '../util'
|
||||
import { each } from '../util'
|
||||
import * as globs from 'globby'
|
||||
import { NexeCompiler } from '../compiler'
|
||||
|
||||
@@ -14,14 +14,11 @@ export default async function resource(compiler: NexeCompiler, next: () => Promi
|
||||
// and https://github.com/mrmlnc/fast-glob#pattern-syntax
|
||||
const resourcesWithForwardSlashes = resources.map((r) => r.replace(/\\/g, '/'))
|
||||
|
||||
await each(globs(resourcesWithForwardSlashes, { cwd }), async (file) => {
|
||||
if (await isDirectoryAsync(file)) {
|
||||
return
|
||||
}
|
||||
await each(globs(resourcesWithForwardSlashes, { cwd, onlyFiles: true }), async (file) => {
|
||||
count++
|
||||
step.log(`Including file: ${file}`)
|
||||
await compiler.addResource(file)
|
||||
})
|
||||
step.log(`Included ${count} file(s). ${(compiler.resourceSize / 1e6).toFixed(3)} MB`)
|
||||
step.log(`Included ${count} file(s)`)
|
||||
return next()
|
||||
}
|
||||
|
||||
+1
-2
@@ -3,10 +3,9 @@ import { wrap } from '../util'
|
||||
|
||||
export default async function (compiler: NexeCompiler, next: () => Promise<void>) {
|
||||
await next()
|
||||
|
||||
compiler.shims.push(
|
||||
wrap(
|
||||
`process.__nexe = ${JSON.stringify(compiler.binaryConfiguration)};\n` +
|
||||
'' +
|
||||
'{{replace:lib/fs/patch.js}}' +
|
||||
'\nshimFs(process.__nexe)' +
|
||||
`\n${compiler.options.fs ? '' : 'restoreFs()'}`
|
||||
|
||||
+6
-6
@@ -1,9 +1,9 @@
|
||||
import { readFile, writeFile, stat } from 'fs'
|
||||
import { execFile } from 'child_process'
|
||||
import pify = require('pify')
|
||||
import { promisify } from 'util'
|
||||
import rimraf = require('rimraf')
|
||||
|
||||
const rimrafAsync = pify(rimraf)
|
||||
const rimrafAsync = promisify(rimraf)
|
||||
export const STDIN_FLAG = '[stdin]'
|
||||
|
||||
export async function each<T>(
|
||||
@@ -64,10 +64,10 @@ export interface ReadFileAsync {
|
||||
(path: string, encoding: string): Promise<string>
|
||||
}
|
||||
|
||||
const readFileAsync = pify(readFile)
|
||||
const writeFileAsync = pify(writeFile)
|
||||
const statAsync = pify(stat)
|
||||
const execFileAsync = pify(execFile)
|
||||
const readFileAsync = promisify(readFile)
|
||||
const writeFileAsync = promisify(writeFile)
|
||||
const statAsync = promisify(stat)
|
||||
const execFileAsync = promisify(execFile)
|
||||
const isWindows = process.platform === 'win32'
|
||||
|
||||
function pathExistsAsync(path: string) {
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import { appendFileSync } from 'fs'
|
||||
|
||||
function alpine(target: NexeTarget) {
|
||||
return `
|
||||
FROM ${target.arch === 'x64' ? '' : 'i386/'}alpine:3.4
|
||||
FROM ${target.arch === 'x64' ? '' : 'i386/'}alpine:3.12
|
||||
RUN apk add --no-cache curl make gcc g++ binutils-gold python linux-headers paxctl libgcc libstdc++ git vim tar gzip wget
|
||||
ENV NODE_VERSION=${target.version}
|
||||
ENV NEXE_VERSION=latest
|
||||
|
||||
@@ -39,6 +39,26 @@ describe('options', () => {
|
||||
expect(options.output).to.equal(path.resolve(cwd, `abc${ext}`))
|
||||
})
|
||||
})
|
||||
|
||||
describe('remote', () => {
|
||||
it('should use default remote', () => {
|
||||
const options = normalizeOptions({})
|
||||
expect(options.remote).to.equal('https://github.com/nexe/nexe/releases/download/v3.3.3/')
|
||||
})
|
||||
it('should append trailing slash to third-party remote if necessary', () => {
|
||||
const options = normalizeOptions({
|
||||
remote: 'https://sitejs.org/nexe'
|
||||
})
|
||||
expect(options.remote).to.equal('https://sitejs.org/nexe/')
|
||||
})
|
||||
it('should not append trailing slash to third-party remote that already has one', () => {
|
||||
const options = normalizeOptions({
|
||||
remote: 'https://sitejs.org/nexe/'
|
||||
})
|
||||
expect(options.remote).to.equal('https://sitejs.org/nexe/')
|
||||
})
|
||||
})
|
||||
|
||||
describe('output', () => {
|
||||
it('should work', () => {
|
||||
const options = normalizeOptions({
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target":"es5",
|
||||
"target":"es2015",
|
||||
"skipLibCheck": true,
|
||||
"experimentalDecorators": true,
|
||||
"lib": ["es2018"],
|
||||
|
||||
Reference in New Issue
Block a user