Compare commits

...

33 Commits

Author SHA1 Message Date
calebboyd 1a75bdb058 fix: avoid syncronous errors in compile method 2019-01-23 20:31:11 -06:00
calebboyd 12c77a34fd chore: update resolve-dependencies 2019-01-05 11:25:36 -06:00
calebboyd c76edb7c0b chore: expose build on compiler 2018-12-31 08:51:53 -06:00
calebboyd 09d7093295 fix: ignore parsing errors in node_modules 2018-12-21 19:58:34 -06:00
calebboyd 3a091f45bd refactor(fs-patches): don't destroy arguments for non bundled files 2018-12-15 16:38:32 -06:00
bruce-one 9575c0811b refactor: avoid checking DEBUG every log, if set. (#562) 2018-12-05 19:51:04 -06:00
calebboyd ab6b540e23 fix: filter parser warnings 2018-11-29 09:47:35 -06:00
calebboyd dcea374922 fix: input detection and validity
closes #556, #548, #547, #533
2018-11-28 20:25:59 -06:00
calebboyd b3b6c6b936 chore: use npm i 2018-11-21 21:42:22 -06:00
calebboyd 058c34ee8a chore: update node-cli patches for 10-10.9 2018-11-21 18:31:06 -06:00
calebboyd 9750c70873 chore: update circle-ci caching 2018-11-21 10:58:03 -06:00
calebboyd 7bc3a83667 fix: node 10 cli args 2018-11-20 14:35:35 -06:00
calebboyd aa93ab6516 chore: update resolve-dependencies 2018-11-15 14:27:36 -06:00
calebboyd c681a62566 chore: log json error response 2018-10-25 10:06:05 -05:00
calebboyd 2ea0f897d5 chore: bump version 2018-10-23 10:23:34 -05:00
António Nuno Monteiro cfa3036694 feat: invalidate binary cache when snapshot file changes (#542) 2018-10-23 09:31:17 -05:00
calebboyd c3ba3ec872 chore: bump version 2018-10-21 12:25:35 -05:00
António Nuno Monteiro 142338ede6 fix: stringify compiler.entrypoint in shims (#541) 2018-10-21 12:00:06 -05:00
calebboyd e3f1d6fc74 fix: missing cwd on resolve 2018-10-20 11:31:05 -05:00
calebboyd 0db8122f8f fix: handle configure script in node 10.11+ 2018-10-20 11:23:12 -05:00
António Nuno Monteiro 129c2f86a0 fix: include snapshot in patches (#539) 2018-10-20 11:16:41 -05:00
calebboyd db766e2832 fix: use vcBuild and make based on current platform 2018-10-20 10:33:39 -05:00
calebboyd e6a416cc4f fix: add internalModuleReadJSON patch 2018-10-17 21:56:37 -05:00
calebboyd 35f4811826 fix: remove spread operator 2018-10-09 14:07:32 -05:00
calebboyd 891ac0ab2a chore: badges 2018-10-04 08:20:00 -05:00
calebboyd 18bbf24456 chore: bump version 2018-10-04 08:20:00 -05:00
calebboyd 689160e833 fix: handle empty content when adding an empty file 2018-10-04 08:20:00 -05:00
calebboyd bd3ae2e80a chore: disable stdin in docker build 2018-10-04 08:20:00 -05:00
calebboyd 0447d8004c chore: append build error to log file 2018-10-04 08:19:59 -05:00
Jon Tore Hafstad 11be5a2573 chore(docs): resource should always we a glob string (#528)
To avoid confusion regarding the resource glob string, all examples i the readme should be in strings.
2018-10-04 08:19:03 -05:00
calebboyd 664dc6a11b chore: update arm version generator 2018-09-26 09:57:08 -05:00
calebboyd 4a7bfd99b6 chore: fix platform check 2018-09-25 11:48:39 -05:00
calebboyd a3af96eae8 chore: update travis auth 2018-09-25 11:36:09 -05:00
26 changed files with 550 additions and 299 deletions
+1 -1
View File
@@ -5,4 +5,4 @@ export NVS_HOME="$HOME/.nvs"
set -e -x
yarn run asset-compile
npm run asset-compile
+2 -2
View File
@@ -8,13 +8,13 @@ jobs:
- checkout
- restore_cache:
keys:
- package-{{ checksum "package.json" }}-{{ checksum "yarn.lock" }}
- package-{{ checksum "package.json" }}-{{ checksum "package-lock.json" }}
- package- # Fallback for the latest package.json cache
- run:
name: setup
command: .circleci/setup.sh
- save_cache:
key: package-{{ checksum "package.json" }}-{{ checksum "yarn.lock" }}
key: package-{{ checksum "package.json" }}-{{ checksum "package-lock.json" }}
paths:
- node_modules
- run:
+3 -4
View File
@@ -1,11 +1,10 @@
#!/usr/bin/env bash
set -e
echo "setting up node to use latest lts"
export NVS_HOME="$HOME/.nvs"
git clone --depth=1 https://github.com/jasongin/nvs "$NVS_HOME"
. "$NVS_HOME/nvs.sh" install
nvs add lts && nvs link lts nvs use default
npm install -g yarn
yarn
node -v
npm -v
npm i
+14 -13
View File
@@ -1,11 +1,12 @@
<p align="center"><img src="https://cloud.githubusercontent.com/assets/2391349/23598327/a17bb68a-01ee-11e7-8f55-88a5fc96e997.png" /></p>
<p align="center">
<a href="https://circleci.com/gh/nexe/nexe"><img src="https://img.shields.io/circleci/project/nexe/nexe.svg" alt="Build Status"></a>
<a href="https://circleci.com/gh/nexe/nexe"><img src="https://img.shields.io/circleci/project/github/nexe/nexe/master.svg" alt="Mac Build Status"></a>
<a href="https://travis-ci.org/nexe/nexe/builds"><img src="https://img.shields.io/travis/nexe/nexe/master.svg" alt="Linux Build Status"></a>
<a href="https://ci.appveyor.com/project/calebboyd/nexe/history"><img src="https://img.shields.io/appveyor/ci/calebboyd/nexe/master.svg" alt="Windows Build Status"></a>
<a href="https://www.npmjs.com/package/nexe"><img src="https://img.shields.io/npm/dt/nexe.svg" alt="Downloads"></a>
<a href="https://www.npmjs.com/package/nexe"><img src="https://img.shields.io/npm/v/nexe.svg" alt="Version"></a>
<a href="https://www.npmjs.com/package/nexe"><img src="https://img.shields.io/npm/l/nexe.svg" alt="License"></a>
<a href="https://gitter.im/nexe/nexe?utm_source=badge&utm_medium=badge"><img src="https://badges.gitter.im/nexe/nexe.svg"></a>
</p>
<p align="center"><code>npm i nexe -g</code></p>
@@ -40,8 +41,7 @@ For more CLI options see: `nexe --help`
### Examples
- `nexe server.js -r public/**/*.html`
- `nexe my-bundle.js --no-bundle -o app.exe`
- `nexe server.js -r "public/**/*.html"`
- `nexe --build`
- `nexe -t x86-8.0.0`
@@ -88,14 +88,14 @@ compile({
- Output executable file path
- default: same as `name` with an OS specific extension.
- #### `target: string | object`
- An object or string describing platform-arch-version. e.g. `'windows-ia32-6.10.3'`
- An object or string describing platform-arch-version. e.g. `'windows-ia32-10.13.0'`
- each segment is optional, and will be merged with the current environment
- Examples: ([full list](https://github.com/nexe/nexe/releases))
- `'win32-x86-8.6.0`
- `'win32-x86-10.13.0`
- `{ platform: 'alpine' }`
- `darwin-8.6.0`
- `darwin-10.13.0`
- `linux-x64`
- `macos-8.4.0`
- `macos-10.13.0`
See [test/target.spec.ts](test/target.spec.ts)
- If the [`build`](#build-boolean) flag is set, the platform portion of the target is ignored.
@@ -128,10 +128,11 @@ compile({
- Example: `['--with-dtrace', '--dest-cpu=x64']`
- default: `[]`
- #### `make: string[]`
- Array of arguments for the node build make step, on windows this step recieves options for vcBuild.bat
- default: `[]` or `['nosign', 'release']` for non windows systems
- Array of arguments for the node build make step
- default: `[]`
- #### `vcBuild: string[]`
- Alias for `make` option
- Options for windows build
- default: `['nosign', 'release']`
- #### `snapshot: string`
- path to a file to be used as the warmup snapshot for the build
- default: `null`
@@ -142,12 +143,12 @@ compile({
- #### `temp: string`
- Path to use for storing nexe's build files
- Override in the env with `NEXE_TEMP`
- default: `./.nexe` in the cwd
- default: `~/.nexe`
- #### `ico: string`
- Path to a user provided icon to be used (Windows only). Requires `--build` to be set.
- #### `rc: object`
- Settings for patching the [node.rc](https://github.com/nodejs/node/blob/master/src/res/node.rc) configuration file (Windows only).
- Example:
- Example (keys may vary depending ont the version. Reference the file linked above):
```javascript
{
CompanyName: "ACME Corp",
+2 -1
View File
@@ -5,7 +5,7 @@ environment:
CIRCLE_TOKEN:
secure: TQKcepXmTzCNt4+tUBtYpwEQkdSPwFr9A8ugtoMhNbKu/SW1WM1EpjEu6kYXxpQ4
TRAVIS_TOKEN:
secure: tR7HXYv3x97q90uvPrjUxKZh7R1+uqKct0HdEcqTbsg=
secure: 6ni/E6Rbmv6cFWW7QNLkpQY2fVpT7wr7y12GEtektN0=
GITHUB_TOKEN:
secure: 3wuEGJsppSKFvdwhp3jprUA9Zkc3WINlc/9oFXjhAR6J05lYMXP7Fl7lXTKpkGZx
install:
@@ -20,3 +20,4 @@ build_script:
- npm run asset-compile
artifacts:
- path: $(HOMEPATH)\.nexe\**\node.exe
+14 -1
View File
@@ -10,7 +10,20 @@ if (require.main === module) {
process.stderr.write(showHelp ? options.help : options.version + eol)
} else {
const nexe = require('./lib/nexe')
nexe.compile(argv).catch(() => {
nexe.compile(argv).catch((error) => {
const NexeError = require('./lib/compiler').NexeError
const chalk = require('chalk')
const isSilent = Boolean(argv.silent === true || argv.loglevel === 'silent')
if (!isSilent) {
if (error instanceof NexeError) {
process.stderr.write(eol + chalk.red('Error: ') + error.message + eol
+ eol + 'See nexe -h for usage..' + eol + eol
)
} else {
process.stderr.write(error.stack + eol)
}
}
process.exit(1)
})
}
+193 -82
View File
@@ -1,6 +1,6 @@
{
"name": "nexe",
"version": "3.0.0-beta.0",
"version": "3.0.0-beta.15",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -37,11 +37,42 @@
}
},
"@types/chai": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.5.tgz",
"integrity": "sha512-nyzJ08qQMY4umgXD6SzbLflQucEnoAf2H5iUxPX5t0euDgXDV+bFTJlEmEepM35/2l07jYHdAfP6YEndeTWM0w==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz",
"integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==",
"dev": true
},
"@types/decompress": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.3.tgz",
"integrity": "sha512-W24e3Ycz1UZPgr1ZEDHlK4XnvOr+CpJH3qNsFeqXwwlW/9END9gxn3oJSsp7gYdiQxrXUHwUUd3xuzVz37MrZQ==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/download": {
"version": "6.2.4",
"resolved": "https://registry.npmjs.org/@types/download/-/download-6.2.4.tgz",
"integrity": "sha512-Lo5dy3ai6LNnbL663sgdzqL1eib11u1yKH6w3v3IXEOO4kRfQpMn1qWUTaumcHLACjFp1RcBx9tUXEvJoR3vcA==",
"dev": true,
"requires": {
"@types/decompress": "*",
"@types/got": "^8",
"@types/node": "*"
},
"dependencies": {
"@types/got": {
"version": "8.3.5",
"resolved": "https://registry.npmjs.org/@types/got/-/got-8.3.5.tgz",
"integrity": "sha512-AaXSrIF99SjjtPVNmCmYb388HML+PKEJb/xmj4SbL2ZO0hHuETZZzyDIKfOqaEoAHZEuX4sC+FRFrHYJoIby6A==",
"dev": true,
"requires": {
"@types/node": "*"
}
}
}
},
"@types/events": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
@@ -79,12 +110,13 @@
}
},
"@types/got": {
"version": "8.3.4",
"resolved": "https://registry.npmjs.org/@types/got/-/got-8.3.4.tgz",
"integrity": "sha512-0AbIQzpqQafYPFg26nwg5PfNgPLYwHeTP6z5F1u+5oypLIdpx34o5r8wYTTj3X3YYF2yPHtZPO/KYwlI8Nu/hQ==",
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@types/got/-/got-9.2.2.tgz",
"integrity": "sha512-6G2FdsJxcaUP0/08di2A5kHEfSbXd2npcB/9gsvFNR5kdlKWkJ4RpYdJLQRifwktHqsq/NfSnkoZYws/E009og==",
"dev": true,
"requires": {
"@types/node": "*"
"@types/node": "*",
"@types/tough-cookie": "*"
}
},
"@types/minimatch": {
@@ -160,6 +192,17 @@
"integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==",
"dev": true
},
"@types/tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha512-Set5ZdrAaKI/qHdFlVMgm/GsAv/wkXhSTuZFkJ+JI7HK+wIkIlOaUXSXieIvJ0+OvGIqtREFoE+NHJtEq0gtEw==",
"dev": true
},
"acorn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz",
"integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg=="
},
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
@@ -520,17 +563,17 @@
}
},
"chai": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
"integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
"integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
"dev": true,
"requires": {
"assertion-error": "^1.0.1",
"check-error": "^1.0.1",
"deep-eql": "^3.0.0",
"assertion-error": "^1.1.0",
"check-error": "^1.0.2",
"deep-eql": "^3.0.1",
"get-func-name": "^2.0.0",
"pathval": "^1.0.0",
"type-detect": "^4.0.0"
"pathval": "^1.1.0",
"type-detect": "^4.0.5"
}
},
"chalk": {
@@ -967,9 +1010,9 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"eslint-plugin-prettier": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.2.tgz",
"integrity": "sha512-tGek5clmW5swrAx1mdPYM8oThrBE83ePh7LeseZHBWfHVGrHPhKn7Y5zgRMbU/9D5Td9K4CEmUPjGxA7iw98Og==",
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz",
"integrity": "sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA==",
"dev": true,
"requires": {
"fast-diff": "^1.1.1",
@@ -1142,9 +1185,9 @@
}
},
"fast-diff": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
"integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
"integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
"dev": true
},
"fast-glob": {
@@ -1324,34 +1367,32 @@
}
},
"got": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/got/-/got-9.2.2.tgz",
"integrity": "sha512-XLXmtO1QxLuzj6t4JBClWD1NI/bMvsR9utYl0yyPg49eUJjqU7HaQhPDvSVGwYoSbAqsRfe5aNZXHl1Zctzwmw==",
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.5.0.tgz",
"integrity": "sha512-N+4kb6i9t1lauJ4NwLVVoFVLxZNa6i+iivtNzCSVw7+bVbTXoq0qXctdd8i9rj3lrI0zDk5NGzcO4bfpEP6Uuw==",
"requires": {
"@sindresorhus/is": "^0.11.0",
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.0",
"cacheable-request": "^5.0.0",
"cacheable-request": "^5.1.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.0.0",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^0.5.0",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
},
"dependencies": {
"@sindresorhus/is": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.11.0.tgz",
"integrity": "sha512-i5Zh5+3QARyXtzq3Bd2Lg3aBRFLcgYbNoap3Hyu1uRN8X+D+0JMqqc4uk4XjhNxfVdCnL8WHUA2wxa33QCC50w==",
"requires": {
"symbol-observable": "^1.2.0"
}
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
},
"cacheable-request": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-5.0.0.tgz",
"integrity": "sha512-gU53XCfodl+GZ37ecX/uLobGE+WvgE2QE3VfhX7sPf04Kc35tNPip3IfCKfqJ2e04HLuHRxFCWgGWttv8OQbfw==",
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-5.2.0.tgz",
"integrity": "sha512-h1n0vjpFaByTvU6PiyTKk2kx4OnuV1aVUynCUd/FiKl4icpPSceowk3rHczwFEBuZvz+E1EU4KExR0MCPeQfaQ==",
"requires": {
"clone-response": "^1.0.2",
"get-stream": "^4.0.0",
@@ -1363,17 +1404,17 @@
}
},
"get-stream": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.0.0.tgz",
"integrity": "sha512-FneLKMENeOR7wOK0/ZXCh+lwqtnPwkeunJjRN28LPqzGvNAhYvrTAhXv6xDm4vsJ0M7lcRbIYHQudKsSy2RtSQ==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"requires": {
"pump": "^3.0.0"
}
},
"http-cache-semantics": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz",
"integrity": "sha512-NtexGRtaV5z3ZUX78W9UDTOJPBdpqms6RmwQXmOhHws7CuQK3cqIoQtnmeqi1VvVD6u6eMMRL0sKE9BCZXTDWQ=="
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
"integrity": "sha512-OO/9K7uFN30qwAKvslzmCTbimZ/uRjtdN5S50vvWLwUKqFuZj0n96XyCzF5tHRHEO/Q4JYC01hv41gkX06gmHA=="
},
"normalize-url": {
"version": "3.3.0",
@@ -1381,9 +1422,9 @@
"integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
},
"p-cancelable": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.5.1.tgz",
"integrity": "sha512-vkOBXQgQb03QTOoMeeB5/uS2W3iafXzQLaIh7ChHjEb8DDT06sWJizhdOACL1Sittl5dFqsyumJ4rD1WUF8Isw=="
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.0.0.tgz",
"integrity": "sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA=="
}
}
},
@@ -1713,6 +1754,12 @@
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
},
"lines-and-columns": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
"dev": true
},
"log-symbols": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
@@ -2138,9 +2185,9 @@
"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
},
"pify": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.0.tgz",
"integrity": "sha512-zrSP/KDf9DH3K3VePONoCstgPiYJy9z0SCatZuTpOc7YdnWIqwkWdXOuwlr4uDc7em8QZRsFWsT/685x5InjYg=="
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
},
"pinkie": {
"version": "2.0.4",
@@ -2166,9 +2213,9 @@
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
},
"prettier": {
"version": "1.14.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz",
"integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==",
"version": "1.15.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.3.tgz",
"integrity": "sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==",
"dev": true
},
"process-nextick-args": {
@@ -2239,24 +2286,92 @@
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
},
"resolve": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
"integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",
"integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==",
"dev": true,
"requires": {
"path-parse": "^1.0.5"
"path-parse": "^1.0.6"
}
},
"resolve-dependencies": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/resolve-dependencies/-/resolve-dependencies-2.1.1.tgz",
"integrity": "sha512-Qmd1eEp9CmAZZx1e3scW2Cof0kauO3Y6jKMoZIm8RN/BWwkfhUdfLV+qpb7+ONITVmqWFUdHb6r62HSlmAMv5Q==",
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/resolve-dependencies/-/resolve-dependencies-2.2.1.tgz",
"integrity": "sha512-nZkQEcXmJG5C3oDkbILK3fdFyhtwdV+67OD+0sUKLZU+ZJ/ozWsCe7Hyq0bqmhvmtnBgtmOO91OfiqCv6bu+GA==",
"requires": {
"@calebboyd/semaphore": "^1.3.1",
"cherow": "^1.6.8",
"acorn": "^6.0.4",
"enhanced-resolve": "^4.1.0",
"globby": "^8.0.1",
"globby": "git://github.com/nexe/globby.git#de057b69c2bca74391bfd913ed0145ce4e42563a",
"pify": "^4.0.0"
},
"dependencies": {
"@nodelib/fs.stat": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
},
"dir-glob": {
"version": "git://github.com/nexe/dir-glob.git#84f4381fe041b6afd425e8d5c14c33809430d8f1",
"from": "git://github.com/nexe/dir-glob.git#84f4381fe041b6afd425e8d5c14c33809430d8f1",
"requires": {
"path-type": "^3.0.0"
}
},
"fast-glob": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.4.tgz",
"integrity": "sha512-FjK2nCGI/McyzgNtTESqaWP3trPvHyRyoyY70hxjc3oKPNmDe8taohLZpoVKoUjW85tbU5txaYUZCNtVzygl1g==",
"requires": {
"@mrmlnc/readdir-enhanced": "^2.2.1",
"@nodelib/fs.stat": "^1.1.2",
"glob-parent": "^3.1.0",
"is-glob": "^4.0.0",
"merge2": "^1.2.3",
"micromatch": "^3.1.10"
}
},
"glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"globby": {
"version": "git://github.com/nexe/globby.git#de057b69c2bca74391bfd913ed0145ce4e42563a",
"from": "git://github.com/nexe/globby.git#de057b69c2bca74391bfd913ed0145ce4e42563a",
"requires": {
"array-union": "^1.0.2",
"dir-glob": "git://github.com/nexe/dir-glob.git#84f4381fe041b6afd425e8d5c14c33809430d8f1",
"fast-glob": "^2.2.3",
"glob": "^7.1.3",
"ignore": "^4.0.3",
"pify": "^4.0.1",
"slash": "^2.0.0"
}
},
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
},
"merge2": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz",
"integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA=="
},
"slash": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
"integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
}
}
},
"resolve-url": {
@@ -2619,15 +2734,10 @@
"has-flag": "^3.0.0"
}
},
"symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
},
"tapable": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz",
"integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg=="
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz",
"integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA=="
},
"tar-stream": {
"version": "1.6.1",
@@ -2732,9 +2842,9 @@
"dev": true
},
"tslint": {
"version": "5.11.0",
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz",
"integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=",
"version": "5.12.0",
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz",
"integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==",
"dev": true,
"requires": {
"babel-code-frame": "^6.22.0",
@@ -2752,18 +2862,19 @@
}
},
"tslint-config-prettier": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.15.0.tgz",
"integrity": "sha512-06CgrHJxJmNYVgsmeMoa1KXzQRoOdvfkqnJth6XUkNeOz707qxN0WfxfhYwhL5kXHHbYJRby2bqAPKwThlZPhw==",
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz",
"integrity": "sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw==",
"dev": true
},
"tslint-plugin-prettier": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-2.0.0.tgz",
"integrity": "sha512-nA8yM+1tS9dylirSajTxxFV6jCQrIMQ0Ykl//jjRgqmwwmGp3hqodG+rtr16S/OUwyQBfoFScFDK7nuHYPd4Gw==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-2.0.1.tgz",
"integrity": "sha512-4FX9JIx/1rKHIPJNfMb+ooX1gPk5Vg3vNi7+dyFYpLO+O57F4g+b/fo1+W/G0SUOkBLHB/YKScxjX/P+7ZT/Tw==",
"dev": true,
"requires": {
"eslint-plugin-prettier": "^2.2.0",
"lines-and-columns": "^1.1.6",
"tslib": "^1.7.1"
}
},
@@ -2791,9 +2902,9 @@
"dev": true
},
"typescript": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.3.tgz",
"integrity": "sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg==",
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz",
"integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==",
"dev": true
},
"uglify-es": {
+14 -13
View File
@@ -2,7 +2,7 @@
"name": "nexe",
"description": "Create a single executable out of your Node.js application",
"license": "MIT",
"version": "3.0.0-beta.0",
"version": "3.0.0-beta.15",
"contributors": [
"Craig Condon <craig.j.condon@gmail.com> (http://crcn.io)",
"Jared Allard <jaredallard@outlook.com>",
@@ -37,23 +37,24 @@
"app-builder": "^5.2.0",
"caw": "^2.0.1",
"chalk": "^2.4.1",
"cherow": "^1.6.8",
"cherow": "1.6.8",
"download": "^7.1.0",
"globby": "^8.0.1",
"got": "^9.2.2",
"got": "^9.5.0",
"minimist": "^1.2.0",
"mkdirp": "^0.5.1",
"multistream": "^2.1.1",
"ora": "^3.0.0",
"pify": "^4.0.0",
"resolve-dependencies": "^2.1.1",
"pify": "^4.0.1",
"resolve-dependencies": "^2.2.1",
"rimraf": "^2.6.2"
},
"devDependencies": {
"@types/chai": "^4.1.5",
"@types/chai": "^4.1.7",
"@types/download": "^6.2.4",
"@types/execa": "^0.9.0",
"@types/globby": "^8.0.0",
"@types/got": "^8.3.4",
"@types/got": "^9.2.2",
"@types/minimist": "^1.2.0",
"@types/mkdirp": "^0.5.2",
"@types/mocha": "^5.2.5",
@@ -62,14 +63,14 @@
"@types/pify": "3.0.2",
"@types/rimraf": "2.0.2",
"@types/semver": "^5.5.0",
"chai": "^4.1.2",
"chai": "^4.2.0",
"execa": "^1.0.0",
"mocha": "^5.2.0",
"prettier": "^1.14.3",
"prettier": "^1.15.3",
"ts-node": "^7.0.1",
"tslint": "^5.11.0",
"tslint-config-prettier": "^1.15.0",
"tslint-plugin-prettier": "^2.0.0",
"typescript": "^3.0.3"
"tslint": "^5.12.0",
"tslint-config-prettier": "^1.17.0",
"tslint-plugin-prettier": "^2.0.1",
"typescript": "^3.2.2"
}
}
+102 -19
View File
@@ -1,10 +1,18 @@
import { delimiter, dirname, normalize, join } from 'path'
import { Buffer } from 'buffer'
import { createReadStream } from 'fs'
import { Readable, Stream } from 'stream'
import { createReadStream, ReadStream } from 'fs'
import { spawn } from 'child_process'
import { Logger, LogStep } from './logger'
import { readFileAsync, writeFileAsync, pathExistsAsync, dequote, isWindows, bound } from './util'
import {
readFileAsync,
writeFileAsync,
pathExistsAsync,
statAsync,
dequote,
isWindows,
bound,
semverGt
} from './util'
import { NexeOptions, version } from './options'
import { NexeTarget } from './target'
import download = require('download')
@@ -17,6 +25,8 @@ const isBsd = Boolean(~process.platform.indexOf('bsd'))
const make = isWindows ? 'vcbuild.bat' : isBsd ? 'gmake' : 'make'
const configure = isWindows ? 'configure' : './configure'
type StringReplacer = (match: string) => string
export interface NexeFile {
filename: string
absPath: string
@@ -25,28 +35,79 @@ export interface NexeFile {
export { NexeOptions }
export class NexeError extends Error {
constructor(m: string) {
super(m)
Object.setPrototypeOf(this, NexeError.prototype)
}
}
export class NexeCompiler {
/**
* Epoch of when compilation started
*/
private start = Date.now()
private env = { ...process.env }
private bundle: Bundle
private compileStep: LogStep | undefined
public log = new Logger(this.options.loglevel)
/**
* Copy of process.env
*/
public env = { ...process.env }
/**
* Virtual FileSystem
*/
public bundle: Bundle
/**
* Root directory for the source of the current build
*/
public src: string
/**
* In memory files that are being manipulated by the compiler
*/
public files: NexeFile[] = []
/**
* Standalone pieces of code run before the application entrypoint
*/
public shims: string[] = []
/**
* The last shim (defaults to "require('module').runMain()")
*/
public startup: string = ''
/**
* The main entrypoint filename for your application - eg. node mainFile.js
*/
public entrypoint: string | undefined
public bundledInput?: string
/**
* Not used
*/
public targets: NexeTarget[]
/**
* Current target of the compiler
*/
public target: NexeTarget
/**
* Output filename (-o myapp.exe)
*/
public output = this.options.output
private nodeSrcBinPath: string
/**
* Flag to indicate whether or notstdin was used for input
*/
public stdinUsed = false
/**
* Path to the configure script
*/
public configureScript: string
/**
* The file path of node binary
*/
public nodeSrcBinPath: string
constructor(public options: NexeOptions) {
const { python } = (this.options = options)
this.targets = options.targets as NexeTarget[]
this.target = this.targets[0]
this.src = join(this.options.temp, this.target.version)
this.configureScript = configure + (semverGt(this.target.version, '10.10.0') ? '.py' : '')
this.nodeSrcBinPath = isWindows
? join(this.src, 'Release', 'node.exe')
: join(this.src, 'out', 'Release', 'node')
@@ -105,9 +166,9 @@ export class NexeCompiler {
}
@bound
async replaceInFileAsync(file: string, replace: string | RegExp, value: string) {
async replaceInFileAsync(file: string, replace: string | RegExp, value: string | StringReplacer) {
const entry = await this.readFileAsync(file)
entry.contents = entry.contents.replace(replace, value)
entry.contents = entry.contents.replace(replace, value as any)
}
@bound
@@ -116,15 +177,15 @@ export class NexeCompiler {
entry.contents = contents
}
quit() {
quit(error?: any) {
const time = Date.now() - this.start
this.log.write(`Finished in ${time / 1000}s`)
this.log.write(`Finished in ${time / 1000}s`, error ? 'red' : 'green')
return this.log.flush()
}
assertBuild() {
if (!this.options.build) {
throw new Error('This feature is only available with `--build`')
throw new NexeError('This feature is only available with `--build`')
}
}
@@ -157,7 +218,7 @@ export class NexeCompiler {
}
if (code != 0) {
const error = `${command} ${args.join(' ')} exited with code: ${code}`
reject(new Error(error))
reject(new NexeError(error))
}
resolve()
})
@@ -166,12 +227,12 @@ export class NexeCompiler {
private _configureAsync() {
return this._runBuildCommandAsync(this.env.PYTHON || 'python', [
configure,
this.configureScript,
...this.options.configure
])
}
private async _buildAsync() {
public async build(): Promise<ReadStream> {
this.compileStep!.log(
`Configuring node build${
this.options.configure.length ? ': ' + this.options.configure : '...'
@@ -201,7 +262,7 @@ export class NexeCompiler {
const asset = githubRelease.assets.find(x => x.name === assetName)
if (!asset) {
throw new Error(`${assetName} not available, create it using the --build flag`)
throw new NexeError(`${assetName} not available, create it using the --build flag`)
}
const filename = this.getNodeExecutableLocation(target)
@@ -219,6 +280,28 @@ export class NexeCompiler {
return createReadStream(filename)
}
private async _shouldCompileBinaryAsync(
binary: NodeJS.ReadableStream | null,
location: string | undefined
) {
//TODO combine make/configure/vcBuild/and modified times of included files
const { snapshot, build } = this.options
if (!binary) {
return true
}
if (build && snapshot != null && (await pathExistsAsync(snapshot))) {
const snapshotLastModified = (await statAsync(snapshot)).mtimeMs
const binaryLastModified = (await statAsync(location)).mtimeMs
// if build was requested and there's a snapshot to embed in the binary,
// we need to rebuild if the snapshot was just modified.
return snapshotLastModified > binaryLastModified
}
return false
}
async compileAsync(target: NexeTarget) {
const step = (this.compileStep = this.log.step('Compiling result'))
const build = this.options.build
@@ -228,11 +311,11 @@ export class NexeCompiler {
step.modify('Fetching prebuilt binary')
binary = await this._fetchPrebuiltBinaryAsync(target)
}
if (!binary) {
binary = await this._buildAsync()
if (await this._shouldCompileBinaryAsync(binary, location)) {
binary = await this.build()
step.log('Node binary compiled')
}
return this._assembleDeliverable(binary)
return this._assembleDeliverable(binary!)
}
code() {
+18 -13
View File
@@ -1,15 +1,20 @@
const __nexe_patches = (process.nexe = { patches: {} }).patches
function __nexe_noop_patch(original, ...args) {
return original.call(this, ...args)
}
function __nexe_patch(obj, method, patch) {
const original = obj[method]
if (!original) return
__nexe_patches[method] = patch
obj[method] = function( ...args) {
return __nexe_patches[method].call(this, original, ...args)
if (true) {
const __nexe_patches = (process.nexe = { patches: {} }).patches
const slice = [].slice
const __nexe_noop_patch = function (original) {
const args = slice.call(arguments, 1)
return original.apply(this, args)
}
const __nexe_patch = function (obj, method, patch) {
const original = obj[method]
if (!original) return
__nexe_patches[method] = patch
obj[method] = function() {
const args = [original].concat(slice.call(arguments))
return __nexe_patches[method].apply(this, args)
}
}
__nexe_patch((process).binding('fs'), 'internalModuleReadFile', __nexe_noop_patch)
__nexe_patch((process).binding('fs'), 'internalModuleReadJSON', __nexe_noop_patch)
__nexe_patch((process).binding('fs'), 'internalModuleStat', __nexe_noop_patch)
}
__nexe_patch((process).binding('fs'), 'internalModuleReadFile', __nexe_noop_patch)
__nexe_patch((process).binding('fs'), 'internalModuleReadJSON', __nexe_noop_patch)
__nexe_patch((process).binding('fs'), 'internalModuleStat', __nexe_noop_patch)
+1 -1
View File
@@ -42,7 +42,7 @@ export class Bundle {
async addResource(absoluteFileName: string, content?: Buffer | string) {
let length = 0
if (content) {
if (content !== undefined) {
length = Buffer.byteLength(content)
} else {
const stats = await stat(absoluteFileName)
+37 -37
View File
@@ -34,6 +34,8 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
const { blobPath, resources: manifest } = binary
const { resourceStart, stat } = binary.layout
const directories: { [key: string]: { [key: string]: boolean } } = {},
notAFile = '!@#$%^&*',
isWin = process.platform.startsWith('win'),
isString = (x: any): x is string => typeof x === 'string' || x instanceof String,
isNotFile = () => false,
isNotDirectory = isNotFile,
@@ -42,23 +44,25 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
isDirectory = isFile,
path = require('path')
let log = (text: string) => {
if ((process.env.DEBUG || '').toLowerCase().includes('nexe:require')) {
process.stderr.write('[nexe] - ' + text + '\n')
} else {
log = noop
}
let log = (text: string) => true
if ((process.env.DEBUG || '').toLowerCase().includes('nexe:require')) {
log = (text: string) => process.stderr.write('[nexe] - ' + text + '\n')
}
const getKey = process.platform.startsWith('win')
? function getKey(filepath: string): string {
let key = path.resolve(filepath)
if (key.substr(1, 2) === ':\\') {
key = key[0].toUpperCase() + key.substr(1)
}
return key
}
: path.resolve
const getKey = function getKey(filepath: string | Buffer | null): string {
if (Buffer.isBuffer(filepath)) {
filepath = filepath.toString()
}
if (!isString(filepath)) {
return notAFile
}
let key = path.resolve(filepath)
if (isWin && key.substr(1, 2) === ':\\') {
key = key[0].toUpperCase() + key.substr(1)
}
return key
}
const statTime = function() {
return {
@@ -89,7 +93,7 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
return Object.assign({}, binary.layout.stat, fileExtensions, { size }, statTime())
}
const ownStat = function(filepath: string) {
const ownStat = function(filepath: any) {
setupManifest()
const key = getKey(filepath)
if (directories[key]) {
@@ -139,6 +143,8 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
currentDir = path.dirname(currentDir)
}
})
;(manifest[notAFile] as any) = false
;(directories[notAFile] as any) = false
setupManifest = noop
}
@@ -163,32 +169,26 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
realpathSync: function realpathSync(filepath: any, options: any) {
setupManifest()
const key = getKey(filepath)
if (isString(filepath) && (manifest[filepath] || manifest[key])) {
if (manifest[key]) {
return filepath
}
return originalFsMethods.realpathSync.call(fs, filepath, options)
},
readdir: function readdir(filepath: string | Buffer, options: any, callback: any) {
setupManifest()
filepath = filepath.toString()
if ('function' === typeof options) {
callback = options
options = { encoding: 'utf8' }
}
const dir = directories[getKey(filepath)]
if (dir) {
process.nextTick(() => {
//todo merge with original?
callback(null, Object.keys(dir))
})
if ('function' === typeof options) {
callback = options
options = { encoding: 'utf8' }
}
process.nextTick(() => callback(null, Object.keys(dir)))
} else {
return originalFsMethods.readdir.apply(fs, arguments)
}
},
readdirSync: function readdirSync(filepath: string | Buffer, options: any) {
setupManifest()
filepath = filepath.toString()
const dir = directories[getKey(filepath)]
if (dir) {
return Object.keys(dir)
@@ -198,8 +198,8 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
readFile: function readFile(filepath: any, options: any, callback: any) {
setupManifest()
const entry = manifest[filepath] || manifest[getKey(filepath)]
if (!entry || !isString(filepath)) {
const entry = manifest[getKey(filepath)]
if (!entry) {
return originalFsMethods.readFile.apply(fs, arguments)
}
const [offset, length] = entry
@@ -230,8 +230,8 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
},
createReadStream: function createReadStream(filepath: any, options: any) {
setupManifest()
const entry = manifest[filepath] || manifest[getKey(filepath)]
if (!entry || !isString(filepath)) {
const entry = manifest[getKey(filepath)]
if (!entry) {
return originalFsMethods.createReadStream.apply(fs, arguments)
}
const [offset, length] = entry
@@ -248,9 +248,8 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
},
readFileSync: function readFileSync(filepath: any, options: any) {
setupManifest()
const entry = manifest[filepath] || manifest[getKey(filepath)]
if (!entry || !isString(filepath)) {
const entry = manifest[getKey(filepath)]
if (!entry) {
return originalFsMethods.readFileSync.apply(fs, arguments)
}
const [offset, length] = entry
@@ -263,14 +262,14 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
return encoding ? result.toString(encoding) : result
},
statSync: function statSync(filepath: string | Buffer) {
const stat = isString(filepath) && ownStat(filepath)
const stat = ownStat(filepath)
if (stat) {
return stat
}
return originalFsMethods.statSync.apply(fs, arguments)
},
stat: function stat(filepath: string | Buffer, callback: any) {
const stat = isString(filepath) && ownStat(filepath)
const stat = ownStat(filepath)
if (stat) {
process.nextTick(() => {
callback(null, stat)
@@ -301,6 +300,7 @@ function shimFs(binary: NexeBinary, fs: any = require('fs')) {
log('read (miss) ' + filepath)
return original.call(this, ...args)
}
patches.internalModuleReadJSON = patches.internalModuleReadFile
patches.internalModuleStat = function(this: any, original: any, ...args: any[]) {
setupManifest()
const [filepath] = args
+16 -19
View File
@@ -1,6 +1,6 @@
import { EOL } from 'os'
import { compose } from 'app-builder'
import { NexeCompiler } from './compiler'
import { NexeCompiler, NexeError } from './compiler'
import { normalizeOptions, NexeOptions, NexePatch } from './options'
import resource from './steps/resource'
import clean from './steps/clean'
@@ -15,31 +15,28 @@ async function compile(
compilerOptions?: Partial<NexeOptions>,
callback?: (err: Error | null) => void
) {
const options = normalizeOptions(compilerOptions)
const compiler = new NexeCompiler(options)
let error = null,
options: NexeOptions | null = null,
compiler: NexeCompiler | null = null
const nexe = compose(
clean,
resource,
cli,
bundle,
shim,
options.build ? [download, artifacts, ...patches, ...(options.patches as NexePatch[])] : [],
options.plugins as NexePatch[]
)
let error = null
try {
await nexe(compiler)
options = normalizeOptions(compilerOptions)
compiler = new NexeCompiler(options)
await compose(
clean,
resource,
cli,
bundle,
shim,
options.build ? [download, artifacts, ...patches, ...(options.patches as NexePatch[])] : [],
options.plugins as NexePatch[]
)(compiler)
} catch (e) {
error = e
}
if (error) {
if (compiler.options.loglevel !== 'silent' && error) {
process.stderr.write(EOL + error.message + EOL)
}
compiler.quit()
compiler && compiler.quit(error)
if (callback) return callback(error)
return Promise.reject(error)
}
+19 -14
View File
@@ -1,6 +1,6 @@
import * as parseArgv from 'minimist'
import { NexeCompiler } from './compiler'
import { isWindows } from './util'
import { NexeCompiler, NexeError } from './compiler'
import { isWindows, STDIN_FLAG } from './util'
import { basename, extname, join, isAbsolute, resolve } from 'path'
import { getTarget, NexeTarget } from './target'
import { EOL, homedir } from 'os'
@@ -194,11 +194,16 @@ function isEntryFile(filename?: string): filename is string {
return Boolean(filename && !isAbsolute(filename))
}
export function resolveEntry(input: string, cwd: string, maybeEntry?: string) {
if (input === '-' || maybeEntry === '-') {
return ''
}
export function resolveEntry(
input: string,
cwd: string,
maybeEntry: string | undefined,
bundle: boolean | string
) {
let result = null
if (input === '-' || maybeEntry === '-') {
return STDIN_FLAG
}
if (input && isAbsolute(input)) {
return input
}
@@ -206,19 +211,19 @@ export function resolveEntry(input: string, cwd: string, maybeEntry?: string) {
const inputPath = padRelative(input)
result = resolveFileNameSync(cwd, inputPath)
}
if (isEntryFile(maybeEntry) && (!result || !result.absPath)) {
const inputPath = padRelative(maybeEntry)
result = resolveFileNameSync(cwd, inputPath)
}
if (!process.stdin.isTTY) {
return ''
if (!process.stdin.isTTY && (!result || !result.absPath) && bundle === defaults.bundle) {
return STDIN_FLAG
}
if (!result || !result.absPath) {
result = resolveFileNameSync(cwd, '.')
}
if (!result.absPath) throw new Error(`Entry file "${input}" not found!`)
if (!result.absPath) {
throw new NexeError(`Entry file "${input || ''}" not found!`)
}
return result.absPath
}
@@ -234,8 +239,8 @@ function normalizeOptions(input?: Partial<NexeOptions>): NexeOptions {
? resolve(cwd, options.temp)
: process.env.NEXE_TEMP || join(homedir(), '.nexe')
const maybeEntry = isCli(input) ? argv._[argv._.length - 1] : undefined
options.input = resolveEntry(options.input, cwd, maybeEntry)
options.enableStdIn = isCli(input) && options.input === ''
options.input = resolveEntry(options.input, cwd, maybeEntry, options.bundle)
options.enableStdIn = isCli(input) && options.input === STDIN_FLAG
options.name = extractName(options)
options.loglevel = extractLogLevel(options)
options.flags = flatten(opts.flag, options.flags)
@@ -244,7 +249,7 @@ function normalizeOptions(input?: Partial<NexeOptions>): NexeOptions {
options.targets.push(getTarget())
}
options.ghToken = options.ghToken || process.env.GITHUB_TOKEN || ''
options.make = flatten(options.vcBuild, options.make)
options.make = flatten(isWindows ? options.vcBuild : options.make)
options.configure = flatten(options.configure)
options.resources = flatten(opts.resource, options.resources)
+27 -9
View File
@@ -1,20 +1,38 @@
import { NexeCompiler } from '../compiler'
import { semverGt } from '../util'
export default async function disableNodeCli(compiler: NexeCompiler, next: () => Promise<void>) {
if (compiler.options.enableNodeCli) {
return next()
}
const nodeccMarker = 'argv[index][0] =='
if (semverGt(compiler.target.version, '10.9')) {
await compiler.replaceInFileAsync('src/node.cc', /(?<!void )ProcessArgv\(/g, '//ProcessArgv(')
} else if (semverGt(compiler.target.version, '9.999')) {
await compiler.replaceInFileAsync(
'src/node.cc',
'int i = 1; i < v8_argc; i++',
'int i = v8_argc; i < v8_argc; i++'
)
let matches = 0
await compiler.replaceInFileAsync('src/node.cc', /v8_argc > 1/g, match => {
if (matches++) {
return 'false'
}
return match
})
} else {
const nodeccMarker = 'argv[index][0] =='
await compiler.replaceInFileAsync(
'src/node.cc',
`${nodeccMarker} '-'`,
// allow NODE_OPTIONS, introduced in 8.0
parseInt(compiler.target.version.split('.')[0]) >= 8
? `(${nodeccMarker} (is_env ? '-' : ']'))`
: `(${nodeccMarker} ']')`
)
await compiler.replaceInFileAsync(
'src/node.cc',
`${nodeccMarker} '-'`,
// allow NODE_OPTIONS, introduced in 8.0
semverGt(compiler.target.version, '7.99')
? `(${nodeccMarker} (is_env ? '-' : ']'))`
: `(${nodeccMarker} ']')`
)
}
return next()
}
+2 -1
View File
@@ -5,7 +5,8 @@ import cli from './disable-node-cli'
import flags from './flags'
import ico from './ico'
import rc from './node-rc'
import snapshot from './snapshot'
const patches = [gyp, bootNexe, buildFixes, cli, flags, ico, rc]
const patches = [gyp, bootNexe, buildFixes, cli, flags, ico, rc, snapshot]
export default patches
+9 -7
View File
@@ -1,18 +1,20 @@
import { resolve } from 'path'
import { NexeCompiler } from '../compiler'
export default async function snapshot(compiler: NexeCompiler, next: () => Promise<void>) {
const snapshotFile = compiler.options.snapshot
const warmupScript = compiler.options.warmup
export default async function(compiler: NexeCompiler, next: () => Promise<void>) {
const { snapshot, warmup, cwd } = compiler.options
if (!snapshotFile) {
if (!snapshot) {
return next()
}
await compiler.replaceInFileAsync(
'configure',
compiler.configureScript,
'def configure_v8(o):',
`def configure_v8(o):\n o['variables']['embed_script'] = '${snapshotFile}'\n o['variables']['warmup_script'] = '${warmupScript ||
snapshotFile}'`
`def configure_v8(o):\n o['variables']['embed_script'] = r'${resolve(
cwd,
snapshot
)}'\n o['variables']['warmup_script'] = r'${resolve(cwd, warmup || snapshot)}'`
)
return next()
+1 -11
View File
@@ -1,16 +1,6 @@
import { NexeCompiler } from '../compiler'
import { parse } from 'cherow'
function semverGt(version: string, operand: string) {
const [cMajor, cMinor, cPatch] = version.split('.').map(Number)
const [major, minor, patch] = operand.split('.').map(Number)
return (
cMajor > major ||
(cMajor === major && cMinor > minor) ||
(cMajor === major && cMinor === minor && cPatch > patch)
)
}
import { semverGt } from '../util'
function walkSome(node: any, visit: Function) {
if (!node || typeof node.type !== 'string' || node._visited) {
+3 -3
View File
@@ -25,8 +25,8 @@ async function getJson<T>(url: string, options?: any) {
}
function isBuildableVersion(version: string) {
const major = +version.split('.')[0]
return !~versionsToSkip.indexOf(major) || version === '4.8.4'
const major = Number(version.split('.')[0])
return !versionsToSkip.includes(major) || version === '4.8.4'
}
export function getLatestGitRelease(options?: any) {
@@ -50,7 +50,7 @@ export async function getUnBuiltReleases(options?: any) {
platforms.forEach(platform => {
architectures.forEach(arch => {
if (arch === 'x86' && platform === 'mac') return
if (arch === 'arm7l' && platform !== 'linux') return
if (arch.includes('arm')) return
versions.push(getTarget({ platform, arch, version }))
})
})
+40 -4
View File
@@ -1,20 +1,56 @@
import { NexeCompiler } from '../compiler'
import { resolve } from 'path'
import { NexeCompiler, NexeError } from '../compiler'
import { resolve, relative } from 'path'
import { each } from '@calebboyd/semaphore'
import resolveFiles from 'resolve-dependencies'
import { dequote, STDIN_FLAG } from '../util'
import { Readable } from 'stream'
function getStdIn(stdin: Readable): Promise<string> {
return new Promise(resolve => {
let out = ''
stdin
.setEncoding('utf8')
.on('readable', () => {
let current
while ((current = stdin.read())) {
out += current
}
})
.on('end', () => resolve(out))
})
}
export default async function bundle(compiler: NexeCompiler, next: any) {
const { bundle, cwd, input } = compiler.options
compiler.entrypoint = './' + relative(cwd, input)
compiler.startup = ';require("module").runMain();'
if (!bundle) {
await compiler.addResource(resolve(cwd, input))
return next()
}
if (!input) {
let code = ''
if (typeof bundle === 'string') {
code = await require(bundle).createBundle(compiler.options)
}
if (input === STDIN_FLAG) {
compiler.stdinUsed = true
compiler.entrypoint = './__nexe_stdin.js'
code = code || dequote(await getStdIn(process.stdin))
await compiler.addResource(resolve(cwd, compiler.entrypoint), code)
return next()
}
const { files } = await resolveFiles(input, { cwd, expand: true, loadContent: false })
const { files, warnings } = await resolveFiles(input, { cwd, expand: true, loadContent: false })
if (
warnings.filter(x => x.startsWith('Error parsing file') && !x.includes('node_modules')).length
) {
throw new NexeError('Parsing Error:\n' + warnings.join('\n'))
}
await each(Object.keys(files), (filename: string) => compiler.addResource(filename), {
concurrency: 10
})
+4 -35
View File
@@ -1,24 +1,8 @@
import { normalize, relative, resolve } from 'path'
import { normalize, relative } from 'path'
import { createWriteStream, chmodSync, statSync } from 'fs'
import { dequote } from '../util'
import { Readable } from 'stream'
import { NexeCompiler } from '../compiler'
import { NexeTarget } from '../target'
function getStdIn(stdin: Readable): Promise<string> {
return new Promise(resolve => {
let out = ''
stdin
.setEncoding('utf8')
.on('readable', () => {
let current
while ((current = stdin.read())) {
out += current
}
})
.on('end', () => resolve(out))
})
}
import { STDIN_FLAG } from '../util'
/**
* The "cli" step detects the appropriate input. If no input options are passed,
@@ -26,28 +10,13 @@ function getStdIn(stdin: Readable): Promise<string> {
* After all the build steps have run, the output (the executable) is written to a file or piped to stdout.
*
* Configuration:
* - compiler.options.input - file path to the input bundle.
* - fallbacks: stdin, package.json#main
* - compiler.options.output - file path to the output executable.
* - fallbacks: stdout, nexe_ + epoch + ext
*
* @param {*} compiler
* @param {*} next
*/
export default async function cli(compiler: NexeCompiler, next: () => Promise<void>) {
const { log } = compiler
let stdInUsed = false
if (!process.stdin.isTTY && compiler.options.enableStdIn) {
stdInUsed = true
compiler.entrypoint = './__nexe_stdin.js'
const code = dequote(await getStdIn(process.stdin))
await compiler.addResource(resolve(compiler.options.cwd, compiler.entrypoint), code)
} else {
compiler.entrypoint = './' + relative(compiler.options.cwd, compiler.options.input)
}
compiler.startup = ';require("module").runMain();'
await next()
const { log } = compiler
const target = compiler.options.targets.shift() as NexeTarget
const deliverable = await compiler.compileAsync(target)
@@ -67,7 +36,7 @@ export default async function cli(compiler: NexeCompiler, next: () => Promise<vo
const outputFile = relative(process.cwd(), output)
step.log(
`Entry: '${
stdInUsed ? (compiler.options.mangle ? '[stdin]' : '[none]') : inputFile
compiler.stdinUsed ? (compiler.options.mangle ? STDIN_FLAG : '[none]') : inputFile
}' written to: ${outputFile}`
)
resolve(compiler.quit())
+1 -1
View File
@@ -22,7 +22,7 @@ export default function(compiler: NexeCompiler, next: () => Promise<void>) {
compiler.shims.push(
wrap(`
if (!process.send) {
process.argv.splice(1,0, require.resolve("${compiler.entrypoint}"))
process.argv.splice(1,0, require.resolve(${JSON.stringify(compiler.entrypoint)}))
}
`)
)
+17
View File
@@ -4,6 +4,7 @@ import pify = require('pify')
import rimraf = require('rimraf')
const rimrafAsync = pify(rimraf)
export const STDIN_FLAG = '[stdin]'
export async function each<T>(
list: T[] | Promise<T[]>,
@@ -80,10 +81,26 @@ function isDirectoryAsync(path: string) {
.then(x => x.isDirectory())
.catch(falseOnEnoent)
}
/**
* @param version See if this version is greather than the second one
* @param operand Version to compare against
*/
function semverGt(version: string, operand: string) {
const [cMajor, cMinor, cPatch] = version.split('.').map(Number)
let [major, minor, patch] = operand.split('.').map(Number)
if (!minor) minor = 0
if (!patch) patch = 0
return (
cMajor > major ||
(cMajor === major && cMinor > minor) ||
(cMajor === major && cMinor === minor && cPatch > patch)
)
}
export {
dequote,
padRight,
semverGt,
bound,
isWindows,
rimrafAsync,
+6 -4
View File
@@ -60,7 +60,7 @@ async function build() {
}
console.log('Building: ', target)
const stop = keepalive()
if (['arm7l', 'arm6l', 'arm64', 'alpine'].indexOf(target.platform)) {
if (['arm7l', 'arm6l', 'arm64', 'alpine'].includes(target.platform)) {
await runDockerBuild(target)
} else {
await nexe.compile(options)
@@ -74,10 +74,12 @@ async function build() {
query: { name: target.toString() },
body: await readFileAsync(output),
headers: {
Authorization: 'token ' + env.GITHUB_TOKEN,
'Content-Type': 'application/octet-stream',
'User-Agent': 'nexe (https://www.npmjs.com/package/nexe)'
...headers,
'Content-Type': 'application/octet-stream'
}
}).catch(reason => {
console.log(reason && reason.response && reason.response.body)
throw reason
})
console.log(target + ' uploaded.')
}
+3 -3
View File
@@ -1,6 +1,5 @@
import { NexeTarget, architectures } from '../lib/target'
import { writeFileAsync, readFileAsync } from '../lib/util'
import { spawn } from 'child_process'
import got = require('got')
import execa = require('execa')
import { appendFileSync } from 'fs'
@@ -22,7 +21,7 @@ RUN curl -sSL https://nodejs.org/dist/v\${NODE_VERSION}/node-v\${NODE_VERSION}.t
RUN rm /nexe_temp/\${NODE_VERSION}/out/Release/node && \
npm install -g nexe@\${NEXE_VERSION} && \
nexe --build --empty --temp /nexe_temp -c="--fully-static" -o out
nexe --build --empty --temp /nexe_temp -c="--fully-static" -o out --enableStdIn=false
`.trim()
}
@@ -51,7 +50,8 @@ export async function runDockerBuild(target: NexeTarget) {
output.push(await execa.shell(`docker cp nexe:/out out`))
output.push(await execa.shell(`docker rm nexe`))
} catch (e) {
console.log('Error running docker', e)
console.log('Error running docker')
appendFileSync(outFilename, e.message)
} finally {
output.forEach((x: any) => {
appendFileSync(outFilename, x.stderr)
+1 -1
View File
@@ -3,7 +3,7 @@
"target":"es5",
"skipLibCheck": true,
"experimentalDecorators": true,
"lib": ["es2017"],
"lib": ["es2018"],
"module": "commonjs",
"outDir": "./lib",
"strict": true