@happier-dev/relay-server 0.2.6-dev.1778098335.1 → 0.2.11-preview.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/happier-server.mjs +13 -21
- package/node_modules/@happier-dev/release-runtime/dist/archiveExtraction.d.ts +38 -0
- package/node_modules/@happier-dev/release-runtime/dist/archiveExtraction.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/archiveExtraction.js +1123 -0
- package/node_modules/@happier-dev/release-runtime/dist/archiveExtraction.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/assets.d.ts.map +1 -1
- package/node_modules/@happier-dev/release-runtime/dist/github.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/dist/github.d.ts.map +1 -1
- package/node_modules/@happier-dev/release-runtime/dist/github.js +17 -15
- package/node_modules/@happier-dev/release-runtime/dist/github.js.map +1 -1
- package/node_modules/@happier-dev/release-runtime/dist/index.d.ts +1 -1
- package/node_modules/@happier-dev/release-runtime/dist/index.d.ts.map +1 -1
- package/node_modules/@happier-dev/release-runtime/dist/index.js +1 -1
- package/node_modules/@happier-dev/release-runtime/dist/index.js.map +1 -1
- package/node_modules/@happier-dev/release-runtime/dist/releaseRings.d.ts +3 -2
- package/node_modules/@happier-dev/release-runtime/dist/releaseRings.d.ts.map +1 -1
- package/node_modules/@happier-dev/release-runtime/dist/releaseRings.js +5 -0
- package/node_modules/@happier-dev/release-runtime/dist/releaseRings.js.map +1 -1
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/LICENSE.md +55 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/README.md +1233 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/create.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/create.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/create.js +82 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/create.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/cwd-error.d.ts +8 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/cwd-error.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/cwd-error.js +18 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/cwd-error.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/extract.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/extract.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/extract.js +88 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/extract.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/get-write-flag.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/get-write-flag.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/get-write-flag.js +32 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/get-write-flag.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/header.d.ts +53 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/header.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/header.js +348 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/header.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/index.d.ts +20 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/index.js +64 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/index.min.js +4 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/index.min.js.map +7 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/large-numbers.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/large-numbers.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/large-numbers.js +99 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/large-numbers.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/list.d.ts +7 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/list.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/list.js +153 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/list.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/make-command.d.ts +49 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/make-command.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/make-command.js +52 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/make-command.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/mkdir.d.ts +25 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/mkdir.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/mkdir.js +187 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/mkdir.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/mode-fix.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/mode-fix.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/mode-fix.js +29 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/mode-fix.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/normalize-unicode.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/normalize-unicode.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/normalize-unicode.js +38 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/normalize-unicode.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/normalize-windows-path.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/normalize-windows-path.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/normalize-windows-path.js +12 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/normalize-windows-path.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/options.d.ts +604 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/options.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/options.js +66 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/options.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/pack.d.ts +105 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/pack.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/pack.js +544 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/pack.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/parse.d.ts +92 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/parse.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/parse.js +655 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/parse.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/path-reservations.d.ts +11 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/path-reservations.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/path-reservations.js +170 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/path-reservations.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/pax.d.ts +26 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/pax.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/pax.js +182 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/pax.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/process-umask.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/process-umask.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/process-umask.js +7 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/process-umask.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/read-entry.d.ts +36 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/read-entry.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/read-entry.js +136 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/read-entry.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/replace.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/replace.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/replace.js +227 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/replace.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/strip-absolute-path.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/strip-absolute-path.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/strip-absolute-path.js +29 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/strip-absolute-path.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/strip-trailing-slashes.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/strip-trailing-slashes.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/strip-trailing-slashes.js +18 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/strip-trailing-slashes.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/symlink-error.d.ts +9 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/symlink-error.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/symlink-error.js +19 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/symlink-error.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/types.d.ts +16 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/types.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/types.js +70 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/types.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/unpack.d.ts +101 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/unpack.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/unpack.js +932 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/unpack.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/update.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/update.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/update.js +33 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/update.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/warn-method.d.ts +24 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/warn-method.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/warn-method.js +31 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/warn-method.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/winchars.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/winchars.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/winchars.js +14 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/winchars.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/write-entry.d.ts +129 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/write-entry.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/write-entry.js +698 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/commonjs/write-entry.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/create.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/create.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/create.js +76 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/create.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/cwd-error.d.ts +8 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/cwd-error.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/cwd-error.js +14 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/cwd-error.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/extract.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/extract.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/extract.js +49 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/extract.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/get-write-flag.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/get-write-flag.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/get-write-flag.js +26 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/get-write-flag.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/header.d.ts +53 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/header.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/header.js +311 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/header.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/index.d.ts +20 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/index.js +20 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/index.min.js +4 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/index.min.js.map +7 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/large-numbers.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/large-numbers.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/large-numbers.js +94 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/large-numbers.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/list.d.ts +7 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/list.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/list.js +113 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/list.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/make-command.d.ts +49 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/make-command.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/make-command.js +48 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/make-command.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/mkdir.d.ts +25 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/mkdir.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/mkdir.js +179 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/mkdir.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/mode-fix.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/mode-fix.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/mode-fix.js +25 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/mode-fix.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/normalize-unicode.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/normalize-unicode.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/normalize-unicode.js +34 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/normalize-unicode.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/normalize-windows-path.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/normalize-windows-path.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/normalize-windows-path.js +9 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/normalize-windows-path.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/options.d.ts +604 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/options.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/options.js +54 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/options.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/pack.d.ts +105 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/pack.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/pack.js +502 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/pack.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/parse.d.ts +92 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/parse.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/parse.js +651 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/parse.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/path-reservations.d.ts +11 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/path-reservations.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/path-reservations.js +166 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/path-reservations.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/pax.d.ts +26 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/pax.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/pax.js +178 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/pax.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/process-umask.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/process-umask.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/process-umask.js +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/process-umask.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/read-entry.d.ts +36 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/read-entry.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/read-entry.js +132 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/read-entry.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/replace.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/replace.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/replace.js +221 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/replace.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/strip-absolute-path.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/strip-absolute-path.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/strip-absolute-path.js +25 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/strip-absolute-path.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/strip-trailing-slashes.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/strip-trailing-slashes.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/strip-trailing-slashes.js +14 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/strip-trailing-slashes.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/symlink-error.d.ts +9 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/symlink-error.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/symlink-error.js +15 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/symlink-error.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/types.d.ts +16 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/types.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/types.js +65 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/types.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/unpack.d.ts +101 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/unpack.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/unpack.js +891 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/unpack.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/update.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/update.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/update.js +30 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/update.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/warn-method.d.ts +24 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/warn-method.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/warn-method.js +27 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/warn-method.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/winchars.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/winchars.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/winchars.js +9 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/winchars.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/write-entry.d.ts +129 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/write-entry.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/write-entry.js +656 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/dist/esm/write-entry.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/LICENSE +15 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/README.md +71 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/commonjs/index.d.ts +118 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js +430 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/commonjs/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/esm/index.d.ts +118 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/esm/index.js +420 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/esm/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/dist/esm/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/LICENSE +15 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/README.md +825 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/commonjs/index.d.ts +549 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/commonjs/index.js +1028 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/commonjs/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/commonjs/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/esm/index.d.ts +549 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/esm/index.js +1018 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/esm/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/dist/esm/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/node_modules/minipass/package.json +82 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/@isaacs/fs-minipass/package.json +72 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/LICENSE.md +63 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/README.md +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/commonjs/index.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/commonjs/index.js +93 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/commonjs/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/commonjs/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/esm/index.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/esm/index.js +85 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/esm/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/dist/esm/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/chownr/package.json +69 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/LICENSE +15 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/README.md +825 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/commonjs/index.d.ts +549 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/commonjs/index.js +1028 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/commonjs/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/commonjs/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/esm/index.d.ts +549 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/esm/index.js +1018 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/esm/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/dist/esm/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minipass/package.json +82 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/LICENSE +26 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/README.md +64 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/constants.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/constants.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/constants.js +123 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/constants.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/index.d.ts +99 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/index.js +416 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/commonjs/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/constants.d.ts +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/constants.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/constants.js +117 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/constants.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/index.d.ts +99 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/index.js +363 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/dist/esm/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/LICENSE +15 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/README.md +825 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/commonjs/index.d.ts +549 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/commonjs/index.js +1028 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/commonjs/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/commonjs/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/esm/index.d.ts +549 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/esm/index.js +1018 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/esm/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/dist/esm/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/node_modules/minipass/package.json +82 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/minizlib/package.json +80 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/LICENSE.md +63 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/README.md +205 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/commonjs/index.d.ts +39 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/commonjs/index.js +384 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/commonjs/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/commonjs/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/esm/index.d.ts +39 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/esm/index.js +379 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/esm/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/dist/esm/package.json +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/node_modules/yallist/package.json +68 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/tar/package.json +298 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/xz-decompress/README.md +72 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/xz-decompress/dist/package/xz-decompress.js +273 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/xz-decompress/dist/package/xz-decompress.min.js +6 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/xz-decompress/package.json +55 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/xz-decompress/types.d.ts +3 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/LICENSE +21 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/README.md +658 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/index.js +796 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/buffer-crc32/LICENSE +19 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/buffer-crc32/README.md +47 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/buffer-crc32/index.js +111 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/buffer-crc32/package.json +39 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/.npmignore +2 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/.travis.yml +7 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/CHANGELOG.md +49 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/LICENSE +21 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/README.md +199 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/index.js +296 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/node_modules/pend/LICENSE +23 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/node_modules/pend/README.md +41 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/node_modules/pend/index.js +55 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/node_modules/pend/package.json +18 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/node_modules/pend/test.js +137 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/package.json +36 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/node_modules/fd-slicer/test/test.js +350 -0
- package/node_modules/@happier-dev/release-runtime/node_modules/yauzl/package.json +40 -0
- package/node_modules/@happier-dev/release-runtime/package.json +8 -3
- package/node_modules/@happier-dev/release-runtime/releaseRings.cjs +204 -0
- package/package.json +1 -1
- package/src/archiveCache.mjs +25 -0
- package/src/archiveCache.test.mjs +82 -0
- package/src/runnerConfig.mjs +1 -1
- package/src/runnerConfig.test.mjs +3 -3
- package/node_modules/@happier-dev/release-runtime/dist/.tsbuildinfo +0 -1
- package/node_modules/@happier-dev/release-runtime/dist/_cjs/releaseRings.js +0 -134
- package/node_modules/@happier-dev/release-runtime/dist/extractPlan.d.ts +0 -14
- package/node_modules/@happier-dev/release-runtime/dist/extractPlan.d.ts.map +0 -1
- package/node_modules/@happier-dev/release-runtime/dist/extractPlan.js +0 -48
- package/node_modules/@happier-dev/release-runtime/dist/extractPlan.js.map +0 -1
- package/node_modules/@happier-dev/release-runtime/dist/releaseRings.cjs +0 -134
|
@@ -0,0 +1,1123 @@
|
|
|
1
|
+
import { constants, createWriteStream } from 'node:fs';
|
|
2
|
+
import { lstat, mkdir, mkdtemp, open, readdir, rename, rm, rmdir } from 'node:fs/promises';
|
|
3
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { Readable, Transform } from 'node:stream';
|
|
5
|
+
import { pipeline } from 'node:stream/promises';
|
|
6
|
+
import { createInflateRaw } from 'node:zlib';
|
|
7
|
+
import * as tar from 'tar';
|
|
8
|
+
import * as yauzl from 'yauzl';
|
|
9
|
+
const WINDOWS_INVALID_PATH_CHARACTER = /[\u0000-\u001f<>:"|?*]/u;
|
|
10
|
+
const WINDOWS_RESERVED_PATH_SEGMENT = /^(?:con|prn|aux|nul|com[1-9¹²³]|lpt[1-9¹²³])(?:\.|$)/iu;
|
|
11
|
+
const MAX_TAR_METADATA_ENTRY_BYTES = 1024 * 1024;
|
|
12
|
+
export const DEFAULT_ARCHIVE_EXTRACTION_LIMITS = Object.freeze({
|
|
13
|
+
maxArchiveBytes: 512 * 1024 * 1024,
|
|
14
|
+
maxEntries: 20_000,
|
|
15
|
+
maxFiles: 10_000,
|
|
16
|
+
maxFileBytes: 256 * 1024 * 1024,
|
|
17
|
+
maxExpandedBytes: 1024 * 1024 * 1024,
|
|
18
|
+
maxCompressionRatio: 100,
|
|
19
|
+
timeoutMs: 120_000,
|
|
20
|
+
});
|
|
21
|
+
// Happier's checksum-verified release payloads intentionally include their bundled
|
|
22
|
+
// runtime dependency trees. Keep generic/provider archives on the stricter default
|
|
23
|
+
// while giving those first-party artifacts bounds calibrated from shipped payloads.
|
|
24
|
+
export const FIRST_PARTY_RELEASE_ARCHIVE_EXTRACTION_LIMITS = Object.freeze({
|
|
25
|
+
...DEFAULT_ARCHIVE_EXTRACTION_LIMITS,
|
|
26
|
+
maxArchiveBytes: 1024 * 1024 * 1024,
|
|
27
|
+
maxEntries: 250_000,
|
|
28
|
+
maxFiles: 100_000,
|
|
29
|
+
maxExpandedBytes: 4 * 1024 * 1024 * 1024,
|
|
30
|
+
timeoutMs: 10 * 60_000,
|
|
31
|
+
});
|
|
32
|
+
function mergeArchiveExtractionLimits(overrides) {
|
|
33
|
+
const limits = { ...DEFAULT_ARCHIVE_EXTRACTION_LIMITS, ...overrides };
|
|
34
|
+
for (const [name, value] of Object.entries(limits)) {
|
|
35
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
36
|
+
throw new Error(`[release-runtime] archive limit ${name} must be a non-negative finite number`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return limits;
|
|
40
|
+
}
|
|
41
|
+
function createOpenArchiveRangeStream(archiveFile, start, endExclusive) {
|
|
42
|
+
async function* readRange() {
|
|
43
|
+
let position = start;
|
|
44
|
+
while (position < endExclusive) {
|
|
45
|
+
const buffer = Buffer.allocUnsafe(Math.min(64 * 1024, endExclusive - position));
|
|
46
|
+
const { bytesRead } = await archiveFile.read(buffer, 0, buffer.byteLength, position);
|
|
47
|
+
if (bytesRead === 0) {
|
|
48
|
+
throw new Error('[release-runtime] archive source was truncated during extraction');
|
|
49
|
+
}
|
|
50
|
+
position += bytesRead;
|
|
51
|
+
yield bytesRead === buffer.byteLength ? buffer : buffer.subarray(0, bytesRead);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return Readable.from(readRange());
|
|
55
|
+
}
|
|
56
|
+
function createArchiveBudget(params) {
|
|
57
|
+
let entryCount = 0;
|
|
58
|
+
let fileCount = 0;
|
|
59
|
+
let expandedBytes = 0;
|
|
60
|
+
return {
|
|
61
|
+
account: (kind, byteLength) => {
|
|
62
|
+
entryCount += 1;
|
|
63
|
+
if (entryCount > params.limits.maxEntries) {
|
|
64
|
+
throw new Error('[release-runtime] archive contains too many entries');
|
|
65
|
+
}
|
|
66
|
+
if (kind === 'directory')
|
|
67
|
+
return;
|
|
68
|
+
if (kind === 'file') {
|
|
69
|
+
fileCount += 1;
|
|
70
|
+
if (fileCount > params.limits.maxFiles) {
|
|
71
|
+
throw new Error('[release-runtime] archive contains too many files');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!Number.isSafeInteger(byteLength) || byteLength < 0) {
|
|
75
|
+
throw new Error('[release-runtime] archive file has an invalid byte length');
|
|
76
|
+
}
|
|
77
|
+
if (byteLength > params.limits.maxFileBytes) {
|
|
78
|
+
throw new Error('[release-runtime] archive file exceeds its byte limit');
|
|
79
|
+
}
|
|
80
|
+
expandedBytes += byteLength;
|
|
81
|
+
if (expandedBytes > params.limits.maxExpandedBytes) {
|
|
82
|
+
throw new Error('[release-runtime] archive exceeds expanded-byte limit');
|
|
83
|
+
}
|
|
84
|
+
if (expandedBytes / Math.max(1, params.archiveBytes) > params.limits.maxCompressionRatio) {
|
|
85
|
+
throw new Error('[release-runtime] archive exceeds compression ratio limit');
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function attachTarMetadataBudget(params) {
|
|
91
|
+
const accountMetadata = (byteLength) => {
|
|
92
|
+
try {
|
|
93
|
+
params.budget.account('metadata', byteLength);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
params.abort(error instanceof Error ? error : new Error(String(error)));
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
params.parser.on('meta', (metadata) => {
|
|
100
|
+
accountMetadata(Buffer.byteLength(metadata, 'utf8'));
|
|
101
|
+
});
|
|
102
|
+
params.parser.on('ignoredEntry', (entry) => {
|
|
103
|
+
if (entry.meta)
|
|
104
|
+
accountMetadata(entry.size ?? Number.NaN);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function createArchiveAbortContext(params) {
|
|
108
|
+
if (params.externalSignal?.aborted) {
|
|
109
|
+
throw new Error('[release-runtime] archive extraction was aborted');
|
|
110
|
+
}
|
|
111
|
+
if (params.timeoutMs === 0) {
|
|
112
|
+
throw new Error('[release-runtime] archive extraction timed out');
|
|
113
|
+
}
|
|
114
|
+
const controller = new AbortController();
|
|
115
|
+
const abort = (error) => {
|
|
116
|
+
if (!controller.signal.aborted)
|
|
117
|
+
controller.abort(error);
|
|
118
|
+
};
|
|
119
|
+
const onExternalAbort = () => abort(new Error('[release-runtime] archive extraction was aborted'));
|
|
120
|
+
params.externalSignal?.addEventListener('abort', onExternalAbort, { once: true });
|
|
121
|
+
const timeout = setTimeout(() => abort(new Error('[release-runtime] archive extraction timed out')), params.timeoutMs);
|
|
122
|
+
timeout.unref?.();
|
|
123
|
+
return {
|
|
124
|
+
abort,
|
|
125
|
+
dispose: () => {
|
|
126
|
+
clearTimeout(timeout);
|
|
127
|
+
params.externalSignal?.removeEventListener('abort', onExternalAbort);
|
|
128
|
+
},
|
|
129
|
+
signal: controller.signal,
|
|
130
|
+
throwIfAborted: () => {
|
|
131
|
+
if (!controller.signal.aborted)
|
|
132
|
+
return;
|
|
133
|
+
const reason = controller.signal.reason;
|
|
134
|
+
throw reason instanceof Error
|
|
135
|
+
? reason
|
|
136
|
+
: new Error('[release-runtime] archive extraction was aborted');
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function normalizeArchiveEntryPath(rawPath, kind) {
|
|
141
|
+
if (String(rawPath).includes('\\')) {
|
|
142
|
+
throw new Error(`[release-runtime] archive entry has a non-portable separator: ${rawPath}`);
|
|
143
|
+
}
|
|
144
|
+
const pathWithPortableSeparators = String(rawPath).replaceAll('\\', '/');
|
|
145
|
+
if (!pathWithPortableSeparators
|
|
146
|
+
|| pathWithPortableSeparators.startsWith('/')
|
|
147
|
+
|| pathWithPortableSeparators.startsWith('//')
|
|
148
|
+
|| /^[a-z]:/iu.test(pathWithPortableSeparators)) {
|
|
149
|
+
throw new Error(`[release-runtime] archive entry has an absolute or empty path: ${rawPath}`);
|
|
150
|
+
}
|
|
151
|
+
const rawSegments = pathWithPortableSeparators.split('/');
|
|
152
|
+
if (kind === 'directory' && rawSegments.at(-1) === '')
|
|
153
|
+
rawSegments.pop();
|
|
154
|
+
const portableSegments = [];
|
|
155
|
+
for (const rawSegment of rawSegments) {
|
|
156
|
+
if (rawSegment === '.')
|
|
157
|
+
continue;
|
|
158
|
+
if (!rawSegment || rawSegment === '..') {
|
|
159
|
+
throw new Error(`[release-runtime] archive entry has a non-portable path: ${rawPath}`);
|
|
160
|
+
}
|
|
161
|
+
const segment = rawSegment.normalize('NFC');
|
|
162
|
+
if (WINDOWS_INVALID_PATH_CHARACTER.test(segment)
|
|
163
|
+
|| /[. ]$/u.test(segment)
|
|
164
|
+
|| WINDOWS_RESERVED_PATH_SEGMENT.test(segment)) {
|
|
165
|
+
throw new Error(`[release-runtime] archive entry has a Windows-invalid path: ${rawPath}`);
|
|
166
|
+
}
|
|
167
|
+
portableSegments.push(segment);
|
|
168
|
+
}
|
|
169
|
+
if (portableSegments.length === 0 && kind === 'directory')
|
|
170
|
+
return null;
|
|
171
|
+
if (portableSegments.length === 0) {
|
|
172
|
+
throw new Error(`[release-runtime] archive entry has an empty path: ${rawPath}`);
|
|
173
|
+
}
|
|
174
|
+
return portableSegments.join('/');
|
|
175
|
+
}
|
|
176
|
+
function createArchiveEntryValidator(allowedEntryRoots) {
|
|
177
|
+
const canonicalPrefixesByPortablePath = new Map();
|
|
178
|
+
const explicitEntryPaths = new Set();
|
|
179
|
+
const explicitEntryKindsByPortablePath = new Map();
|
|
180
|
+
const implicitDirectoryPaths = new Set();
|
|
181
|
+
const normalizedAllowedEntryRoots = allowedEntryRoots?.map((root) => {
|
|
182
|
+
const normalizedRoot = normalizeArchiveEntryPath(root, 'directory');
|
|
183
|
+
if (normalizedRoot === null) {
|
|
184
|
+
throw new Error('[release-runtime] allowed archive entry root must not be the archive root');
|
|
185
|
+
}
|
|
186
|
+
return normalizedRoot;
|
|
187
|
+
});
|
|
188
|
+
return (rawPath, kind) => {
|
|
189
|
+
const portablePath = normalizeArchiveEntryPath(rawPath, kind);
|
|
190
|
+
if (portablePath === null)
|
|
191
|
+
return null;
|
|
192
|
+
const portableSegments = portablePath.split('/');
|
|
193
|
+
if (normalizedAllowedEntryRoots
|
|
194
|
+
&& !normalizedAllowedEntryRoots.some((root) => (portablePath === root
|
|
195
|
+
|| portablePath.startsWith(`${root}/`)
|
|
196
|
+
|| root.startsWith(`${portablePath}/`)))) {
|
|
197
|
+
throw new Error(`[release-runtime] archive entry is outside an allowed entry root: ${rawPath}`);
|
|
198
|
+
}
|
|
199
|
+
const collisionKey = portablePath.toLowerCase();
|
|
200
|
+
if (explicitEntryPaths.has(collisionKey)) {
|
|
201
|
+
throw new Error(`[release-runtime] duplicate archive entry path: ${rawPath}`);
|
|
202
|
+
}
|
|
203
|
+
for (let index = 0; index < portableSegments.length; index += 1) {
|
|
204
|
+
const canonicalPrefix = portableSegments.slice(0, index + 1).join('/');
|
|
205
|
+
const portablePrefix = canonicalPrefix.toLowerCase();
|
|
206
|
+
const previousPrefix = canonicalPrefixesByPortablePath.get(portablePrefix);
|
|
207
|
+
if (previousPrefix !== undefined && previousPrefix !== canonicalPrefix) {
|
|
208
|
+
throw new Error(`[release-runtime] archive entry path collision: ${rawPath} conflicts with ${previousPrefix}`);
|
|
209
|
+
}
|
|
210
|
+
canonicalPrefixesByPortablePath.set(portablePrefix, canonicalPrefix);
|
|
211
|
+
if (index < portableSegments.length - 1) {
|
|
212
|
+
if (explicitEntryKindsByPortablePath.get(portablePrefix) === 'file') {
|
|
213
|
+
throw new Error(`[release-runtime] archive entry has a file/directory prefix conflict: ${rawPath} descends from ${canonicalPrefix}`);
|
|
214
|
+
}
|
|
215
|
+
implicitDirectoryPaths.add(portablePrefix);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (kind === 'file' && implicitDirectoryPaths.has(collisionKey)) {
|
|
219
|
+
throw new Error(`[release-runtime] archive entry has a file/directory prefix conflict: ${rawPath} was already used as a directory`);
|
|
220
|
+
}
|
|
221
|
+
explicitEntryPaths.add(collisionKey);
|
|
222
|
+
explicitEntryKindsByPortablePath.set(collisionKey, kind);
|
|
223
|
+
return portablePath;
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function createTarEntryValidator(linkPolicy, budget, allowedEntryRoots, onFailure, onEntry) {
|
|
227
|
+
const validatePath = createArchiveEntryValidator(allowedEntryRoots);
|
|
228
|
+
let firstError = null;
|
|
229
|
+
return {
|
|
230
|
+
accept: (entry) => {
|
|
231
|
+
try {
|
|
232
|
+
if (entry.meta)
|
|
233
|
+
return true;
|
|
234
|
+
if (entry.type === 'Directory') {
|
|
235
|
+
budget.account('directory', 0);
|
|
236
|
+
const path = validatePath(entry.path, 'directory');
|
|
237
|
+
if (path !== null) {
|
|
238
|
+
onEntry?.({
|
|
239
|
+
path,
|
|
240
|
+
kind: 'directory',
|
|
241
|
+
mode: entry.mode ?? null,
|
|
242
|
+
uid: entry.uid ?? null,
|
|
243
|
+
gid: entry.gid ?? null,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
if (entry.type === 'File' || entry.type === 'OldFile' || entry.type === 'ContiguousFile') {
|
|
249
|
+
budget.account('file', entry.size ?? Number.NaN);
|
|
250
|
+
const path = validatePath(entry.path, 'file');
|
|
251
|
+
if (path !== null) {
|
|
252
|
+
onEntry?.({
|
|
253
|
+
path,
|
|
254
|
+
kind: 'file',
|
|
255
|
+
mode: entry.mode ?? null,
|
|
256
|
+
uid: entry.uid ?? null,
|
|
257
|
+
gid: entry.gid ?? null,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
if (linkPolicy === 'skip' && (entry.type === 'SymbolicLink' || entry.type === 'Link')) {
|
|
263
|
+
budget.account('file', 0);
|
|
264
|
+
validatePath(entry.path, 'file');
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
throw new Error(`[release-runtime] archive entry type is not supported: ${entry.type} (${entry.path})`);
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
firstError ??= error instanceof Error ? error : new Error(String(error));
|
|
271
|
+
onFailure?.(firstError);
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
assertValid: () => {
|
|
276
|
+
if (firstError)
|
|
277
|
+
throw firstError;
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
export async function inspectTarArchiveEntries(params) {
|
|
282
|
+
const limits = mergeArchiveExtractionLimits(params.limits);
|
|
283
|
+
const { archiveFile, archiveBytes } = await openArchiveSource(params.archivePath, limits);
|
|
284
|
+
let abortContext;
|
|
285
|
+
try {
|
|
286
|
+
abortContext = createArchiveAbortContext({
|
|
287
|
+
externalSignal: params.signal,
|
|
288
|
+
timeoutMs: limits.timeoutMs,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
await archiveFile.close().catch(() => undefined);
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
const entries = [];
|
|
296
|
+
const budget = createArchiveBudget({ archiveBytes, limits });
|
|
297
|
+
const validateEntry = createTarEntryValidator('reject', budget, undefined, abortContext.abort, (entry) => entries.push(entry));
|
|
298
|
+
try {
|
|
299
|
+
const parserOptions = {
|
|
300
|
+
filter: (_path, entry) => 'meta' in entry ? validateEntry.accept(entry) : true,
|
|
301
|
+
maxDecompressionRatio: limits.maxCompressionRatio,
|
|
302
|
+
maxMetaEntrySize: MAX_TAR_METADATA_ENTRY_BYTES,
|
|
303
|
+
strict: true,
|
|
304
|
+
};
|
|
305
|
+
const parser = tar.t(parserOptions);
|
|
306
|
+
attachTarMetadataBudget({ parser, budget, abort: abortContext.abort });
|
|
307
|
+
await pipeline(createOpenArchiveRangeStream(archiveFile, 0, archiveBytes), parser, { signal: abortContext.signal });
|
|
308
|
+
abortContext.throwIfAborted();
|
|
309
|
+
validateEntry.assertValid();
|
|
310
|
+
return entries;
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
abortContext.throwIfAborted();
|
|
314
|
+
validateEntry.assertValid();
|
|
315
|
+
throw error;
|
|
316
|
+
}
|
|
317
|
+
finally {
|
|
318
|
+
abortContext.dispose();
|
|
319
|
+
await archiveFile.close().catch(() => undefined);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
class OpenFileZipReader extends yauzl.RandomAccessReader {
|
|
323
|
+
#archiveFile;
|
|
324
|
+
constructor(archiveFile) {
|
|
325
|
+
super();
|
|
326
|
+
this.#archiveFile = archiveFile;
|
|
327
|
+
}
|
|
328
|
+
_readStreamForRange(start, end) {
|
|
329
|
+
return createOpenArchiveRangeStream(this.#archiveFile, start, end);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const CRC32_TABLE = Uint32Array.from({ length: 256 }, (_, index) => {
|
|
333
|
+
let value = index;
|
|
334
|
+
for (let bit = 0; bit < 8; bit += 1) {
|
|
335
|
+
value = (value & 1) !== 0
|
|
336
|
+
? 0xedb88320 ^ (value >>> 1)
|
|
337
|
+
: value >>> 1;
|
|
338
|
+
}
|
|
339
|
+
return value >>> 0;
|
|
340
|
+
});
|
|
341
|
+
function updateCrc32(previousChecksum, chunk) {
|
|
342
|
+
let checksum = (previousChecksum ^ 0xffffffff) >>> 0;
|
|
343
|
+
for (const byte of chunk) {
|
|
344
|
+
checksum = (CRC32_TABLE[(checksum ^ byte) & 0xff] ^ (checksum >>> 8)) >>> 0;
|
|
345
|
+
}
|
|
346
|
+
return (checksum ^ 0xffffffff) >>> 0;
|
|
347
|
+
}
|
|
348
|
+
const CP437_CHARACTERS = Array.from('\u0000☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ');
|
|
349
|
+
const UTF8_DECODER = new TextDecoder('utf-8', { fatal: true });
|
|
350
|
+
function decodeZipUnicodePath(params) {
|
|
351
|
+
let unicodeFileName = null;
|
|
352
|
+
for (const field of params.extraFields) {
|
|
353
|
+
if (field.id !== 0x7075
|
|
354
|
+
|| field.data.byteLength < 6
|
|
355
|
+
|| field.data.readUInt8(0) !== 1
|
|
356
|
+
|| field.data.readUInt32LE(1) !== updateCrc32(0, params.rawFileName)) {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
let decodedName;
|
|
360
|
+
try {
|
|
361
|
+
decodedName = UTF8_DECODER.decode(field.data.subarray(5));
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
throw new Error(`[release-runtime] ZIP ${params.headerName} Unicode path extra field is not valid UTF-8`);
|
|
365
|
+
}
|
|
366
|
+
if (unicodeFileName !== null && unicodeFileName !== decodedName) {
|
|
367
|
+
throw new Error(`[release-runtime] ZIP ${params.headerName} header has conflicting Unicode path extra fields`);
|
|
368
|
+
}
|
|
369
|
+
unicodeFileName = decodedName;
|
|
370
|
+
}
|
|
371
|
+
return unicodeFileName;
|
|
372
|
+
}
|
|
373
|
+
function decodeZipEntryFileName(entry) {
|
|
374
|
+
const rawFileName = Buffer.from(entry.fileName);
|
|
375
|
+
let fileName;
|
|
376
|
+
if ((entry.generalPurposeBitFlag & 0x800) !== 0) {
|
|
377
|
+
try {
|
|
378
|
+
fileName = UTF8_DECODER.decode(rawFileName);
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
throw new Error('[release-runtime] ZIP entry filename is not valid UTF-8');
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
fileName = Array.from(rawFileName, (byte) => CP437_CHARACTERS[byte]).join('');
|
|
386
|
+
}
|
|
387
|
+
const decodedRawFileName = fileName;
|
|
388
|
+
const unicodeFileName = decodeZipUnicodePath({
|
|
389
|
+
extraFields: entry.extraFields,
|
|
390
|
+
headerName: 'central',
|
|
391
|
+
rawFileName,
|
|
392
|
+
});
|
|
393
|
+
if (unicodeFileName !== null
|
|
394
|
+
&& (entry.generalPurposeBitFlag & 0x800) !== 0
|
|
395
|
+
&& unicodeFileName !== decodedRawFileName) {
|
|
396
|
+
throw new Error('[release-runtime] ZIP central Unicode path extra field conflicts with its UTF-8 filename');
|
|
397
|
+
}
|
|
398
|
+
if (unicodeFileName !== null)
|
|
399
|
+
fileName = unicodeFileName;
|
|
400
|
+
return {
|
|
401
|
+
compressedSize: entry.compressedSize,
|
|
402
|
+
compressionMethod: entry.compressionMethod,
|
|
403
|
+
crc32: entry.crc32,
|
|
404
|
+
decodedRawFileName,
|
|
405
|
+
externalFileAttributes: entry.externalFileAttributes,
|
|
406
|
+
fileName,
|
|
407
|
+
generalPurposeBitFlag: entry.generalPurposeBitFlag,
|
|
408
|
+
rawFileName,
|
|
409
|
+
relativeOffsetOfLocalHeader: entry.relativeOffsetOfLocalHeader,
|
|
410
|
+
uncompressedSize: entry.uncompressedSize,
|
|
411
|
+
usesZip64DataDescriptor: ((entry.generalPurposeBitFlag & 0x8) !== 0
|
|
412
|
+
&& entry.extraFields.some((field) => field.id === 0x0001)),
|
|
413
|
+
versionMadeBy: entry.versionMadeBy,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
function createZipEntryValidator(params) {
|
|
417
|
+
const validatePath = createArchiveEntryValidator(params.allowedEntryRoots);
|
|
418
|
+
return (entry) => {
|
|
419
|
+
params.abortContext.throwIfAborted();
|
|
420
|
+
if ((entry.generalPurposeBitFlag & 0x1) !== 0) {
|
|
421
|
+
throw new Error(`[release-runtime] encrypted archive entries are not supported (${entry.fileName})`);
|
|
422
|
+
}
|
|
423
|
+
if (entry.compressionMethod !== 0 && entry.compressionMethod !== 8) {
|
|
424
|
+
throw new Error(`[release-runtime] ZIP compression method is not supported: ${entry.compressionMethod} (${entry.fileName})`);
|
|
425
|
+
}
|
|
426
|
+
if (!Number.isSafeInteger(entry.compressedSize)
|
|
427
|
+
|| entry.compressedSize < 0
|
|
428
|
+
|| !Number.isSafeInteger(entry.relativeOffsetOfLocalHeader)
|
|
429
|
+
|| entry.relativeOffsetOfLocalHeader < 0) {
|
|
430
|
+
throw new Error(`[release-runtime] archive entry has invalid ZIP offsets (${entry.fileName})`);
|
|
431
|
+
}
|
|
432
|
+
if (entry.compressionMethod === 0 && entry.compressedSize !== entry.uncompressedSize) {
|
|
433
|
+
throw new Error(`[release-runtime] stored ZIP entry has inconsistent sizes (${entry.fileName})`);
|
|
434
|
+
}
|
|
435
|
+
const unixMode = (entry.externalFileAttributes >>> 16) & 0xffff;
|
|
436
|
+
const unixFileType = unixMode & 0o170000;
|
|
437
|
+
const madeBy = entry.versionMadeBy >>> 8;
|
|
438
|
+
const isDirectory = entry.fileName.endsWith('/')
|
|
439
|
+
|| unixFileType === 0o040000
|
|
440
|
+
|| (madeBy === 0 && entry.externalFileAttributes === 16);
|
|
441
|
+
if (unixFileType !== 0 && unixFileType !== 0o040000 && unixFileType !== 0o100000) {
|
|
442
|
+
throw new Error(`[release-runtime] archive entry type is not supported: link or special file (${entry.fileName})`);
|
|
443
|
+
}
|
|
444
|
+
const kind = isDirectory ? 'directory' : 'file';
|
|
445
|
+
params.budget.account(kind, isDirectory ? 0 : entry.uncompressedSize);
|
|
446
|
+
return {
|
|
447
|
+
...entry,
|
|
448
|
+
kind,
|
|
449
|
+
mode: unixMode & 0o777,
|
|
450
|
+
path: validatePath(entry.fileName, kind),
|
|
451
|
+
};
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
let xzReadableStreamConstructorPromise = null;
|
|
455
|
+
async function resolveXzReadableStreamConstructor() {
|
|
456
|
+
if (!xzReadableStreamConstructorPromise) {
|
|
457
|
+
xzReadableStreamConstructorPromise = import('xz-decompress').then((module) => {
|
|
458
|
+
const xzModule = module;
|
|
459
|
+
const XzReadableStream = xzModule.XzReadableStream ?? xzModule.default?.XzReadableStream;
|
|
460
|
+
if (!XzReadableStream) {
|
|
461
|
+
throw new Error('[release-runtime] xz-decompress does not expose XzReadableStream');
|
|
462
|
+
}
|
|
463
|
+
return XzReadableStream;
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
return await xzReadableStreamConstructorPromise;
|
|
467
|
+
}
|
|
468
|
+
async function openArchiveSource(archivePath, limits) {
|
|
469
|
+
const sourceStats = await lstat(archivePath).catch((error) => {
|
|
470
|
+
throw new Error('[release-runtime] archive source is unavailable', {
|
|
471
|
+
cause: error instanceof Error ? error : undefined,
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
if (!sourceStats.isFile() || sourceStats.isSymbolicLink()) {
|
|
475
|
+
throw new Error('[release-runtime] archive source must be a regular file');
|
|
476
|
+
}
|
|
477
|
+
const noFollow = process.platform === 'win32' ? 0 : constants.O_NOFOLLOW;
|
|
478
|
+
const archiveFile = await open(archivePath, constants.O_RDONLY | noFollow);
|
|
479
|
+
try {
|
|
480
|
+
const openedStats = await archiveFile.stat();
|
|
481
|
+
if (!openedStats.isFile()
|
|
482
|
+
|| openedStats.size < 1
|
|
483
|
+
|| openedStats.dev !== sourceStats.dev
|
|
484
|
+
|| openedStats.ino !== sourceStats.ino) {
|
|
485
|
+
throw new Error('[release-runtime] archive source changed before it could be opened safely');
|
|
486
|
+
}
|
|
487
|
+
if (openedStats.size > limits.maxArchiveBytes) {
|
|
488
|
+
throw new Error('[release-runtime] archive exceeds compressed-byte limit');
|
|
489
|
+
}
|
|
490
|
+
return { archiveFile, archiveBytes: openedStats.size };
|
|
491
|
+
}
|
|
492
|
+
catch (error) {
|
|
493
|
+
await archiveFile.close().catch(() => undefined);
|
|
494
|
+
throw error;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
async function assertEmptyExtractionDestination(extractDir) {
|
|
498
|
+
const destinationStats = await lstat(extractDir).catch((error) => {
|
|
499
|
+
if (error?.code === 'ENOENT')
|
|
500
|
+
return null;
|
|
501
|
+
throw error;
|
|
502
|
+
});
|
|
503
|
+
if (!destinationStats)
|
|
504
|
+
return false;
|
|
505
|
+
if (!destinationStats.isDirectory() || destinationStats.isSymbolicLink()) {
|
|
506
|
+
throw new Error('[release-runtime] archive extraction destination must be an empty directory');
|
|
507
|
+
}
|
|
508
|
+
if ((await readdir(extractDir)).length !== 0) {
|
|
509
|
+
throw new Error('[release-runtime] archive extraction destination must be empty');
|
|
510
|
+
}
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
async function publishStagedExtraction(params) {
|
|
514
|
+
if (params.destinationExisted) {
|
|
515
|
+
await rmdir(params.extractDir).catch((error) => {
|
|
516
|
+
if (error?.code !== 'ENOENT')
|
|
517
|
+
throw error;
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
await rename(params.stagingDir, params.extractDir);
|
|
521
|
+
}
|
|
522
|
+
function createXzDecompressionRatioGuard(params) {
|
|
523
|
+
let decompressedBytes = 0;
|
|
524
|
+
return new Transform({
|
|
525
|
+
transform(chunk, _encoding, callback) {
|
|
526
|
+
decompressedBytes += chunk.byteLength;
|
|
527
|
+
if (decompressedBytes / Math.max(1, params.archiveBytes)
|
|
528
|
+
> params.limits.maxCompressionRatio) {
|
|
529
|
+
const error = new Error('[release-runtime] archive exceeds compression ratio limit');
|
|
530
|
+
params.abortContext.abort(error);
|
|
531
|
+
callback(error);
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
callback(null, chunk);
|
|
535
|
+
},
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
async function extractTarArchiveToDirectory(params) {
|
|
539
|
+
const budget = createArchiveBudget({
|
|
540
|
+
archiveBytes: params.archiveBytes,
|
|
541
|
+
limits: params.limits,
|
|
542
|
+
});
|
|
543
|
+
const validateEntry = createTarEntryValidator(params.linkPolicy, budget, params.allowedEntryRoots, params.abortContext.abort);
|
|
544
|
+
const unpackOptions = {
|
|
545
|
+
cwd: params.extractDir,
|
|
546
|
+
filter: (_path, entry) => 'meta' in entry ? validateEntry.accept(entry) : true,
|
|
547
|
+
maxDecompressionRatio: params.limits.maxCompressionRatio,
|
|
548
|
+
maxMetaEntrySize: MAX_TAR_METADATA_ENTRY_BYTES,
|
|
549
|
+
preserveOwner: false,
|
|
550
|
+
strict: true,
|
|
551
|
+
};
|
|
552
|
+
const unpack = tar.x(unpackOptions);
|
|
553
|
+
attachTarMetadataBudget({ parser: unpack, budget, abort: params.abortContext.abort });
|
|
554
|
+
try {
|
|
555
|
+
if (params.isXz) {
|
|
556
|
+
const source = createOpenArchiveRangeStream(params.archiveFile, 0, params.archiveBytes);
|
|
557
|
+
const XzReadableStream = await resolveXzReadableStreamConstructor();
|
|
558
|
+
const decompressedStream = new XzReadableStream(Readable.toWeb(source));
|
|
559
|
+
await pipeline(Readable.fromWeb(decompressedStream), createXzDecompressionRatioGuard(params), unpack, { signal: params.abortContext.signal });
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
await pipeline(createOpenArchiveRangeStream(params.archiveFile, 0, params.archiveBytes), unpack, { signal: params.abortContext.signal });
|
|
563
|
+
}
|
|
564
|
+
params.abortContext.throwIfAborted();
|
|
565
|
+
validateEntry.assertValid();
|
|
566
|
+
}
|
|
567
|
+
catch (error) {
|
|
568
|
+
params.abortContext.throwIfAborted();
|
|
569
|
+
validateEntry.assertValid();
|
|
570
|
+
throw error;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
async function readValidatedZipEntries(params) {
|
|
574
|
+
const entries = [];
|
|
575
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
576
|
+
let zipFile = null;
|
|
577
|
+
let openCompleted = false;
|
|
578
|
+
let settlementRequested = false;
|
|
579
|
+
let settlementError;
|
|
580
|
+
let completed = false;
|
|
581
|
+
const complete = () => {
|
|
582
|
+
if (completed)
|
|
583
|
+
return;
|
|
584
|
+
completed = true;
|
|
585
|
+
if (settlementError === undefined) {
|
|
586
|
+
resolvePromise();
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
rejectPromise(settlementError);
|
|
590
|
+
}
|
|
591
|
+
};
|
|
592
|
+
const closeThenComplete = () => {
|
|
593
|
+
if (zipFile?.isOpen) {
|
|
594
|
+
zipFile.once('close', complete);
|
|
595
|
+
zipFile.close();
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
complete();
|
|
599
|
+
};
|
|
600
|
+
const settle = (error) => {
|
|
601
|
+
if (settlementRequested)
|
|
602
|
+
return;
|
|
603
|
+
settlementRequested = true;
|
|
604
|
+
settlementError = error;
|
|
605
|
+
params.abortContext.signal.removeEventListener('abort', onAbort);
|
|
606
|
+
if (openCompleted)
|
|
607
|
+
closeThenComplete();
|
|
608
|
+
};
|
|
609
|
+
const onAbort = () => settle(params.abortContext.signal.reason);
|
|
610
|
+
params.abortContext.signal.addEventListener('abort', onAbort, { once: true });
|
|
611
|
+
yauzl.fromRandomAccessReader(new OpenFileZipReader(params.archiveFile), params.archiveBytes, {
|
|
612
|
+
autoClose: false,
|
|
613
|
+
decodeStrings: false,
|
|
614
|
+
lazyEntries: true,
|
|
615
|
+
strictFileNames: false,
|
|
616
|
+
validateEntrySizes: true,
|
|
617
|
+
}, (openError, openedZipFile) => {
|
|
618
|
+
openCompleted = true;
|
|
619
|
+
if (openError) {
|
|
620
|
+
settle(openError);
|
|
621
|
+
closeThenComplete();
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
zipFile = openedZipFile;
|
|
625
|
+
if (settlementRequested) {
|
|
626
|
+
closeThenComplete();
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
zipFile.once('error', settle);
|
|
630
|
+
zipFile.on('entry', (entry) => {
|
|
631
|
+
try {
|
|
632
|
+
entries.push(params.validateEntry(decodeZipEntryFileName(entry)));
|
|
633
|
+
zipFile?.readEntry();
|
|
634
|
+
}
|
|
635
|
+
catch (error) {
|
|
636
|
+
settle(error);
|
|
637
|
+
}
|
|
638
|
+
});
|
|
639
|
+
zipFile.once('end', () => settle());
|
|
640
|
+
zipFile.readEntry();
|
|
641
|
+
});
|
|
642
|
+
});
|
|
643
|
+
params.abortContext.throwIfAborted();
|
|
644
|
+
return entries;
|
|
645
|
+
}
|
|
646
|
+
async function readZipArchiveBytes(params) {
|
|
647
|
+
const end = params.position + params.byteLength;
|
|
648
|
+
if (!Number.isSafeInteger(params.position)
|
|
649
|
+
|| params.position < 0
|
|
650
|
+
|| !Number.isSafeInteger(end)
|
|
651
|
+
|| end > params.archiveBytes) {
|
|
652
|
+
throw new Error('[release-runtime] ZIP structure is outside the archive payload');
|
|
653
|
+
}
|
|
654
|
+
const buffer = Buffer.alloc(params.byteLength);
|
|
655
|
+
let bytesRead = 0;
|
|
656
|
+
while (bytesRead < buffer.byteLength) {
|
|
657
|
+
params.abortContext.throwIfAborted();
|
|
658
|
+
const readResult = await params.archiveFile.read(buffer, bytesRead, buffer.byteLength - bytesRead, params.position + bytesRead);
|
|
659
|
+
params.abortContext.throwIfAborted();
|
|
660
|
+
if (readResult.bytesRead === 0)
|
|
661
|
+
break;
|
|
662
|
+
bytesRead += readResult.bytesRead;
|
|
663
|
+
}
|
|
664
|
+
if (bytesRead !== buffer.byteLength) {
|
|
665
|
+
throw new Error('[release-runtime] ZIP structure is truncated');
|
|
666
|
+
}
|
|
667
|
+
return buffer;
|
|
668
|
+
}
|
|
669
|
+
function readSafeZipUInt64(buffer, offset, description) {
|
|
670
|
+
const value = buffer.readBigUInt64LE(offset);
|
|
671
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
672
|
+
throw new Error(`[release-runtime] ZIP ${description} exceeds the supported numeric range`);
|
|
673
|
+
}
|
|
674
|
+
return Number(value);
|
|
675
|
+
}
|
|
676
|
+
async function readZipCentralDirectory(params) {
|
|
677
|
+
const minimumEndRecordBytes = 22;
|
|
678
|
+
if (params.archiveBytes < minimumEndRecordBytes) {
|
|
679
|
+
throw new Error('[release-runtime] ZIP end record is missing');
|
|
680
|
+
}
|
|
681
|
+
const tailByteLength = Math.min(params.archiveBytes, minimumEndRecordBytes + 0xffff);
|
|
682
|
+
const tailPosition = params.archiveBytes - tailByteLength;
|
|
683
|
+
const tail = await readZipArchiveBytes({
|
|
684
|
+
...params,
|
|
685
|
+
byteLength: tailByteLength,
|
|
686
|
+
position: tailPosition,
|
|
687
|
+
});
|
|
688
|
+
let endRecordOffset = -1;
|
|
689
|
+
for (let offset = tail.byteLength - minimumEndRecordBytes; offset >= 0; offset -= 1) {
|
|
690
|
+
if (tail.readUInt32LE(offset) === 0x06054b50
|
|
691
|
+
&& offset + minimumEndRecordBytes + tail.readUInt16LE(offset + 20) === tail.byteLength) {
|
|
692
|
+
endRecordOffset = offset;
|
|
693
|
+
break;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
if (endRecordOffset < 0) {
|
|
697
|
+
throw new Error('[release-runtime] ZIP end record is missing or malformed');
|
|
698
|
+
}
|
|
699
|
+
if (tail.readUInt16LE(endRecordOffset + 4) !== 0
|
|
700
|
+
|| tail.readUInt16LE(endRecordOffset + 6) !== 0) {
|
|
701
|
+
throw new Error('[release-runtime] multi-disk ZIP archives are not supported');
|
|
702
|
+
}
|
|
703
|
+
const absoluteEndRecordOffset = tailPosition + endRecordOffset;
|
|
704
|
+
let size = tail.readUInt32LE(endRecordOffset + 12);
|
|
705
|
+
let offset = tail.readUInt32LE(endRecordOffset + 16);
|
|
706
|
+
let metadataStart = absoluteEndRecordOffset;
|
|
707
|
+
if (size === 0xffffffff || offset === 0xffffffff) {
|
|
708
|
+
const locatorPosition = absoluteEndRecordOffset - 20;
|
|
709
|
+
const locator = await readZipArchiveBytes({
|
|
710
|
+
...params,
|
|
711
|
+
byteLength: 20,
|
|
712
|
+
position: locatorPosition,
|
|
713
|
+
});
|
|
714
|
+
if (locator.readUInt32LE(0) !== 0x07064b50
|
|
715
|
+
|| locator.readUInt32LE(4) !== 0
|
|
716
|
+
|| locator.readUInt32LE(16) !== 1) {
|
|
717
|
+
throw new Error('[release-runtime] ZIP64 end locator is missing or unsupported');
|
|
718
|
+
}
|
|
719
|
+
const zip64EndRecordOffset = readSafeZipUInt64(locator, 8, 'ZIP64 end-record offset');
|
|
720
|
+
const zip64EndRecord = await readZipArchiveBytes({
|
|
721
|
+
...params,
|
|
722
|
+
byteLength: 56,
|
|
723
|
+
position: zip64EndRecordOffset,
|
|
724
|
+
});
|
|
725
|
+
if (zip64EndRecord.readUInt32LE(0) !== 0x06064b50
|
|
726
|
+
|| zip64EndRecord.readUInt32LE(16) !== 0
|
|
727
|
+
|| zip64EndRecord.readUInt32LE(20) !== 0) {
|
|
728
|
+
throw new Error('[release-runtime] ZIP64 end record is missing or unsupported');
|
|
729
|
+
}
|
|
730
|
+
size = readSafeZipUInt64(zip64EndRecord, 40, 'central-directory size');
|
|
731
|
+
offset = readSafeZipUInt64(zip64EndRecord, 48, 'central-directory offset');
|
|
732
|
+
metadataStart = zip64EndRecordOffset;
|
|
733
|
+
}
|
|
734
|
+
const centralDirectoryEnd = offset + size;
|
|
735
|
+
if (!Number.isSafeInteger(centralDirectoryEnd)
|
|
736
|
+
|| offset < 0
|
|
737
|
+
|| centralDirectoryEnd > metadataStart) {
|
|
738
|
+
throw new Error('[release-runtime] ZIP central directory is outside its declared range');
|
|
739
|
+
}
|
|
740
|
+
return { offset, size };
|
|
741
|
+
}
|
|
742
|
+
function parseZipExtraFields(buffer, headerName) {
|
|
743
|
+
const fields = [];
|
|
744
|
+
let offset = 0;
|
|
745
|
+
while (offset < buffer.byteLength) {
|
|
746
|
+
if (offset + 4 > buffer.byteLength) {
|
|
747
|
+
throw new Error(`[release-runtime] ZIP ${headerName} extra field is malformed`);
|
|
748
|
+
}
|
|
749
|
+
const fieldSize = buffer.readUInt16LE(offset + 2);
|
|
750
|
+
const fieldEnd = offset + 4 + fieldSize;
|
|
751
|
+
if (fieldEnd > buffer.byteLength) {
|
|
752
|
+
throw new Error(`[release-runtime] ZIP ${headerName} extra field is malformed`);
|
|
753
|
+
}
|
|
754
|
+
fields.push({
|
|
755
|
+
data: buffer.subarray(offset + 4, fieldEnd),
|
|
756
|
+
id: buffer.readUInt16LE(offset),
|
|
757
|
+
});
|
|
758
|
+
offset = fieldEnd;
|
|
759
|
+
}
|
|
760
|
+
return fields;
|
|
761
|
+
}
|
|
762
|
+
function readLocalZipSizes(params) {
|
|
763
|
+
let compressedSize = params.compressedSize;
|
|
764
|
+
let uncompressedSize = params.uncompressedSize;
|
|
765
|
+
if (compressedSize !== 0xffffffff && uncompressedSize !== 0xffffffff) {
|
|
766
|
+
return { compressedSize, uncompressedSize };
|
|
767
|
+
}
|
|
768
|
+
const zip64Data = params.extraFields.find((field) => field.id === 0x0001)?.data ?? null;
|
|
769
|
+
if (!zip64Data) {
|
|
770
|
+
throw new Error('[release-runtime] ZIP local header is missing ZIP64 sizes');
|
|
771
|
+
}
|
|
772
|
+
let zip64Offset = 0;
|
|
773
|
+
if (uncompressedSize === 0xffffffff) {
|
|
774
|
+
if (zip64Offset + 8 > zip64Data.byteLength) {
|
|
775
|
+
throw new Error('[release-runtime] ZIP local header is missing its ZIP64 uncompressed size');
|
|
776
|
+
}
|
|
777
|
+
uncompressedSize = readSafeZipUInt64(zip64Data, zip64Offset, 'local uncompressed size');
|
|
778
|
+
zip64Offset += 8;
|
|
779
|
+
}
|
|
780
|
+
if (compressedSize === 0xffffffff) {
|
|
781
|
+
if (zip64Offset + 8 > zip64Data.byteLength) {
|
|
782
|
+
throw new Error('[release-runtime] ZIP local header is missing its ZIP64 compressed size');
|
|
783
|
+
}
|
|
784
|
+
compressedSize = readSafeZipUInt64(zip64Data, zip64Offset, 'local compressed size');
|
|
785
|
+
}
|
|
786
|
+
return { compressedSize, uncompressedSize };
|
|
787
|
+
}
|
|
788
|
+
function readZipDataDescriptorSize(params) {
|
|
789
|
+
const candidates = [];
|
|
790
|
+
const hasSignature = (params.descriptor.byteLength >= 4
|
|
791
|
+
&& params.descriptor.readUInt32LE(0) === 0x08074b50);
|
|
792
|
+
const signatureVariants = hasSignature ? [true, false] : [false];
|
|
793
|
+
const sizeVariants = params.entry.usesZip64DataDescriptor ? [8] : [4];
|
|
794
|
+
for (const signed of signatureVariants) {
|
|
795
|
+
for (const sizeBytes of sizeVariants) {
|
|
796
|
+
const valueOffset = signed ? 4 : 0;
|
|
797
|
+
const byteLength = valueOffset + 4 + (2 * sizeBytes);
|
|
798
|
+
if (byteLength > params.descriptor.byteLength)
|
|
799
|
+
continue;
|
|
800
|
+
const checksum = params.descriptor.readUInt32LE(valueOffset);
|
|
801
|
+
const compressedSize = sizeBytes === 4
|
|
802
|
+
? params.descriptor.readUInt32LE(valueOffset + 4)
|
|
803
|
+
: readSafeZipUInt64(params.descriptor, valueOffset + 4, 'descriptor compressed size');
|
|
804
|
+
const uncompressedSize = sizeBytes === 4
|
|
805
|
+
? params.descriptor.readUInt32LE(valueOffset + 8)
|
|
806
|
+
: readSafeZipUInt64(params.descriptor, valueOffset + 4 + sizeBytes, 'descriptor uncompressed size');
|
|
807
|
+
if (checksum === params.entry.crc32
|
|
808
|
+
&& compressedSize === params.entry.compressedSize
|
|
809
|
+
&& uncompressedSize === params.entry.uncompressedSize) {
|
|
810
|
+
candidates.push(byteLength);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
if (candidates.length === 0) {
|
|
815
|
+
throw new Error(`[release-runtime] ZIP data descriptor is missing or conflicts with the central header (${params.entry.fileName})`);
|
|
816
|
+
}
|
|
817
|
+
return candidates[0];
|
|
818
|
+
}
|
|
819
|
+
async function readZipEntryDataOffset(params) {
|
|
820
|
+
const localHeader = await readZipArchiveBytes({
|
|
821
|
+
...params,
|
|
822
|
+
byteLength: 30,
|
|
823
|
+
position: params.entry.relativeOffsetOfLocalHeader,
|
|
824
|
+
});
|
|
825
|
+
if (localHeader.readUInt32LE(0) !== 0x04034b50) {
|
|
826
|
+
throw new Error(`[release-runtime] archive entry has an invalid ZIP local header (${params.entry.fileName})`);
|
|
827
|
+
}
|
|
828
|
+
const localFlags = localHeader.readUInt16LE(6);
|
|
829
|
+
const localCompressionMethod = localHeader.readUInt16LE(8);
|
|
830
|
+
if (localFlags !== params.entry.generalPurposeBitFlag
|
|
831
|
+
|| localCompressionMethod !== params.entry.compressionMethod) {
|
|
832
|
+
throw new Error(`[release-runtime] ZIP central and local headers disagree (${params.entry.fileName})`);
|
|
833
|
+
}
|
|
834
|
+
const fileNameBytes = localHeader.readUInt16LE(26);
|
|
835
|
+
const extraFieldBytes = localHeader.readUInt16LE(28);
|
|
836
|
+
const localVariableFields = await readZipArchiveBytes({
|
|
837
|
+
...params,
|
|
838
|
+
byteLength: fileNameBytes + extraFieldBytes,
|
|
839
|
+
position: params.entry.relativeOffsetOfLocalHeader + localHeader.byteLength,
|
|
840
|
+
});
|
|
841
|
+
const localFileName = localVariableFields.subarray(0, fileNameBytes);
|
|
842
|
+
const localExtraField = localVariableFields.subarray(fileNameBytes);
|
|
843
|
+
if (!localFileName.equals(params.entry.rawFileName)) {
|
|
844
|
+
throw new Error(`[release-runtime] ZIP central and local headers disagree (${params.entry.fileName})`);
|
|
845
|
+
}
|
|
846
|
+
const localExtraFields = parseZipExtraFields(localExtraField, 'local');
|
|
847
|
+
const localUnicodeFileName = decodeZipUnicodePath({
|
|
848
|
+
extraFields: localExtraFields,
|
|
849
|
+
headerName: 'local',
|
|
850
|
+
rawFileName: localFileName,
|
|
851
|
+
});
|
|
852
|
+
if (localUnicodeFileName !== null
|
|
853
|
+
&& (localFlags & 0x800) !== 0
|
|
854
|
+
&& localUnicodeFileName !== params.entry.decodedRawFileName) {
|
|
855
|
+
throw new Error(`[release-runtime] ZIP local Unicode path extra field conflicts with its UTF-8 filename (${params.entry.fileName})`);
|
|
856
|
+
}
|
|
857
|
+
const localSemanticFileName = localUnicodeFileName ?? params.entry.decodedRawFileName;
|
|
858
|
+
if (params.entry.fileName !== localSemanticFileName) {
|
|
859
|
+
throw new Error(`[release-runtime] ZIP central and local Unicode path fields disagree (${params.entry.fileName})`);
|
|
860
|
+
}
|
|
861
|
+
if ((localFlags & 0x8) === 0) {
|
|
862
|
+
const localSizes = readLocalZipSizes({
|
|
863
|
+
compressedSize: localHeader.readUInt32LE(18),
|
|
864
|
+
extraFields: localExtraFields,
|
|
865
|
+
uncompressedSize: localHeader.readUInt32LE(22),
|
|
866
|
+
});
|
|
867
|
+
if (localHeader.readUInt32LE(14) !== params.entry.crc32
|
|
868
|
+
|| localSizes.compressedSize !== params.entry.compressedSize
|
|
869
|
+
|| localSizes.uncompressedSize !== params.entry.uncompressedSize) {
|
|
870
|
+
throw new Error(`[release-runtime] ZIP central and local headers disagree (${params.entry.fileName})`);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
const dataOffset = params.entry.relativeOffsetOfLocalHeader
|
|
874
|
+
+ localHeader.byteLength
|
|
875
|
+
+ fileNameBytes
|
|
876
|
+
+ extraFieldBytes;
|
|
877
|
+
const dataEnd = dataOffset + params.entry.compressedSize;
|
|
878
|
+
if (!Number.isSafeInteger(dataOffset)
|
|
879
|
+
|| dataOffset < 0
|
|
880
|
+
|| !Number.isSafeInteger(dataEnd)
|
|
881
|
+
|| dataEnd > params.centralDirectoryOffset) {
|
|
882
|
+
throw new Error(`[release-runtime] archive entry data enters the ZIP central directory (${params.entry.fileName})`);
|
|
883
|
+
}
|
|
884
|
+
let rangeEnd = dataEnd;
|
|
885
|
+
if ((localFlags & 0x8) !== 0) {
|
|
886
|
+
const descriptor = await readZipArchiveBytes({
|
|
887
|
+
...params,
|
|
888
|
+
byteLength: Math.min(24, params.centralDirectoryOffset - dataEnd),
|
|
889
|
+
position: dataEnd,
|
|
890
|
+
});
|
|
891
|
+
rangeEnd += readZipDataDescriptorSize({
|
|
892
|
+
descriptor,
|
|
893
|
+
entry: params.entry,
|
|
894
|
+
});
|
|
895
|
+
if (rangeEnd > params.centralDirectoryOffset) {
|
|
896
|
+
throw new Error(`[release-runtime] ZIP data descriptor enters the central directory (${params.entry.fileName})`);
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
return {
|
|
900
|
+
dataOffset,
|
|
901
|
+
rangeEnd,
|
|
902
|
+
rangeStart: params.entry.relativeOffsetOfLocalHeader,
|
|
903
|
+
};
|
|
904
|
+
}
|
|
905
|
+
function createZipPayloadVerifier(params) {
|
|
906
|
+
let byteLength = 0;
|
|
907
|
+
let checksum = 0;
|
|
908
|
+
return new Transform({
|
|
909
|
+
transform(chunk, _encoding, callback) {
|
|
910
|
+
byteLength += chunk.byteLength;
|
|
911
|
+
if (byteLength > params.entry.uncompressedSize) {
|
|
912
|
+
const error = new Error(`[release-runtime] ZIP entry expanded beyond its declared size (${params.entry.fileName})`);
|
|
913
|
+
params.abortContext.abort(error);
|
|
914
|
+
callback(error);
|
|
915
|
+
return;
|
|
916
|
+
}
|
|
917
|
+
checksum = updateCrc32(checksum, chunk);
|
|
918
|
+
callback(null, chunk);
|
|
919
|
+
},
|
|
920
|
+
flush(callback) {
|
|
921
|
+
if (byteLength !== params.entry.uncompressedSize) {
|
|
922
|
+
callback(new Error(`[release-runtime] ZIP entry size does not match its declaration (${params.entry.fileName})`));
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
925
|
+
if ((checksum >>> 0) !== (params.entry.crc32 >>> 0)) {
|
|
926
|
+
callback(new Error(`[release-runtime] ZIP entry checksum does not match its declaration (${params.entry.fileName})`));
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
callback();
|
|
930
|
+
},
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
async function extractValidatedZipEntry(params) {
|
|
934
|
+
params.abortContext.throwIfAborted();
|
|
935
|
+
if (params.entry.path === null)
|
|
936
|
+
return;
|
|
937
|
+
const outputPath = join(params.extractDir, ...params.entry.path.split('/'));
|
|
938
|
+
if (params.entry.kind === 'directory') {
|
|
939
|
+
await mkdir(outputPath, {
|
|
940
|
+
recursive: true,
|
|
941
|
+
mode: params.entry.mode || 0o755,
|
|
942
|
+
});
|
|
943
|
+
return;
|
|
944
|
+
}
|
|
945
|
+
await mkdir(dirname(outputPath), { recursive: true });
|
|
946
|
+
const payloadSource = params.entry.compressedSize === 0
|
|
947
|
+
? Readable.from([])
|
|
948
|
+
: createOpenArchiveRangeStream(params.archiveFile, params.entry.dataOffset, params.entry.dataOffset + params.entry.compressedSize);
|
|
949
|
+
const verifier = createZipPayloadVerifier(params);
|
|
950
|
+
const output = createWriteStream(outputPath, {
|
|
951
|
+
flags: 'wx',
|
|
952
|
+
mode: params.entry.mode || 0o644,
|
|
953
|
+
});
|
|
954
|
+
if (params.entry.compressionMethod === 8) {
|
|
955
|
+
const inflater = createInflateRaw();
|
|
956
|
+
await pipeline(payloadSource, inflater, verifier, output, { signal: params.abortContext.signal });
|
|
957
|
+
if (inflater.bytesWritten !== params.entry.compressedSize) {
|
|
958
|
+
throw new Error(`[release-runtime] ZIP deflate stream did not consume its declared compressed span (${params.entry.fileName})`);
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
else {
|
|
962
|
+
await pipeline(payloadSource, verifier, output, { signal: params.abortContext.signal });
|
|
963
|
+
}
|
|
964
|
+
params.abortContext.throwIfAborted();
|
|
965
|
+
}
|
|
966
|
+
async function extractZipArchiveToDirectory(params) {
|
|
967
|
+
const budget = createArchiveBudget({
|
|
968
|
+
archiveBytes: params.archiveBytes,
|
|
969
|
+
limits: params.limits,
|
|
970
|
+
});
|
|
971
|
+
const validateEntry = createZipEntryValidator({
|
|
972
|
+
allowedEntryRoots: params.allowedEntryRoots,
|
|
973
|
+
abortContext: params.abortContext,
|
|
974
|
+
budget,
|
|
975
|
+
});
|
|
976
|
+
const entries = await readValidatedZipEntries({
|
|
977
|
+
abortContext: params.abortContext,
|
|
978
|
+
archiveBytes: params.archiveBytes,
|
|
979
|
+
archiveFile: params.archiveFile,
|
|
980
|
+
validateEntry,
|
|
981
|
+
});
|
|
982
|
+
const centralDirectory = await readZipCentralDirectory({
|
|
983
|
+
abortContext: params.abortContext,
|
|
984
|
+
archiveBytes: params.archiveBytes,
|
|
985
|
+
archiveFile: params.archiveFile,
|
|
986
|
+
});
|
|
987
|
+
const entriesWithOffsets = [];
|
|
988
|
+
const ranges = [];
|
|
989
|
+
for (const entry of entries) {
|
|
990
|
+
params.abortContext.throwIfAborted();
|
|
991
|
+
const range = await readZipEntryDataOffset({
|
|
992
|
+
abortContext: params.abortContext,
|
|
993
|
+
archiveBytes: params.archiveBytes,
|
|
994
|
+
archiveFile: params.archiveFile,
|
|
995
|
+
centralDirectoryOffset: centralDirectory.offset,
|
|
996
|
+
entry,
|
|
997
|
+
});
|
|
998
|
+
entriesWithOffsets.push({
|
|
999
|
+
...entry,
|
|
1000
|
+
dataOffset: range.dataOffset,
|
|
1001
|
+
});
|
|
1002
|
+
ranges.push({ ...range, fileName: entry.fileName });
|
|
1003
|
+
}
|
|
1004
|
+
ranges.sort((left, right) => left.rangeStart - right.rangeStart);
|
|
1005
|
+
for (let index = 1; index < ranges.length; index += 1) {
|
|
1006
|
+
const previous = ranges[index - 1];
|
|
1007
|
+
const current = ranges[index];
|
|
1008
|
+
if (current.rangeStart < previous.rangeEnd) {
|
|
1009
|
+
throw new Error(`[release-runtime] ZIP local header and payload ranges overlap (${previous.fileName}, ${current.fileName})`);
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
for (const entry of entriesWithOffsets) {
|
|
1013
|
+
await extractValidatedZipEntry({
|
|
1014
|
+
abortContext: params.abortContext,
|
|
1015
|
+
archiveFile: params.archiveFile,
|
|
1016
|
+
entry,
|
|
1017
|
+
extractDir: params.extractDir,
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
export async function extractFirstPartyReleaseArchiveToDirectory(params) {
|
|
1022
|
+
await extractArchivePayloadToDirectory({
|
|
1023
|
+
...params,
|
|
1024
|
+
tarLinkPolicy: params.tarLinkPolicy ?? 'skip',
|
|
1025
|
+
limits: {
|
|
1026
|
+
...FIRST_PARTY_RELEASE_ARCHIVE_EXTRACTION_LIMITS,
|
|
1027
|
+
...params.limits,
|
|
1028
|
+
},
|
|
1029
|
+
});
|
|
1030
|
+
}
|
|
1031
|
+
export async function extractArchivePayloadToDirectory(params) {
|
|
1032
|
+
const archiveName = params.archiveName.toLowerCase();
|
|
1033
|
+
const archiveType = archiveName.endsWith('.zip')
|
|
1034
|
+
? 'zip'
|
|
1035
|
+
: archiveName.endsWith('.tar.xz')
|
|
1036
|
+
? 'tar.xz'
|
|
1037
|
+
: archiveName.endsWith('.tar.gz') || archiveName.endsWith('.tgz')
|
|
1038
|
+
? 'tar.gz'
|
|
1039
|
+
: null;
|
|
1040
|
+
if (!archiveType) {
|
|
1041
|
+
throw new Error(`[release-runtime] unsupported archive type: ${params.archiveName}`);
|
|
1042
|
+
}
|
|
1043
|
+
const limits = mergeArchiveExtractionLimits(params.limits);
|
|
1044
|
+
const { archiveFile, archiveBytes } = await openArchiveSource(params.archivePath, limits);
|
|
1045
|
+
let abortContext;
|
|
1046
|
+
try {
|
|
1047
|
+
abortContext = createArchiveAbortContext({
|
|
1048
|
+
externalSignal: params.signal,
|
|
1049
|
+
timeoutMs: limits.timeoutMs,
|
|
1050
|
+
});
|
|
1051
|
+
}
|
|
1052
|
+
catch (error) {
|
|
1053
|
+
await archiveFile.close().catch(() => undefined);
|
|
1054
|
+
throw error;
|
|
1055
|
+
}
|
|
1056
|
+
const extractDir = resolve(params.extractDir);
|
|
1057
|
+
let stagingDir = null;
|
|
1058
|
+
try {
|
|
1059
|
+
abortContext.throwIfAborted();
|
|
1060
|
+
const destinationExisted = await assertEmptyExtractionDestination(extractDir);
|
|
1061
|
+
const stagingParent = dirname(extractDir);
|
|
1062
|
+
await mkdir(stagingParent, { recursive: true });
|
|
1063
|
+
stagingDir = await mkdtemp(join(stagingParent, `.${basename(extractDir)}.extract-`));
|
|
1064
|
+
abortContext.throwIfAborted();
|
|
1065
|
+
if (archiveType === 'zip') {
|
|
1066
|
+
await extractZipArchiveToDirectory({
|
|
1067
|
+
abortContext,
|
|
1068
|
+
allowedEntryRoots: params.allowedEntryRoots,
|
|
1069
|
+
archiveBytes,
|
|
1070
|
+
archiveFile,
|
|
1071
|
+
extractDir: stagingDir,
|
|
1072
|
+
limits,
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
else {
|
|
1076
|
+
await extractTarArchiveToDirectory({
|
|
1077
|
+
abortContext,
|
|
1078
|
+
allowedEntryRoots: params.allowedEntryRoots,
|
|
1079
|
+
archiveBytes,
|
|
1080
|
+
archiveFile,
|
|
1081
|
+
extractDir: stagingDir,
|
|
1082
|
+
isXz: archiveType === 'tar.xz',
|
|
1083
|
+
limits,
|
|
1084
|
+
linkPolicy: params.tarLinkPolicy ?? 'reject',
|
|
1085
|
+
});
|
|
1086
|
+
}
|
|
1087
|
+
abortContext.throwIfAborted();
|
|
1088
|
+
await publishStagedExtraction({
|
|
1089
|
+
destinationExisted,
|
|
1090
|
+
extractDir,
|
|
1091
|
+
stagingDir,
|
|
1092
|
+
});
|
|
1093
|
+
stagingDir = null;
|
|
1094
|
+
}
|
|
1095
|
+
catch (error) {
|
|
1096
|
+
let failure = error;
|
|
1097
|
+
try {
|
|
1098
|
+
abortContext.throwIfAborted();
|
|
1099
|
+
}
|
|
1100
|
+
catch (abortError) {
|
|
1101
|
+
failure = abortError;
|
|
1102
|
+
}
|
|
1103
|
+
if (stagingDir) {
|
|
1104
|
+
try {
|
|
1105
|
+
await rm(stagingDir, {
|
|
1106
|
+
recursive: true,
|
|
1107
|
+
force: true,
|
|
1108
|
+
maxRetries: 3,
|
|
1109
|
+
retryDelay: 10,
|
|
1110
|
+
});
|
|
1111
|
+
}
|
|
1112
|
+
catch (cleanupError) {
|
|
1113
|
+
throw new AggregateError([failure, cleanupError], '[release-runtime] archive extraction failed and partial output cleanup also failed');
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
throw failure;
|
|
1117
|
+
}
|
|
1118
|
+
finally {
|
|
1119
|
+
abortContext.dispose();
|
|
1120
|
+
await archiveFile.close().catch(() => undefined);
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
//# sourceMappingURL=archiveExtraction.js.map
|