extract-base-iterator 3.4.2 → 3.4.4
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/dist/cjs/DirectoryEntry.js +2 -1
- package/dist/cjs/DirectoryEntry.js.map +1 -1
- package/dist/cjs/FileEntry.js +2 -1
- package/dist/cjs/FileEntry.js.map +1 -1
- package/dist/cjs/LinkEntry.js +9 -2
- package/dist/cjs/LinkEntry.js.map +1 -1
- package/dist/cjs/SymbolicLinkEntry.js +12 -7
- package/dist/cjs/SymbolicLinkEntry.js.map +1 -1
- package/dist/cjs/shared/compat.d.cts +1 -0
- package/dist/cjs/shared/compat.d.ts +1 -0
- package/dist/cjs/shared/compat.js +13 -0
- package/dist/cjs/shared/compat.js.map +1 -1
- package/dist/cjs/shared/index.d.cts +1 -0
- package/dist/cjs/shared/index.d.ts +1 -0
- package/dist/cjs/shared/index.js +4 -0
- package/dist/cjs/shared/index.js.map +1 -1
- package/dist/cjs/shared/safeJoinPath.d.cts +1 -0
- package/dist/cjs/shared/safeJoinPath.d.ts +1 -0
- package/dist/cjs/shared/safeJoinPath.js +28 -0
- package/dist/cjs/shared/safeJoinPath.js.map +1 -0
- package/dist/esm/DirectoryEntry.js +2 -1
- package/dist/esm/DirectoryEntry.js.map +1 -1
- package/dist/esm/FileEntry.js +2 -1
- package/dist/esm/FileEntry.js.map +1 -1
- package/dist/esm/LinkEntry.js +9 -2
- package/dist/esm/LinkEntry.js.map +1 -1
- package/dist/esm/SymbolicLinkEntry.js +12 -7
- package/dist/esm/SymbolicLinkEntry.js.map +1 -1
- package/dist/esm/shared/compat.d.ts +1 -0
- package/dist/esm/shared/compat.js +10 -0
- package/dist/esm/shared/compat.js.map +1 -1
- package/dist/esm/shared/index.d.ts +1 -0
- package/dist/esm/shared/index.js +1 -0
- package/dist/esm/shared/index.js.map +1 -1
- package/dist/esm/shared/safeJoinPath.d.ts +1 -0
- package/dist/esm/shared/safeJoinPath.js +12 -0
- package/dist/esm/shared/safeJoinPath.js.map +1 -0
- package/package.json +1 -1
|
@@ -15,6 +15,7 @@ var _chmodts = /*#__PURE__*/ _interop_require_default(require("./fs/chmod.js"));
|
|
|
15
15
|
var _chownts = /*#__PURE__*/ _interop_require_default(require("./fs/chown.js"));
|
|
16
16
|
var _utimests = /*#__PURE__*/ _interop_require_default(require("./fs/utimes.js"));
|
|
17
17
|
var _indexts = require("./shared/index.js");
|
|
18
|
+
var _safeJoinPathts = /*#__PURE__*/ _interop_require_default(require("./shared/safeJoinPath.js"));
|
|
18
19
|
var _stripPathts = /*#__PURE__*/ _interop_require_default(require("./shared/stripPath.js"));
|
|
19
20
|
var _validateAttributests = /*#__PURE__*/ _interop_require_default(require("./validateAttributes.js"));
|
|
20
21
|
var _waitForAccessts = /*#__PURE__*/ _interop_require_default(require("./waitForAccess.js"));
|
|
@@ -50,7 +51,7 @@ var DirectoryEntry = /*#__PURE__*/ function() {
|
|
|
50
51
|
if (typeof callback === 'function') {
|
|
51
52
|
try {
|
|
52
53
|
var normalizedPath = _path.default.normalize(this.path);
|
|
53
|
-
var fullPath =
|
|
54
|
+
var fullPath = (0, _safeJoinPathts.default)(dest, (0, _stripPathts.default)(normalizedPath, options));
|
|
54
55
|
// do not check for the existence of the directory but allow out-of-order calling
|
|
55
56
|
var queue = new _queuecb.default(1);
|
|
56
57
|
queue.defer(_mkdirpclassic.default.bind(null, fullPath));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/DirectoryEntry.ts"],"sourcesContent":["import mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { DirectoryAttributes, ExtractOptions, NoParamCallback } from './types.ts';\n\nexport default class DirectoryEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: DirectoryAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.type === undefined) this.type = 'directory';\n if (this.basename === undefined) this.basename = path.basename(this.path);\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath =
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/DirectoryEntry.ts"],"sourcesContent":["import mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport safeJoinPath from './shared/safeJoinPath.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { DirectoryAttributes, ExtractOptions, NoParamCallback } from './types.ts';\n\nexport default class DirectoryEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: DirectoryAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.type === undefined) this.type = 'directory';\n if (this.basename === undefined) this.basename = path.basename(this.path);\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));\n\n // do not check for the existence of the directory but allow out-of-order calling\n const queue = new Queue(1);\n queue.defer(mkdirp.bind(null, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n } catch (err) {\n callback(err);\n }\n return;\n }\n\n return new Promise((resolve, reject) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\n }\n\n destroy() {}\n}\n"],"names":["DirectoryEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","type","undefined","basename","path","create","dest","options","callback","normalizedPath","normalize","fullPath","safeJoinPath","stripPath","queue","Queue","defer","mkdirp","bind","waitForAccess","chmod","chown","utimes","await","err","Promise","resolve","reject","done","destroy"],"mappings":";;;;;;;eAiBqBA;;;oEAjBF;2DACF;8DACC;8DACA;8DACA;+DACC;uBACU;qEACJ;kEACH;2EACS;sEACL;;;;;;;;;;;AAE1B,IAAMC,uBAAuB;IAAC;IAAQ;IAAS;CAAO;AAKvC,IAAA,AAAMD,+BAAN;;aAAMA,eAOPE,UAA+B;gCAPxBF;QAQjBG,IAAAA,6BAAkB,EAACD,YAAYD;QAC/BG,IAAAA,qBAAY,EAAC,IAAI,EAAEF;QACnB,IAAI,IAAI,CAACG,IAAI,KAAKC,WAAW,IAAI,CAACD,IAAI,GAAG;QACzC,IAAI,IAAI,CAACE,QAAQ,KAAKD,WAAW,IAAI,CAACC,QAAQ,GAAGC,aAAI,CAACD,QAAQ,CAAC,IAAI,CAACC,IAAI;;iBAXvDR;IAiBnBS,OAAAA,MAwBC,GAxBDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,IAAI;gBACF,IAAMC,iBAAiBL,aAAI,CAACM,SAAS,CAAC,IAAI,CAACN,IAAI;gBAC/C,IAAMO,WAAWC,IAAAA,uBAAY,EAACN,MAAMO,IAAAA,oBAAS,EAACJ,gBAAgBF;gBAE9D,iFAAiF;gBACjF,IAAMO,QAAQ,IAAIC,gBAAK,CAAC;gBACxBD,MAAME,KAAK,CAACC,sBAAM,CAACC,IAAI,CAAC,MAAMP;gBAC9BG,MAAME,KAAK,CAACG,wBAAa,CAACD,IAAI,CAAC,MAAMP;gBACrCG,MAAME,KAAK,CAACI,gBAAK,CAACF,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC7CO,MAAME,KAAK,CAACK,gBAAK,CAACH,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC7CO,MAAME,KAAK,CAACM,iBAAM,CAACJ,IAAI,CAAC,MAAMP,UAAU,IAAI,EAAEJ;gBAC9CO,MAAMS,KAAK,CAACf;YACd,EAAE,OAAOgB,KAAK;gBACZhB,SAASgB;YACX;YACA;QACF;QAEA,OAAO,IAAIC,QAAQ,SAACC,SAASC;mBAAW,MAAKtB,MAAM,CAACC,MAAMC,SAAS,SAACiB,KAAaI;uBAAoBJ,MAAMG,OAAOH,OAAOE,QAAQE;;;IACnI;IAEAC,OAAAA,OAAY,GAAZA,SAAAA,WAAW;WA3CQjC"}
|
package/dist/cjs/FileEntry.js
CHANGED
|
@@ -17,6 +17,7 @@ var _chmodts = /*#__PURE__*/ _interop_require_default(require("./fs/chmod.js"));
|
|
|
17
17
|
var _chownts = /*#__PURE__*/ _interop_require_default(require("./fs/chown.js"));
|
|
18
18
|
var _utimests = /*#__PURE__*/ _interop_require_default(require("./fs/utimes.js"));
|
|
19
19
|
var _indexts = require("./shared/index.js");
|
|
20
|
+
var _safeJoinPathts = /*#__PURE__*/ _interop_require_default(require("./shared/safeJoinPath.js"));
|
|
20
21
|
var _stripPathts = /*#__PURE__*/ _interop_require_default(require("./shared/stripPath.js"));
|
|
21
22
|
var _validateAttributests = /*#__PURE__*/ _interop_require_default(require("./validateAttributes.js"));
|
|
22
23
|
var _waitForAccessts = /*#__PURE__*/ _interop_require_default(require("./waitForAccess.js"));
|
|
@@ -53,7 +54,7 @@ var FileEntry = /*#__PURE__*/ function() {
|
|
|
53
54
|
if (typeof callback === 'function') {
|
|
54
55
|
try {
|
|
55
56
|
var normalizedPath = _path.default.normalize(this.path);
|
|
56
|
-
var fullPath =
|
|
57
|
+
var fullPath = (0, _safeJoinPathts.default)(dest, (0, _stripPathts.default)(normalizedPath, options));
|
|
57
58
|
var queue = new _queuecb.default(1);
|
|
58
59
|
if (options.force) {
|
|
59
60
|
queue.defer(function(callback) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/FileEntry.ts"],"sourcesContent":["import { rm } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, FileAttributes, NoParamCallback, WriteFileFn } from './types.ts';\n\ninterface AbstractFileEntry {\n _writeFile: WriteFileFn;\n}\n\nexport default class FileEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: FileAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'file';\n if ((this as unknown as AbstractFileEntry)._writeFile === undefined) throw new Error('File this missing _writeFile. Please implement this method in your subclass');\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath =
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/FileEntry.ts"],"sourcesContent":["import { rm } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport safeJoinPath from './shared/safeJoinPath.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, FileAttributes, NoParamCallback, WriteFileFn } from './types.ts';\n\ninterface AbstractFileEntry {\n _writeFile: WriteFileFn;\n}\n\nexport default class FileEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: FileAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'file';\n if ((this as unknown as AbstractFileEntry)._writeFile === undefined) throw new Error('File this missing _writeFile. Please implement this method in your subclass');\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n } else {\n // Check if file exists - throw EEXIST if it does\n queue.defer((callback) => {\n fs.stat(fullPath, (err) => {\n if (!err) {\n const existsErr = new Error(`EEXIST: file already exists, open '${fullPath}'`) as NodeJS.ErrnoException;\n existsErr.code = 'EEXIST';\n existsErr.path = fullPath;\n return callback(existsErr);\n }\n // ENOENT means file doesn't exist - that's what we want\n if (err.code === 'ENOENT') return callback();\n // Other errors should be reported\n callback(err);\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n queue.defer((this as unknown as AbstractFileEntry)._writeFile.bind(this, fullPath, options));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n } catch (err) {\n callback(err);\n }\n return;\n }\n\n return new Promise((resolve, reject) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\n }\n\n destroy() {}\n}\n"],"names":["FileEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","_writeFile","Error","create","dest","options","callback","normalizedPath","normalize","fullPath","safeJoinPath","stripPath","queue","Queue","force","defer","rm","err","code","fs","stat","existsErr","mkdirp","bind","dirname","waitForAccess","chmod","chown","utimes","await","Promise","resolve","reject","done","destroy"],"mappings":";;;;;;;eAuBqBA;;;8BAvBF;iEACJ;oEACI;2DACF;8DACC;8DACA;8DACA;+DACC;uBACU;qEACJ;kEACH;2EACS;sEACL;;;;;;;;;;;AAE1B,IAAMC,uBAAuB;IAAC;IAAQ;IAAS;CAAO;AASvC,IAAA,AAAMD,0BAAN;;aAAMA,UAOPE,UAA0B;gCAPnBF;QAQjBG,IAAAA,6BAAkB,EAACD,YAAYD;QAC/BG,IAAAA,qBAAY,EAAC,IAAI,EAAEF;QACnB,IAAI,IAAI,CAACG,QAAQ,KAAKC,WAAW,IAAI,CAACD,QAAQ,GAAGE,aAAI,CAACF,QAAQ,CAAC,IAAI,CAACE,IAAI;QACxE,IAAI,IAAI,CAACC,IAAI,KAAKF,WAAW,IAAI,CAACE,IAAI,GAAG;QACzC,IAAI,AAAC,IAAI,CAAkCC,UAAU,KAAKH,WAAW,MAAM,IAAII,MAAM;;iBAZpEV;IAkBnBW,OAAAA,MA+CC,GA/CDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,IAAI;gBACF,IAAMC,iBAAiBR,aAAI,CAACS,SAAS,CAAC,IAAI,CAACT,IAAI;gBAC/C,IAAMU,WAAWC,IAAAA,uBAAY,EAACN,MAAMO,IAAAA,oBAAS,EAACJ,gBAAgBF;gBAE9D,IAAMO,QAAQ,IAAIC,gBAAK,CAAC;gBACxB,IAAIR,QAAQS,KAAK,EAAE;oBACjBF,MAAMG,KAAK,CAAC,SAACT;wBACXU,IAAAA,kBAAE,EAACP,UAAU,SAACQ;4BACZA,OAAOA,IAAIC,IAAI,KAAK,WAAWZ,SAASW,OAAOX;wBACjD;oBACF;gBACF,OAAO;oBACL,iDAAiD;oBACjDM,MAAMG,KAAK,CAAC,SAACT;wBACXa,mBAAE,CAACC,IAAI,CAACX,UAAU,SAACQ;4BACjB,IAAI,CAACA,KAAK;gCACR,IAAMI,YAAY,IAAInB,MAAM,AAAC,sCAA8C,OAATO,UAAS;gCAC3EY,UAAUH,IAAI,GAAG;gCACjBG,UAAUtB,IAAI,GAAGU;gCACjB,OAAOH,SAASe;4BAClB;4BACA,wDAAwD;4BACxD,IAAIJ,IAAIC,IAAI,KAAK,UAAU,OAAOZ;4BAClC,kCAAkC;4BAClCA,SAASW;wBACX;oBACF;gBACF;gBACAL,MAAMG,KAAK,CAACO,sBAAM,CAACC,IAAI,CAAC,MAAMxB,aAAI,CAACyB,OAAO,CAACf;gBAC3CG,MAAMG,KAAK,CAAC,AAAC,IAAI,CAAkCd,UAAU,CAACsB,IAAI,CAAC,IAAI,EAAEd,UAAUJ;gBACnFO,MAAMG,KAAK,CAACU,wBAAa,CAACF,IAAI,CAAC,MAAMd;gBACrCG,MAAMG,KAAK,CAACW,gBAAK,CAACH,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC7CO,MAAMG,KAAK,CAACY,gBAAK,CAACJ,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC7CO,MAAMG,KAAK,CAACa,iBAAM,CAACL,IAAI,CAAC,MAAMd,UAAU,IAAI,EAAEJ;gBAC9CO,MAAMiB,KAAK,CAACvB;YACd,EAAE,OAAOW,KAAK;gBACZX,SAASW;YACX;YACA;QACF;QAEA,OAAO,IAAIa,QAAQ,SAACC,SAASC;mBAAW,MAAK7B,MAAM,CAACC,MAAMC,SAAS,SAACY,KAAagB;uBAAoBhB,MAAMe,OAAOf,OAAOc,QAAQE;;;IACnI;IAEAC,OAAAA,OAAY,GAAZA,SAAAA,WAAW;WAnEQ1C"}
|
package/dist/cjs/LinkEntry.js
CHANGED
|
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "default", {
|
|
|
10
10
|
});
|
|
11
11
|
var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
12
|
var _fsremovecompat = require("fs-remove-compat");
|
|
13
|
+
var _isabsolute = /*#__PURE__*/ _interop_require_default(require("is-absolute"));
|
|
13
14
|
var _mkdirpclassic = /*#__PURE__*/ _interop_require_default(require("mkdirp-classic"));
|
|
14
15
|
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
15
16
|
var _queuecb = /*#__PURE__*/ _interop_require_default(require("queue-cb"));
|
|
@@ -17,6 +18,7 @@ var _chmodts = /*#__PURE__*/ _interop_require_default(require("./fs/chmod.js"));
|
|
|
17
18
|
var _chownts = /*#__PURE__*/ _interop_require_default(require("./fs/chown.js"));
|
|
18
19
|
var _utimests = /*#__PURE__*/ _interop_require_default(require("./fs/utimes.js"));
|
|
19
20
|
var _indexts = require("./shared/index.js");
|
|
21
|
+
var _safeJoinPathts = /*#__PURE__*/ _interop_require_default(require("./shared/safeJoinPath.js"));
|
|
20
22
|
var _stripPathts = /*#__PURE__*/ _interop_require_default(require("./shared/stripPath.js"));
|
|
21
23
|
var _validateAttributests = /*#__PURE__*/ _interop_require_default(require("./validateAttributes.js"));
|
|
22
24
|
var _waitForAccessts = /*#__PURE__*/ _interop_require_default(require("./waitForAccess.js"));
|
|
@@ -53,9 +55,14 @@ var LinkEntry = /*#__PURE__*/ function() {
|
|
|
53
55
|
if (typeof callback === 'function') {
|
|
54
56
|
try {
|
|
55
57
|
var normalizedPath = _path.default.normalize(this.path);
|
|
56
|
-
var fullPath =
|
|
58
|
+
var fullPath = (0, _safeJoinPathts.default)(dest, (0, _stripPathts.default)(normalizedPath, options));
|
|
59
|
+
if ((0, _isabsolute.default)(this.linkpath)) {
|
|
60
|
+
var _$err = new Error("Absolute linkpath rejected: '".concat(this.linkpath, "'"));
|
|
61
|
+
_$err.code = 'ETRAVERSAL';
|
|
62
|
+
throw _$err;
|
|
63
|
+
}
|
|
57
64
|
var normalizedLinkpath = _path.default.normalize(this.linkpath);
|
|
58
|
-
var linkFullPath =
|
|
65
|
+
var linkFullPath = (0, _safeJoinPathts.default)(dest, (0, _stripPathts.default)(normalizedLinkpath, options));
|
|
59
66
|
var queue = new _queuecb.default(1);
|
|
60
67
|
if (options.force) {
|
|
61
68
|
queue.defer(function(callback) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/LinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class LinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'link';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath =
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/LinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport isAbsolute from 'is-absolute';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport safeJoinPath from './shared/safeJoinPath.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class LinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'link';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));\n if (isAbsolute(this.linkpath)) {\n const err = new Error(`Absolute linkpath rejected: '${this.linkpath}'`) as NodeJS.ErrnoException;\n err.code = 'ETRAVERSAL';\n throw err;\n }\n const normalizedLinkpath = path.normalize(this.linkpath);\n const linkFullPath = safeJoinPath(dest, stripPath(normalizedLinkpath, options));\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n queue.defer(waitForAccess.bind(null, linkFullPath)); // ensure target file is accessible before linking\n queue.defer(fs.link.bind(fs, linkFullPath, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n } catch (err) {\n callback(err);\n }\n return;\n }\n\n return new Promise((resolve, reject) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\n }\n\n destroy() {}\n}\n"],"names":["LinkEntry","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","create","dest","options","callback","normalizedPath","normalize","fullPath","safeJoinPath","stripPath","isAbsolute","linkpath","err","Error","code","normalizedLinkpath","linkFullPath","queue","Queue","force","defer","rm","mkdirp","bind","dirname","waitForAccess","fs","link","chmod","chown","utimes","await","Promise","resolve","reject","done","destroy"],"mappings":";;;;;;;eAoBqBA;;;yDApBN;8BACI;iEACI;oEACJ;2DACF;8DACC;8DACA;8DACA;+DACC;uBACU;qEACJ;kEACH;2EACS;sEACL;;;;;;;;;;;AAE1B,IAAMC,uBAAuB;IAAC;IAAQ;IAAS;IAAQ;CAAW;AAKnD,IAAA,AAAMD,0BAAN;;aAAMA,UAQPE,UAA0B;gCARnBF;QASjBG,IAAAA,6BAAkB,EAACD,YAAYD;QAC/BG,IAAAA,qBAAY,EAAC,IAAI,EAAEF;QACnB,IAAI,IAAI,CAACG,QAAQ,KAAKC,WAAW,IAAI,CAACD,QAAQ,GAAGE,aAAI,CAACF,QAAQ,CAAC,IAAI,CAACE,IAAI;QACxE,IAAI,IAAI,CAACC,IAAI,KAAKF,WAAW,IAAI,CAACE,IAAI,GAAG;;iBAZxBR;IAkBnBS,OAAAA,MAuCC,GAvCDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,IAAI;gBACF,IAAMC,iBAAiBN,aAAI,CAACO,SAAS,CAAC,IAAI,CAACP,IAAI;gBAC/C,IAAMQ,WAAWC,IAAAA,uBAAY,EAACN,MAAMO,IAAAA,oBAAS,EAACJ,gBAAgBF;gBAC9D,IAAIO,IAAAA,mBAAU,EAAC,IAAI,CAACC,QAAQ,GAAG;oBAC7B,IAAMC,QAAM,IAAIC,MAAM,AAAC,gCAA6C,OAAd,IAAI,CAACF,QAAQ,EAAC;oBACpEC,MAAIE,IAAI,GAAG;oBACX,MAAMF;gBACR;gBACA,IAAMG,qBAAqBhB,aAAI,CAACO,SAAS,CAAC,IAAI,CAACK,QAAQ;gBACvD,IAAMK,eAAeR,IAAAA,uBAAY,EAACN,MAAMO,IAAAA,oBAAS,EAACM,oBAAoBZ;gBAEtE,IAAMc,QAAQ,IAAIC,gBAAK,CAAC;gBACxB,IAAIf,QAAQgB,KAAK,EAAE;oBACjBF,MAAMG,KAAK,CAAC,SAAChB;wBACXiB,IAAAA,kBAAE,EAACd,UAAU,SAACK;4BACZA,OAAOA,IAAIE,IAAI,KAAK,WAAWV,SAASQ,OAAOR;wBACjD;oBACF;gBACF;gBACAa,MAAMG,KAAK,CAACE,sBAAM,CAACC,IAAI,CAAC,MAAMxB,aAAI,CAACyB,OAAO,CAACjB;gBAC3CU,MAAMG,KAAK,CAACK,wBAAa,CAACF,IAAI,CAAC,MAAMP,gBAAgB,kDAAkD;gBACvGC,MAAMG,KAAK,CAACM,WAAE,CAACC,IAAI,CAACJ,IAAI,CAACG,WAAE,EAAEV,cAAcT;gBAC3CU,MAAMG,KAAK,CAACK,wBAAa,CAACF,IAAI,CAAC,MAAMhB;gBACrCU,MAAMG,KAAK,CAACQ,gBAAK,CAACL,IAAI,CAAC,MAAMhB,UAAU,IAAI,EAAEJ;gBAC7Cc,MAAMG,KAAK,CAACS,gBAAK,CAACN,IAAI,CAAC,MAAMhB,UAAU,IAAI,EAAEJ;gBAC7Cc,MAAMG,KAAK,CAACU,iBAAM,CAACP,IAAI,CAAC,MAAMhB,UAAU,IAAI,EAAEJ;gBAC9Cc,MAAMc,KAAK,CAAC3B;YACd,EAAE,OAAOQ,KAAK;gBACZR,SAASQ;YACX;YACA;QACF;QAEA,OAAO,IAAIoB,QAAQ,SAACC,SAASC;mBAAW,MAAKjC,MAAM,CAACC,MAAMC,SAAS,SAACS,KAAauB;uBAAoBvB,MAAMsB,OAAOtB,OAAOqB,QAAQE;;;IACnI;IAEAC,OAAAA,OAAY,GAAZA,SAAAA,WAAW;WA3DQ5C"}
|
|
@@ -19,6 +19,7 @@ var _chownts = /*#__PURE__*/ _interop_require_default(require("./fs/chown.js"));
|
|
|
19
19
|
var _lutimests = /*#__PURE__*/ _interop_require_default(require("./fs/lutimes.js"));
|
|
20
20
|
var _symlinkWin32ts = /*#__PURE__*/ _interop_require_default(require("./fs/symlinkWin32.js"));
|
|
21
21
|
var _indexts = require("./shared/index.js");
|
|
22
|
+
var _safeJoinPathts = /*#__PURE__*/ _interop_require_default(require("./shared/safeJoinPath.js"));
|
|
22
23
|
var _stripPathts = /*#__PURE__*/ _interop_require_default(require("./shared/stripPath.js"));
|
|
23
24
|
var _validateAttributests = /*#__PURE__*/ _interop_require_default(require("./validateAttributes.js"));
|
|
24
25
|
var _waitForAccessts = /*#__PURE__*/ _interop_require_default(require("./waitForAccess.js"));
|
|
@@ -56,14 +57,18 @@ var SymbolicLinkEntry = /*#__PURE__*/ function() {
|
|
|
56
57
|
if (typeof callback === 'function') {
|
|
57
58
|
try {
|
|
58
59
|
var normalizedPath = _path.default.normalize(this.path);
|
|
59
|
-
var fullPath =
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
linkFullPath = _path.default.join(dest, (0, _stripPathts.default)(linkRelativePath, options));
|
|
65
|
-
normalizedLinkpath = _path.default.relative(_path.default.dirname(fullPath), linkFullPath);
|
|
60
|
+
var fullPath = (0, _safeJoinPathts.default)(dest, (0, _stripPathts.default)(normalizedPath, options));
|
|
61
|
+
if ((0, _isabsolute.default)(this.linkpath)) {
|
|
62
|
+
var _$err = new Error("Absolute linkpath rejected: '".concat(this.linkpath, "'"));
|
|
63
|
+
_$err.code = 'ETRAVERSAL';
|
|
64
|
+
throw _$err;
|
|
66
65
|
}
|
|
66
|
+
// Resolve the symlink target against the symlink's own directory and verify it
|
|
67
|
+
// stays within dest. safeJoinPath throws ETRAVERSAL if it escapes.
|
|
68
|
+
var targetAbs = _path.default.resolve(_path.default.dirname(fullPath), this.linkpath);
|
|
69
|
+
(0, _safeJoinPathts.default)(dest, _path.default.relative(dest, targetAbs));
|
|
70
|
+
var normalizedLinkpath = _path.default.relative(_path.default.dirname(fullPath), targetAbs);
|
|
71
|
+
var linkFullPath = targetAbs;
|
|
67
72
|
var queue = new _queuecb.default(1);
|
|
68
73
|
if (options.force) {
|
|
69
74
|
queue.defer(function(callback) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/SymbolicLinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport isAbsolute from 'is-absolute';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport lutimes from './fs/lutimes.ts';\nimport symlinkWin32 from './fs/symlinkWin32.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class SymbolicLinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'symlink';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath =
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/SymbolicLinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport isAbsolute from 'is-absolute';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport lutimes from './fs/lutimes.ts';\nimport symlinkWin32 from './fs/symlinkWin32.ts';\nimport { objectAssign } from './shared/index.ts';\nimport safeJoinPath from './shared/safeJoinPath.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class SymbolicLinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'symlink';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));\n\n if (isAbsolute(this.linkpath)) {\n const err = new Error(`Absolute linkpath rejected: '${this.linkpath}'`) as NodeJS.ErrnoException;\n err.code = 'ETRAVERSAL';\n throw err;\n }\n // Resolve the symlink target against the symlink's own directory and verify it\n // stays within dest. safeJoinPath throws ETRAVERSAL if it escapes.\n const targetAbs = path.resolve(path.dirname(fullPath), this.linkpath);\n safeJoinPath(dest, path.relative(dest, targetAbs));\n const normalizedLinkpath = path.relative(path.dirname(fullPath), targetAbs);\n const linkFullPath = targetAbs;\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n if (isWindows) queue.defer(symlinkWin32.bind(null, linkFullPath, normalizedLinkpath, fullPath));\n else queue.defer(fs.symlink.bind(fs, normalizedLinkpath, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath, true)); // noFollow=true for symlinks\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(lutimes.bind(null, fullPath, this, options));\n queue.await(callback);\n } catch (err) {\n callback(err);\n }\n return;\n }\n\n return new Promise((resolve, reject) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\n }\n\n destroy() {}\n}\n"],"names":["SymbolicLinkEntry","isWindows","process","platform","test","env","OSTYPE","MANDATORY_ATTRIBUTES","attributes","validateAttributes","objectAssign","basename","undefined","path","type","create","dest","options","callback","normalizedPath","normalize","fullPath","safeJoinPath","stripPath","isAbsolute","linkpath","err","Error","code","targetAbs","resolve","dirname","relative","normalizedLinkpath","linkFullPath","queue","Queue","force","defer","rm","mkdirp","bind","symlinkWin32","fs","symlink","waitForAccess","chmod","chown","lutimes","await","Promise","reject","done","destroy"],"mappings":"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"}
|
|
@@ -85,6 +85,7 @@ export declare function bufferConcat(list: (Buffer | Uint8Array)[], totalLength?
|
|
|
85
85
|
* Uses self-comparison: NaN is the only value not equal to itself
|
|
86
86
|
*/
|
|
87
87
|
export declare function isNaN(value: number): boolean;
|
|
88
|
+
export declare function stringStartsWith(str: string, search: string, position?: number): boolean;
|
|
88
89
|
export declare function inflateRaw(input: Buffer): Buffer;
|
|
89
90
|
export declare function createInflateRawStream(): NodeJS.ReadWriteStream;
|
|
90
91
|
export declare function objectAssign<T, U>(target: T, source: U): T & U;
|
|
@@ -85,6 +85,7 @@ export declare function bufferConcat(list: (Buffer | Uint8Array)[], totalLength?
|
|
|
85
85
|
* Uses self-comparison: NaN is the only value not equal to itself
|
|
86
86
|
*/
|
|
87
87
|
export declare function isNaN(value: number): boolean;
|
|
88
|
+
export declare function stringStartsWith(str: string, search: string, position?: number): boolean;
|
|
88
89
|
export declare function inflateRaw(input: Buffer): Buffer;
|
|
89
90
|
export declare function createInflateRawStream(): NodeJS.ReadWriteStream;
|
|
90
91
|
export declare function objectAssign<T, U>(target: T, source: U): T & U;
|
|
@@ -76,6 +76,9 @@ _export(exports, {
|
|
|
76
76
|
get readUInt64LE () {
|
|
77
77
|
return readUInt64LE;
|
|
78
78
|
},
|
|
79
|
+
get stringStartsWith () {
|
|
80
|
+
return stringStartsWith;
|
|
81
|
+
},
|
|
79
82
|
get writeUInt64LE () {
|
|
80
83
|
return writeUInt64LE;
|
|
81
84
|
}
|
|
@@ -318,6 +321,16 @@ function isNaN(value) {
|
|
|
318
321
|
// biome-ignore lint/suspicious/noSelfCompare: NaN check pattern
|
|
319
322
|
return value !== value;
|
|
320
323
|
}
|
|
324
|
+
/**
|
|
325
|
+
* String.prototype.startsWith wrapper for Node.js 0.8+
|
|
326
|
+
* - Uses native startsWith on Node 4.0+ / ES2015+
|
|
327
|
+
* - Falls back to indexOf on Node 0.8-3.x
|
|
328
|
+
*/ var hasStartsWith = typeof String.prototype.startsWith === 'function';
|
|
329
|
+
function stringStartsWith(str, search, position) {
|
|
330
|
+
if (hasStartsWith) return str.startsWith(search, position);
|
|
331
|
+
position = position || 0;
|
|
332
|
+
return str.indexOf(search, position) === position;
|
|
333
|
+
}
|
|
321
334
|
/**
|
|
322
335
|
* Decompress raw DEFLATE data (no zlib/gzip header)
|
|
323
336
|
* - Uses native zlib.inflateRawSync() on Node 0.11.12+
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/compat.ts"],"sourcesContent":["/**\n * Buffer Compatibility Layer for Node.js 0.8+\n *\n * Provides buffer utilities that work across all Node.js versions\n * WITHOUT modifying global Buffer object.\n *\n * Version history:\n * - Node 0.8-4.4: Only has `new Buffer()`, no `Buffer.alloc/from`\n * - Node 4.5+: Has `Buffer.alloc/from`, deprecates `new Buffer()`\n * - Node 10+: Warns or errors on `new Buffer()`\n *\n * Solution: Feature detection with graceful fallback in both directions.\n */\n\n// ESM-compatible require - works in both CJS and ESM\nimport Module from 'module';\n\nconst _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\n\n// Feature detection (runs once at module load)\nconst hasBufferAlloc = typeof Buffer.alloc === 'function';\nconst hasBufferAllocUnsafe = typeof Buffer.allocUnsafe === 'function';\nconst hasBufferFrom = typeof Buffer.from === 'function' && Buffer.from !== Uint8Array.from;\n\n// Maximum buffer size that works across all Node.js versions\n// Node 0.8-4.x: kMaxLength = 0x3fffffff (~1073MB) but actual limit may be lower\n// Node 6-7.x: ~1073MB for Uint8Array\n// Node 8+: ~2GB for Buffer\n// Node 10+: 2^31-1 (~2147MB) for Buffer.allocUnsafe\n// Use 256MB as a conservative limit for buffer operations\n// Must leave room for pairwise combination (256MB * 2 = 512MB, 512MB * 2 = 1024MB, etc.)\nexport const MAX_SAFE_BUFFER_LENGTH = 256 * 1024 * 1024; // 256MB\n\n// Try to detect the actual kMaxLength for this Node version\n// If we can't detect it (older Node), assume conservative limit\nlet DETECTED_MAX_LENGTH: number | null = null;\n\nfunction getMaxBufferLength(): number {\n if (DETECTED_MAX_LENGTH !== null) return DETECTED_MAX_LENGTH;\n\n // kMaxLength may not exist at runtime on very old or very new Node\n // Modern Node (v8+) doesn't expose kMaxLength but allows large buffers\n const maxLen = (Buffer as { kMaxLength?: number }).kMaxLength;\n if (maxLen !== undefined) {\n DETECTED_MAX_LENGTH = maxLen;\n } else {\n // Node 0.8-4.x: use conservative limit\n // Node 8+: can allocate up to ~2GB (v8 array buffer limit)\n // Use the higher limit for modern Node\n const nodeVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n if (nodeVersion >= 8) {\n DETECTED_MAX_LENGTH = Number.MAX_SAFE_INTEGER; // Effectively unlimited\n } else {\n DETECTED_MAX_LENGTH = 0x3fffffff; // ~1073MB for older Node\n }\n }\n\n return DETECTED_MAX_LENGTH;\n}\n\n/**\n * Check if a buffer size can be safely allocated on this Node version\n * Uses conservative limit to work across all versions\n */\nexport function canAllocateBufferSize(size: number): boolean {\n return size >= 0 && size <= MAX_SAFE_BUFFER_LENGTH;\n}\n\n/**\n * Create a single chunk of the specified size\n */\nfunction createChunk(size: number, zeroFill: boolean): Buffer {\n if (hasBufferAlloc) {\n return Buffer.alloc(size);\n }\n const buf = new Buffer(size);\n if (zeroFill) buf.fill(0);\n return buf;\n}\n\n/**\n * Combine an array of buffers into one by iterative concatenation\n * Stays under the actual kMaxLength for each Node version\n * Uses a \"fill and continue\" approach\n */\nfunction combineBuffersPairwise(buffers: Buffer[]): Buffer {\n const maxLength = getMaxBufferLength();\n\n // Calculate total size\n let totalSize = 0;\n for (let i = 0; i < buffers.length; i++) {\n totalSize += buffers[i].length;\n }\n\n // If total exceeds this Node version's limit, we cannot combine\n // LZMA1 requires a single contiguous Buffer input\n if (totalSize > maxLength) {\n throw new Error(`Cannot combine buffers: total size (${totalSize} bytes) exceeds Node.js buffer limit (${maxLength} bytes). LZMA1 archives with folders larger than ${Math.floor(maxLength / 1024 / 1024)}MB cannot be processed on this Node version.`);\n }\n\n // If everything fits in a single allocation, do it directly\n const result = createChunk(totalSize, false);\n let offset = 0;\n for (let i = 0; i < buffers.length; i++) {\n buffers[i].copy(result, offset);\n offset += buffers[i].length;\n }\n return result;\n}\n\n/**\n * Allocate a large buffer by allocating in chunks and combining them\n * Handles both zero-filled (safe) and uninitialized (unsafe) variants\n */\nfunction allocBufferLarge(size: number, zeroFill: boolean): Buffer {\n // For large sizes, allocate smaller chunks and combine them\n const numChunks = Math.ceil(size / MAX_SAFE_BUFFER_LENGTH);\n const chunks: Buffer[] = [];\n\n // Allocate individual chunks (each <= MAX_SAFE_BUFFER_LENGTH)\n for (let i = 0; i < numChunks; i++) {\n const chunkSize = Math.min(MAX_SAFE_BUFFER_LENGTH, size - i * MAX_SAFE_BUFFER_LENGTH);\n chunks.push(createChunk(chunkSize, zeroFill));\n }\n\n // Combine chunks iteratively using pairwise combination\n return combineBuffersPairwise(chunks);\n}\n\n/**\n * Allocate a zero-filled buffer (safe) - handles very large allocations\n * - Uses Buffer.alloc() on Node 4.5+\n * - Falls back to new Buffer() + fill on Node 0.8-4.4\n * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks and copies\n */\nexport function allocBuffer(size: number): Buffer {\n if (size === 0) {\n return new Buffer(0);\n }\n\n // Use native allocation for sizes within safe limits\n if (canAllocateBufferSize(size)) {\n if (hasBufferAlloc) {\n return Buffer.alloc(size);\n }\n // Legacy fallback: new Buffer() is uninitialized, must zero-fill\n const buf = new Buffer(size);\n buf.fill(0);\n return buf;\n }\n\n // For large sizes, allocate in chunks with zero-filling\n return allocBufferLarge(size, true);\n}\n\n/**\n * Allocate a buffer without initialization (unsafe but faster)\n * - Uses Buffer.allocUnsafe() on Node 4.5+\n * - Falls back to new Buffer() on Node 0.8-4.4\n * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks without zeroing\n *\n * WARNING: Buffer contents are uninitialized and may contain sensitive data.\n * Only use when you will immediately overwrite all bytes.\n */\nexport function allocBufferUnsafe(size: number): Buffer {\n if (size === 0) {\n return new Buffer(0);\n }\n\n // Use native allocation for sizes within safe limits\n if (canAllocateBufferSize(size)) {\n if (hasBufferAllocUnsafe) {\n return Buffer.allocUnsafe(size);\n }\n return new Buffer(size);\n }\n\n // For large sizes, allocate in chunks without zero-filling\n return allocBufferLarge(size, false);\n}\n\n/**\n * Create a buffer from string, array, or existing buffer\n * - Uses Buffer.from() on Node 4.5+\n * - Falls back to new Buffer() on Node 0.8-4.4\n * - Handles Uint8Array conversion for Node 0.8 (crypto output compatibility)\n */\nexport function bufferFrom(data: string | number[] | Buffer | Uint8Array, encoding?: BufferEncoding): Buffer {\n if (hasBufferFrom) {\n if (typeof data === 'string') {\n return Buffer.from(data, encoding);\n }\n return Buffer.from(data as number[] | Buffer);\n }\n // Node 0.8 compatibility - deprecated Buffer constructor\n // For Uint8Array, convert to array first (needed for crypto output in Node 0.8)\n if (data instanceof Uint8Array && !(data instanceof Buffer)) {\n const arr: number[] = [];\n for (let i = 0; i < data.length; i++) {\n arr.push(data[i]);\n }\n return new Buffer(arr);\n }\n return new Buffer(data as string & number[], encoding);\n}\n\n/**\n * Compare two buffers or buffer regions\n * - Uses Buffer.compare() on Node 5.10+ (with offset support)\n * - Falls back to manual comparison on Node 0.8-5.9\n */\nexport function bufferCompare(source: Buffer, target: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number {\n sourceStart = sourceStart || 0;\n sourceEnd = sourceEnd || source.length;\n targetStart = targetStart || 0;\n targetEnd = targetEnd || target.length;\n\n // Check if native compare with offset support exists (Node 5.10+)\n if (source.compare && source.compare.length >= 5) {\n return source.compare(target, targetStart, targetEnd, sourceStart, sourceEnd);\n }\n\n // Manual comparison for older Node versions\n const sourceLen = sourceEnd - sourceStart;\n const targetLen = targetEnd - targetStart;\n const len = Math.min(sourceLen, targetLen);\n\n for (let i = 0; i < len; i++) {\n const s = source[sourceStart + i];\n const t = target[targetStart + i];\n if (s !== t) return s < t ? -1 : 1;\n }\n\n return sourceLen - targetLen;\n}\n\n/**\n * Check if buffer region equals byte array\n * Useful for magic number detection without Buffer.from()\n */\nexport function bufferEquals(buf: Buffer, offset: number, expected: number[]): boolean {\n if (offset + expected.length > buf.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (buf[offset + i] !== expected[i]) return false;\n }\n return true;\n}\n\n/**\n * Copy buffer region to new buffer\n * Works on all Node versions\n */\nexport function bufferSliceCopy(buf: Buffer, start: number, end: number): Buffer {\n const result = allocBuffer(end - start);\n buf.copy(result, 0, start, end);\n return result;\n}\n\n/**\n * Read 64-bit unsigned integer (little-endian)\n * Uses two 32-bit reads since BigInt not available until Node 10.4\n *\n * WARNING: Only accurate for values < Number.MAX_SAFE_INTEGER (2^53 - 1)\n * This covers files up to ~9 PB which is practical for all real use cases.\n */\nexport function readUInt64LE(buf: Buffer, offset: number): number {\n const low = buf.readUInt32LE(offset);\n const high = buf.readUInt32LE(offset + 4);\n return high * 0x100000000 + low;\n}\n\n/**\n * Write 64-bit unsigned integer (little-endian)\n * Same precision limitation as readUInt64LE\n */\nexport function writeUInt64LE(buf: Buffer, value: number, offset: number): void {\n const low = value >>> 0;\n const high = (value / 0x100000000) >>> 0;\n buf.writeUInt32LE(low, offset);\n buf.writeUInt32LE(high, offset + 4);\n}\n\n/**\n * Concatenate buffers - compatible with Node 0.8+\n * Handles crypto output which may not be proper Buffer instances in old Node.\n * Also handles very large concatenations that would exceed buffer limits.\n *\n * NOTE: This function is primarily needed for AES decryption compatibility\n * in Node 0.8 where crypto output may not be proper Buffer instances.\n * Libraries not using crypto can use native Buffer.concat() directly.\n */\nexport function bufferConcat(list: (Buffer | Uint8Array)[], totalLength?: number): Buffer {\n // Calculate actual total length first\n let actualLength = 0;\n for (let i = 0; i < list.length; i++) {\n actualLength += list[i].length;\n }\n\n // Use specified totalLength or actual length\n const targetLength = totalLength !== undefined ? totalLength : actualLength;\n\n // Handle empty list\n if (list.length === 0) {\n return new Buffer(0);\n }\n\n // Handle very large concatenations that would exceed buffer limits\n // Use native Buffer.concat for smaller sizes (faster)\n if (targetLength <= MAX_SAFE_BUFFER_LENGTH) {\n // Check if all items are proper Buffers AND no truncation needed\n // (Node 0.8's Buffer.concat doesn't handle truncation well)\n let allBuffers = true;\n for (let j = 0; j < list.length; j++) {\n if (!(list[j] instanceof Buffer)) {\n allBuffers = false;\n break;\n }\n }\n if (allBuffers && targetLength >= actualLength) {\n return Buffer.concat(list as Buffer[], targetLength);\n }\n }\n\n // For large or complex concatenations, use chunked approach\n // This will use allocBuffer which handles large sizes via chunking\n const result = allocBuffer(targetLength);\n let offset = 0;\n\n for (let k = 0; k < list.length && offset < targetLength; k++) {\n const buf = list[k];\n const toCopy = Math.min(buf.length, targetLength - offset);\n\n if (buf instanceof Buffer) {\n buf.copy(result, offset, 0, toCopy);\n } else {\n // Uint8Array - need to copy byte by byte\n for (let l = 0; l < toCopy; l++) {\n result[offset + l] = buf[l];\n }\n }\n offset += toCopy;\n }\n\n return result;\n}\n\n/**\n * Node 0.8 compatible isNaN (Number.isNaN didn't exist until ES2015)\n * Uses self-comparison: NaN is the only value not equal to itself\n */\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy compatibility\nexport function isNaN(value: number): boolean {\n // biome-ignore lint/suspicious/noSelfCompare: NaN check pattern\n return value !== value;\n}\n\n/**\n * Decompress raw DEFLATE data (no zlib/gzip header)\n * - Uses native zlib.inflateRawSync() on Node 0.11.12+\n * - Falls back to pako for Node 0.8-0.10\n *\n * Version history:\n * - Node 0.8-0.10: No zlib sync methods, use pako\n * - Node 0.11.12+: zlib.inflateRawSync available\n */\n// Feature detection for native zlib sync methods (Node 0.11.12+)\nlet zlib: typeof import('zlib') | null = null;\ntry {\n zlib = _require('zlib');\n} catch (_e) {\n // zlib not available (shouldn't happen in Node.js)\n}\nconst hasNativeInflateRaw = zlib !== null && typeof zlib.inflateRawSync === 'function';\n\nexport function inflateRaw(input: Buffer): Buffer {\n if (hasNativeInflateRaw && zlib) {\n return zlib.inflateRawSync(input);\n }\n // Fallback to pako for Node 0.8-0.10\n const pako = _require('pako');\n return bufferFrom(pako.inflateRaw(input));\n}\n\n/**\n * Create a streaming raw DEFLATE decompressor (Transform stream)\n * Decompresses data incrementally to avoid holding full output in memory.\n *\n * - Uses native zlib.createInflateRaw() on Node 0.11.12+\n * - Falls back to pako-based Transform for Node 0.8-0.10\n *\n * @returns A Transform stream that decompresses raw DEFLATE data\n */\n// Check for native streaming inflate (Node 0.11.12+ has createInflateRaw)\n// biome-ignore lint/suspicious/noExplicitAny: createInflateRaw not in older TS definitions\nconst hasNativeStreamingInflate = zlib !== null && typeof (zlib as any).createInflateRaw === 'function';\n\nexport function createInflateRawStream(): NodeJS.ReadWriteStream {\n if (hasNativeStreamingInflate && zlib) {\n // Use native zlib streaming Transform\n // biome-ignore lint/suspicious/noExplicitAny: createInflateRaw not in older TS definitions\n return (zlib as any).createInflateRaw();\n }\n\n // Fallback to pako-based Transform for Node 0.8-0.10\n // Use readable-stream for Node 0.8 compatibility\n const Transform = _require('readable-stream').Transform;\n const pako = _require('pako');\n\n const inflate = new pako.Inflate({ raw: true, chunkSize: 16384 });\n const transform = new Transform();\n const pendingChunks: Buffer[] = [];\n let ended = false;\n\n // Pako calls onData synchronously during push()\n inflate.onData = (chunk: Uint8Array) => {\n pendingChunks.push(bufferFrom(chunk));\n };\n\n inflate.onEnd = (status: number) => {\n ended = true;\n if (status !== 0) {\n transform.emit('error', new Error(`Inflate error: ${inflate.msg || 'unknown'}`));\n }\n };\n\n transform._transform = function (chunk: Buffer, _encoding: string, callback: (err?: Error) => void) {\n try {\n inflate.push(chunk, false);\n // Push any pending decompressed chunks\n while (pendingChunks.length > 0) {\n this.push(pendingChunks.shift());\n }\n callback();\n } catch (err) {\n callback(err as Error);\n }\n };\n\n transform._flush = function (callback: (err?: Error) => void) {\n try {\n inflate.push(new Uint8Array(0), true); // Signal end\n // Push any remaining decompressed chunks\n while (pendingChunks.length > 0) {\n this.push(pendingChunks.shift());\n }\n if (ended && inflate.err) {\n callback(new Error(`Inflate error: ${inflate.msg || 'unknown'}`));\n } else {\n callback();\n }\n } catch (err) {\n callback(err as Error);\n }\n };\n\n return transform;\n}\n\n/**\n * Object.assign wrapper for Node.js 0.8+\n * - Uses native Object.assign on Node 4.0+\n * - Falls back to manual property copy on Node 0.8-3.x\n */\nconst hasObjectAssign = typeof Object.assign === 'function';\nconst _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nexport function objectAssign<T, U>(target: T, source: U): T & U {\n if (hasObjectAssign) return Object.assign(target, source);\n\n for (const key in source) {\n if (_hasOwnProperty.call(source, key)) (target as Record<string, unknown>)[key] = source[key];\n }\n return target as T & U;\n}\n\n/**\n * Stream compatibility - Transform class\n * - Uses native stream.Transform on Node 0.10+\n * - Falls back to readable-stream for Node 0.8\n */\nconst major = +process.versions.node.split('.')[0];\nexport const Readable: typeof import('stream').Readable = major > 0 ? _require('stream').Readable : _require('readable-stream').Readable;\nexport const Writable: typeof import('stream').Writable = major > 0 ? _require('stream').Writable : _require('readable-stream').Writable;\nexport const Transform: typeof import('stream').Transform = major > 0 ? _require('stream').Transform : _require('readable-stream').Transform;\nexport const PassThrough: typeof import('stream').PassThrough = major > 0 ? _require('stream').PassThrough : _require('readable-stream').PassThrough;\n"],"names":["MAX_SAFE_BUFFER_LENGTH","PassThrough","Readable","Transform","Writable","allocBuffer","allocBufferUnsafe","bufferCompare","bufferConcat","bufferEquals","bufferFrom","bufferSliceCopy","canAllocateBufferSize","createInflateRawStream","inflateRaw","isNaN","objectAssign","readUInt64LE","writeUInt64LE","_require","require","Module","createRequire","hasBufferAlloc","Buffer","alloc","hasBufferAllocUnsafe","allocUnsafe","hasBufferFrom","from","Uint8Array","DETECTED_MAX_LENGTH","getMaxBufferLength","maxLen","kMaxLength","undefined","nodeVersion","parseInt","process","version","slice","split","Number","MAX_SAFE_INTEGER","size","createChunk","zeroFill","buf","fill","combineBuffersPairwise","buffers","maxLength","totalSize","i","length","Error","Math","floor","result","offset","copy","allocBufferLarge","numChunks","ceil","chunks","chunkSize","min","push","data","encoding","arr","source","target","targetStart","targetEnd","sourceStart","sourceEnd","compare","sourceLen","targetLen","len","s","t","expected","start","end","low","readUInt32LE","high","value","writeUInt32LE","list","totalLength","actualLength","targetLength","allBuffers","j","concat","k","toCopy","l","zlib","_e","hasNativeInflateRaw","inflateRawSync","input","pako","hasNativeStreamingInflate","createInflateRaw","inflate","Inflate","raw","transform","pendingChunks","ended","onData","chunk","onEnd","status","emit","msg","_transform","_encoding","callback","shift","err","_flush","hasObjectAssign","Object","assign","_hasOwnProperty","prototype","hasOwnProperty","key","call","major","versions","node"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/compat.ts"],"sourcesContent":["/**\n * Buffer Compatibility Layer for Node.js 0.8+\n *\n * Provides buffer utilities that work across all Node.js versions\n * WITHOUT modifying global Buffer object.\n *\n * Version history:\n * - Node 0.8-4.4: Only has `new Buffer()`, no `Buffer.alloc/from`\n * - Node 4.5+: Has `Buffer.alloc/from`, deprecates `new Buffer()`\n * - Node 10+: Warns or errors on `new Buffer()`\n *\n * Solution: Feature detection with graceful fallback in both directions.\n */\n\n// ESM-compatible require - works in both CJS and ESM\nimport Module from 'module';\n\nconst _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\n\n// Feature detection (runs once at module load)\nconst hasBufferAlloc = typeof Buffer.alloc === 'function';\nconst hasBufferAllocUnsafe = typeof Buffer.allocUnsafe === 'function';\nconst hasBufferFrom = typeof Buffer.from === 'function' && Buffer.from !== Uint8Array.from;\n\n// Maximum buffer size that works across all Node.js versions\n// Node 0.8-4.x: kMaxLength = 0x3fffffff (~1073MB) but actual limit may be lower\n// Node 6-7.x: ~1073MB for Uint8Array\n// Node 8+: ~2GB for Buffer\n// Node 10+: 2^31-1 (~2147MB) for Buffer.allocUnsafe\n// Use 256MB as a conservative limit for buffer operations\n// Must leave room for pairwise combination (256MB * 2 = 512MB, 512MB * 2 = 1024MB, etc.)\nexport const MAX_SAFE_BUFFER_LENGTH = 256 * 1024 * 1024; // 256MB\n\n// Try to detect the actual kMaxLength for this Node version\n// If we can't detect it (older Node), assume conservative limit\nlet DETECTED_MAX_LENGTH: number | null = null;\n\nfunction getMaxBufferLength(): number {\n if (DETECTED_MAX_LENGTH !== null) return DETECTED_MAX_LENGTH;\n\n // kMaxLength may not exist at runtime on very old or very new Node\n // Modern Node (v8+) doesn't expose kMaxLength but allows large buffers\n const maxLen = (Buffer as { kMaxLength?: number }).kMaxLength;\n if (maxLen !== undefined) {\n DETECTED_MAX_LENGTH = maxLen;\n } else {\n // Node 0.8-4.x: use conservative limit\n // Node 8+: can allocate up to ~2GB (v8 array buffer limit)\n // Use the higher limit for modern Node\n const nodeVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n if (nodeVersion >= 8) {\n DETECTED_MAX_LENGTH = Number.MAX_SAFE_INTEGER; // Effectively unlimited\n } else {\n DETECTED_MAX_LENGTH = 0x3fffffff; // ~1073MB for older Node\n }\n }\n\n return DETECTED_MAX_LENGTH;\n}\n\n/**\n * Check if a buffer size can be safely allocated on this Node version\n * Uses conservative limit to work across all versions\n */\nexport function canAllocateBufferSize(size: number): boolean {\n return size >= 0 && size <= MAX_SAFE_BUFFER_LENGTH;\n}\n\n/**\n * Create a single chunk of the specified size\n */\nfunction createChunk(size: number, zeroFill: boolean): Buffer {\n if (hasBufferAlloc) {\n return Buffer.alloc(size);\n }\n const buf = new Buffer(size);\n if (zeroFill) buf.fill(0);\n return buf;\n}\n\n/**\n * Combine an array of buffers into one by iterative concatenation\n * Stays under the actual kMaxLength for each Node version\n * Uses a \"fill and continue\" approach\n */\nfunction combineBuffersPairwise(buffers: Buffer[]): Buffer {\n const maxLength = getMaxBufferLength();\n\n // Calculate total size\n let totalSize = 0;\n for (let i = 0; i < buffers.length; i++) {\n totalSize += buffers[i].length;\n }\n\n // If total exceeds this Node version's limit, we cannot combine\n // LZMA1 requires a single contiguous Buffer input\n if (totalSize > maxLength) {\n throw new Error(`Cannot combine buffers: total size (${totalSize} bytes) exceeds Node.js buffer limit (${maxLength} bytes). LZMA1 archives with folders larger than ${Math.floor(maxLength / 1024 / 1024)}MB cannot be processed on this Node version.`);\n }\n\n // If everything fits in a single allocation, do it directly\n const result = createChunk(totalSize, false);\n let offset = 0;\n for (let i = 0; i < buffers.length; i++) {\n buffers[i].copy(result, offset);\n offset += buffers[i].length;\n }\n return result;\n}\n\n/**\n * Allocate a large buffer by allocating in chunks and combining them\n * Handles both zero-filled (safe) and uninitialized (unsafe) variants\n */\nfunction allocBufferLarge(size: number, zeroFill: boolean): Buffer {\n // For large sizes, allocate smaller chunks and combine them\n const numChunks = Math.ceil(size / MAX_SAFE_BUFFER_LENGTH);\n const chunks: Buffer[] = [];\n\n // Allocate individual chunks (each <= MAX_SAFE_BUFFER_LENGTH)\n for (let i = 0; i < numChunks; i++) {\n const chunkSize = Math.min(MAX_SAFE_BUFFER_LENGTH, size - i * MAX_SAFE_BUFFER_LENGTH);\n chunks.push(createChunk(chunkSize, zeroFill));\n }\n\n // Combine chunks iteratively using pairwise combination\n return combineBuffersPairwise(chunks);\n}\n\n/**\n * Allocate a zero-filled buffer (safe) - handles very large allocations\n * - Uses Buffer.alloc() on Node 4.5+\n * - Falls back to new Buffer() + fill on Node 0.8-4.4\n * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks and copies\n */\nexport function allocBuffer(size: number): Buffer {\n if (size === 0) {\n return new Buffer(0);\n }\n\n // Use native allocation for sizes within safe limits\n if (canAllocateBufferSize(size)) {\n if (hasBufferAlloc) {\n return Buffer.alloc(size);\n }\n // Legacy fallback: new Buffer() is uninitialized, must zero-fill\n const buf = new Buffer(size);\n buf.fill(0);\n return buf;\n }\n\n // For large sizes, allocate in chunks with zero-filling\n return allocBufferLarge(size, true);\n}\n\n/**\n * Allocate a buffer without initialization (unsafe but faster)\n * - Uses Buffer.allocUnsafe() on Node 4.5+\n * - Falls back to new Buffer() on Node 0.8-4.4\n * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks without zeroing\n *\n * WARNING: Buffer contents are uninitialized and may contain sensitive data.\n * Only use when you will immediately overwrite all bytes.\n */\nexport function allocBufferUnsafe(size: number): Buffer {\n if (size === 0) {\n return new Buffer(0);\n }\n\n // Use native allocation for sizes within safe limits\n if (canAllocateBufferSize(size)) {\n if (hasBufferAllocUnsafe) {\n return Buffer.allocUnsafe(size);\n }\n return new Buffer(size);\n }\n\n // For large sizes, allocate in chunks without zero-filling\n return allocBufferLarge(size, false);\n}\n\n/**\n * Create a buffer from string, array, or existing buffer\n * - Uses Buffer.from() on Node 4.5+\n * - Falls back to new Buffer() on Node 0.8-4.4\n * - Handles Uint8Array conversion for Node 0.8 (crypto output compatibility)\n */\nexport function bufferFrom(data: string | number[] | Buffer | Uint8Array, encoding?: BufferEncoding): Buffer {\n if (hasBufferFrom) {\n if (typeof data === 'string') {\n return Buffer.from(data, encoding);\n }\n return Buffer.from(data as number[] | Buffer);\n }\n // Node 0.8 compatibility - deprecated Buffer constructor\n // For Uint8Array, convert to array first (needed for crypto output in Node 0.8)\n if (data instanceof Uint8Array && !(data instanceof Buffer)) {\n const arr: number[] = [];\n for (let i = 0; i < data.length; i++) {\n arr.push(data[i]);\n }\n return new Buffer(arr);\n }\n return new Buffer(data as string & number[], encoding);\n}\n\n/**\n * Compare two buffers or buffer regions\n * - Uses Buffer.compare() on Node 5.10+ (with offset support)\n * - Falls back to manual comparison on Node 0.8-5.9\n */\nexport function bufferCompare(source: Buffer, target: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number {\n sourceStart = sourceStart || 0;\n sourceEnd = sourceEnd || source.length;\n targetStart = targetStart || 0;\n targetEnd = targetEnd || target.length;\n\n // Check if native compare with offset support exists (Node 5.10+)\n if (source.compare && source.compare.length >= 5) {\n return source.compare(target, targetStart, targetEnd, sourceStart, sourceEnd);\n }\n\n // Manual comparison for older Node versions\n const sourceLen = sourceEnd - sourceStart;\n const targetLen = targetEnd - targetStart;\n const len = Math.min(sourceLen, targetLen);\n\n for (let i = 0; i < len; i++) {\n const s = source[sourceStart + i];\n const t = target[targetStart + i];\n if (s !== t) return s < t ? -1 : 1;\n }\n\n return sourceLen - targetLen;\n}\n\n/**\n * Check if buffer region equals byte array\n * Useful for magic number detection without Buffer.from()\n */\nexport function bufferEquals(buf: Buffer, offset: number, expected: number[]): boolean {\n if (offset + expected.length > buf.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (buf[offset + i] !== expected[i]) return false;\n }\n return true;\n}\n\n/**\n * Copy buffer region to new buffer\n * Works on all Node versions\n */\nexport function bufferSliceCopy(buf: Buffer, start: number, end: number): Buffer {\n const result = allocBuffer(end - start);\n buf.copy(result, 0, start, end);\n return result;\n}\n\n/**\n * Read 64-bit unsigned integer (little-endian)\n * Uses two 32-bit reads since BigInt not available until Node 10.4\n *\n * WARNING: Only accurate for values < Number.MAX_SAFE_INTEGER (2^53 - 1)\n * This covers files up to ~9 PB which is practical for all real use cases.\n */\nexport function readUInt64LE(buf: Buffer, offset: number): number {\n const low = buf.readUInt32LE(offset);\n const high = buf.readUInt32LE(offset + 4);\n return high * 0x100000000 + low;\n}\n\n/**\n * Write 64-bit unsigned integer (little-endian)\n * Same precision limitation as readUInt64LE\n */\nexport function writeUInt64LE(buf: Buffer, value: number, offset: number): void {\n const low = value >>> 0;\n const high = (value / 0x100000000) >>> 0;\n buf.writeUInt32LE(low, offset);\n buf.writeUInt32LE(high, offset + 4);\n}\n\n/**\n * Concatenate buffers - compatible with Node 0.8+\n * Handles crypto output which may not be proper Buffer instances in old Node.\n * Also handles very large concatenations that would exceed buffer limits.\n *\n * NOTE: This function is primarily needed for AES decryption compatibility\n * in Node 0.8 where crypto output may not be proper Buffer instances.\n * Libraries not using crypto can use native Buffer.concat() directly.\n */\nexport function bufferConcat(list: (Buffer | Uint8Array)[], totalLength?: number): Buffer {\n // Calculate actual total length first\n let actualLength = 0;\n for (let i = 0; i < list.length; i++) {\n actualLength += list[i].length;\n }\n\n // Use specified totalLength or actual length\n const targetLength = totalLength !== undefined ? totalLength : actualLength;\n\n // Handle empty list\n if (list.length === 0) {\n return new Buffer(0);\n }\n\n // Handle very large concatenations that would exceed buffer limits\n // Use native Buffer.concat for smaller sizes (faster)\n if (targetLength <= MAX_SAFE_BUFFER_LENGTH) {\n // Check if all items are proper Buffers AND no truncation needed\n // (Node 0.8's Buffer.concat doesn't handle truncation well)\n let allBuffers = true;\n for (let j = 0; j < list.length; j++) {\n if (!(list[j] instanceof Buffer)) {\n allBuffers = false;\n break;\n }\n }\n if (allBuffers && targetLength >= actualLength) {\n return Buffer.concat(list as Buffer[], targetLength);\n }\n }\n\n // For large or complex concatenations, use chunked approach\n // This will use allocBuffer which handles large sizes via chunking\n const result = allocBuffer(targetLength);\n let offset = 0;\n\n for (let k = 0; k < list.length && offset < targetLength; k++) {\n const buf = list[k];\n const toCopy = Math.min(buf.length, targetLength - offset);\n\n if (buf instanceof Buffer) {\n buf.copy(result, offset, 0, toCopy);\n } else {\n // Uint8Array - need to copy byte by byte\n for (let l = 0; l < toCopy; l++) {\n result[offset + l] = buf[l];\n }\n }\n offset += toCopy;\n }\n\n return result;\n}\n\n/**\n * Node 0.8 compatible isNaN (Number.isNaN didn't exist until ES2015)\n * Uses self-comparison: NaN is the only value not equal to itself\n */\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy compatibility\nexport function isNaN(value: number): boolean {\n // biome-ignore lint/suspicious/noSelfCompare: NaN check pattern\n return value !== value;\n}\n\n/**\n * String.prototype.startsWith wrapper for Node.js 0.8+\n * - Uses native startsWith on Node 4.0+ / ES2015+\n * - Falls back to indexOf on Node 0.8-3.x\n */\nconst hasStartsWith = typeof String.prototype.startsWith === 'function';\nexport function stringStartsWith(str: string, search: string, position?: number): boolean {\n if (hasStartsWith) return str.startsWith(search, position);\n position = position || 0;\n return str.indexOf(search, position) === position;\n}\n\n/**\n * Decompress raw DEFLATE data (no zlib/gzip header)\n * - Uses native zlib.inflateRawSync() on Node 0.11.12+\n * - Falls back to pako for Node 0.8-0.10\n *\n * Version history:\n * - Node 0.8-0.10: No zlib sync methods, use pako\n * - Node 0.11.12+: zlib.inflateRawSync available\n */\n// Feature detection for native zlib sync methods (Node 0.11.12+)\nlet zlib: typeof import('zlib') | null = null;\ntry {\n zlib = _require('zlib');\n} catch (_e) {\n // zlib not available (shouldn't happen in Node.js)\n}\nconst hasNativeInflateRaw = zlib !== null && typeof zlib.inflateRawSync === 'function';\n\nexport function inflateRaw(input: Buffer): Buffer {\n if (hasNativeInflateRaw && zlib) {\n return zlib.inflateRawSync(input);\n }\n // Fallback to pako for Node 0.8-0.10\n const pako = _require('pako');\n return bufferFrom(pako.inflateRaw(input));\n}\n\n/**\n * Create a streaming raw DEFLATE decompressor (Transform stream)\n * Decompresses data incrementally to avoid holding full output in memory.\n *\n * - Uses native zlib.createInflateRaw() on Node 0.11.12+\n * - Falls back to pako-based Transform for Node 0.8-0.10\n *\n * @returns A Transform stream that decompresses raw DEFLATE data\n */\n// Check for native streaming inflate (Node 0.11.12+ has createInflateRaw)\n// biome-ignore lint/suspicious/noExplicitAny: createInflateRaw not in older TS definitions\nconst hasNativeStreamingInflate = zlib !== null && typeof (zlib as any).createInflateRaw === 'function';\n\nexport function createInflateRawStream(): NodeJS.ReadWriteStream {\n if (hasNativeStreamingInflate && zlib) {\n // Use native zlib streaming Transform\n // biome-ignore lint/suspicious/noExplicitAny: createInflateRaw not in older TS definitions\n return (zlib as any).createInflateRaw();\n }\n\n // Fallback to pako-based Transform for Node 0.8-0.10\n // Use readable-stream for Node 0.8 compatibility\n const Transform = _require('readable-stream').Transform;\n const pako = _require('pako');\n\n const inflate = new pako.Inflate({ raw: true, chunkSize: 16384 });\n const transform = new Transform();\n const pendingChunks: Buffer[] = [];\n let ended = false;\n\n // Pako calls onData synchronously during push()\n inflate.onData = (chunk: Uint8Array) => {\n pendingChunks.push(bufferFrom(chunk));\n };\n\n inflate.onEnd = (status: number) => {\n ended = true;\n if (status !== 0) {\n transform.emit('error', new Error(`Inflate error: ${inflate.msg || 'unknown'}`));\n }\n };\n\n transform._transform = function (chunk: Buffer, _encoding: string, callback: (err?: Error) => void) {\n try {\n inflate.push(chunk, false);\n // Push any pending decompressed chunks\n while (pendingChunks.length > 0) {\n this.push(pendingChunks.shift());\n }\n callback();\n } catch (err) {\n callback(err as Error);\n }\n };\n\n transform._flush = function (callback: (err?: Error) => void) {\n try {\n inflate.push(new Uint8Array(0), true); // Signal end\n // Push any remaining decompressed chunks\n while (pendingChunks.length > 0) {\n this.push(pendingChunks.shift());\n }\n if (ended && inflate.err) {\n callback(new Error(`Inflate error: ${inflate.msg || 'unknown'}`));\n } else {\n callback();\n }\n } catch (err) {\n callback(err as Error);\n }\n };\n\n return transform;\n}\n\n/**\n * Object.assign wrapper for Node.js 0.8+\n * - Uses native Object.assign on Node 4.0+\n * - Falls back to manual property copy on Node 0.8-3.x\n */\nconst hasObjectAssign = typeof Object.assign === 'function';\nconst _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nexport function objectAssign<T, U>(target: T, source: U): T & U {\n if (hasObjectAssign) return Object.assign(target, source);\n\n for (const key in source) {\n if (_hasOwnProperty.call(source, key)) (target as Record<string, unknown>)[key] = source[key];\n }\n return target as T & U;\n}\n\n/**\n * Stream compatibility - Transform class\n * - Uses native stream.Transform on Node 0.10+\n * - Falls back to readable-stream for Node 0.8\n */\nconst major = +process.versions.node.split('.')[0];\nexport const Readable: typeof import('stream').Readable = major > 0 ? _require('stream').Readable : _require('readable-stream').Readable;\nexport const Writable: typeof import('stream').Writable = major > 0 ? _require('stream').Writable : _require('readable-stream').Writable;\nexport const Transform: typeof import('stream').Transform = major > 0 ? _require('stream').Transform : _require('readable-stream').Transform;\nexport const PassThrough: typeof import('stream').PassThrough = major > 0 ? _require('stream').PassThrough : _require('readable-stream').PassThrough;\n"],"names":["MAX_SAFE_BUFFER_LENGTH","PassThrough","Readable","Transform","Writable","allocBuffer","allocBufferUnsafe","bufferCompare","bufferConcat","bufferEquals","bufferFrom","bufferSliceCopy","canAllocateBufferSize","createInflateRawStream","inflateRaw","isNaN","objectAssign","readUInt64LE","stringStartsWith","writeUInt64LE","_require","require","Module","createRequire","hasBufferAlloc","Buffer","alloc","hasBufferAllocUnsafe","allocUnsafe","hasBufferFrom","from","Uint8Array","DETECTED_MAX_LENGTH","getMaxBufferLength","maxLen","kMaxLength","undefined","nodeVersion","parseInt","process","version","slice","split","Number","MAX_SAFE_INTEGER","size","createChunk","zeroFill","buf","fill","combineBuffersPairwise","buffers","maxLength","totalSize","i","length","Error","Math","floor","result","offset","copy","allocBufferLarge","numChunks","ceil","chunks","chunkSize","min","push","data","encoding","arr","source","target","targetStart","targetEnd","sourceStart","sourceEnd","compare","sourceLen","targetLen","len","s","t","expected","start","end","low","readUInt32LE","high","value","writeUInt32LE","list","totalLength","actualLength","targetLength","allBuffers","j","concat","k","toCopy","l","hasStartsWith","String","prototype","startsWith","str","search","position","indexOf","zlib","_e","hasNativeInflateRaw","inflateRawSync","input","pako","hasNativeStreamingInflate","createInflateRaw","inflate","Inflate","raw","transform","pendingChunks","ended","onData","chunk","onEnd","status","emit","msg","_transform","_encoding","callback","shift","err","_flush","hasObjectAssign","Object","assign","_hasOwnProperty","hasOwnProperty","key","call","major","versions","node"],"mappings":"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"}
|
|
@@ -22,5 +22,6 @@ export { crc32, crc32Region, verifyCrc32, verifyCrc32Region } from './crc32.js';
|
|
|
22
22
|
export { default as EntryStream } from './EntryStream.js';
|
|
23
23
|
export { type CleanupFn, default as Lock } from './Lock.js';
|
|
24
24
|
export { default as normalizePath } from './normalizePath.js';
|
|
25
|
+
export { default as safeJoinPath } from './safeJoinPath.js';
|
|
25
26
|
export { default as streamToString, type StreamToStringCallback } from './streamToString.js';
|
|
26
27
|
export { default as stripPath } from './stripPath.js';
|
|
@@ -22,5 +22,6 @@ export { crc32, crc32Region, verifyCrc32, verifyCrc32Region } from './crc32.js';
|
|
|
22
22
|
export { default as EntryStream } from './EntryStream.js';
|
|
23
23
|
export { type CleanupFn, default as Lock } from './Lock.js';
|
|
24
24
|
export { default as normalizePath } from './normalizePath.js';
|
|
25
|
+
export { default as safeJoinPath } from './safeJoinPath.js';
|
|
25
26
|
export { default as streamToString, type StreamToStringCallback } from './streamToString.js';
|
|
26
27
|
export { default as stripPath } from './stripPath.js';
|
package/dist/cjs/shared/index.js
CHANGED
|
@@ -91,6 +91,9 @@ _export(exports, {
|
|
|
91
91
|
get readUInt64LE () {
|
|
92
92
|
return _compatts.readUInt64LE;
|
|
93
93
|
},
|
|
94
|
+
get safeJoinPath () {
|
|
95
|
+
return _safeJoinPathts.default;
|
|
96
|
+
},
|
|
94
97
|
get streamToString () {
|
|
95
98
|
return _streamToStringts.default;
|
|
96
99
|
},
|
|
@@ -113,6 +116,7 @@ var _crc32ts = require("./crc32.js");
|
|
|
113
116
|
var _EntryStreamts = /*#__PURE__*/ _interop_require_default(require("./EntryStream.js"));
|
|
114
117
|
var _Lockts = /*#__PURE__*/ _interop_require_default(require("./Lock.js"));
|
|
115
118
|
var _normalizePathts = /*#__PURE__*/ _interop_require_default(require("./normalizePath.js"));
|
|
119
|
+
var _safeJoinPathts = /*#__PURE__*/ _interop_require_default(require("./safeJoinPath.js"));
|
|
116
120
|
var _streamToStringts = /*#__PURE__*/ _interop_require_default(require("./streamToString.js"));
|
|
117
121
|
var _stripPathts = /*#__PURE__*/ _interop_require_default(require("./stripPath.js"));
|
|
118
122
|
function _interop_require_default(obj) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/index.ts"],"sourcesContent":["/**\n * Shared utilities for iterator libraries\n *\n * These utilities are designed to be used by:\n * - zip-iterator\n * - 7z-iterator\n * - tar-iterator\n * - Any other archive iterator library\n *\n * All utilities support Node.js 0.8+\n */\n\nimport BufferList from './BufferList.ts';\n\nexport { BufferList };\n\n/**\n * Type alias for Buffer or BufferList - both can be read byte-by-byte.\n * Use this when an API should accept either contiguous data (Buffer)\n * or chunked streaming data (BufferList).\n */\nexport type BufferLike = Buffer | BufferList;\nexport {\n allocBuffer,\n allocBufferUnsafe,\n bufferCompare,\n bufferConcat,\n bufferEquals,\n bufferFrom,\n bufferSliceCopy,\n canAllocateBufferSize,\n createInflateRawStream,\n inflateRaw,\n isNaN,\n MAX_SAFE_BUFFER_LENGTH,\n objectAssign,\n PassThrough,\n Readable,\n readUInt64LE,\n Transform,\n Writable,\n writeUInt64LE,\n} from './compat.ts';\nexport { crc32, crc32Region, verifyCrc32, verifyCrc32Region } from './crc32.ts';\nexport { default as EntryStream } from './EntryStream.ts';\nexport { type CleanupFn, default as Lock } from './Lock.ts';\nexport { default as normalizePath } from './normalizePath.ts';\nexport { default as streamToString, type StreamToStringCallback } from './streamToString.ts';\nexport { default as stripPath } from './stripPath.ts';\n"],"names":["BufferList","EntryStream","Lock","MAX_SAFE_BUFFER_LENGTH","PassThrough","Readable","Transform","Writable","allocBuffer","allocBufferUnsafe","bufferCompare","bufferConcat","bufferEquals","bufferFrom","bufferSliceCopy","canAllocateBufferSize","crc32","crc32Region","createInflateRawStream","inflateRaw","isNaN","normalizePath","objectAssign","readUInt64LE","streamToString","stripPath","verifyCrc32","verifyCrc32Region","writeUInt64LE"],"mappings":"AAAA;;;;;;;;;;CAUC;;;;;;;;;;;QAIQA;eAAAA,qBAAU;;QA8BCC;eAAAA,sBAAW;;QACKC;eAAAA,eAAI;;QAXtCC;eAAAA,gCAAsB;;QAEtBC;eAAAA,qBAAW;;QACXC;eAAAA,kBAAQ;;QAERC;eAAAA,mBAAS;;QACTC;eAAAA,kBAAQ;;QAjBRC;eAAAA,qBAAW;;QACXC;eAAAA,2BAAiB;;QACjBC;eAAAA,uBAAa;;QACbC;eAAAA,sBAAY;;QACZC;eAAAA,sBAAY;;QACZC;eAAAA,oBAAU;;QACVC;eAAAA,yBAAe;;QACfC;eAAAA,+BAAqB;;QAadC;eAAAA,cAAK;;QAAEC;eAAAA,oBAAW;;QAZzBC;eAAAA,gCAAsB;;QACtBC;eAAAA,oBAAU;;QACVC;eAAAA,eAAK;;QAaaC;eAAAA,wBAAa;;QAX/BC;eAAAA,sBAAY;;QAGZC;eAAAA,sBAAY;;QASMC;eAAAA,yBAAc;;QACdC;eAAAA,oBAAS;;
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/index.ts"],"sourcesContent":["/**\n * Shared utilities for iterator libraries\n *\n * These utilities are designed to be used by:\n * - zip-iterator\n * - 7z-iterator\n * - tar-iterator\n * - Any other archive iterator library\n *\n * All utilities support Node.js 0.8+\n */\n\nimport BufferList from './BufferList.ts';\n\nexport { BufferList };\n\n/**\n * Type alias for Buffer or BufferList - both can be read byte-by-byte.\n * Use this when an API should accept either contiguous data (Buffer)\n * or chunked streaming data (BufferList).\n */\nexport type BufferLike = Buffer | BufferList;\nexport {\n allocBuffer,\n allocBufferUnsafe,\n bufferCompare,\n bufferConcat,\n bufferEquals,\n bufferFrom,\n bufferSliceCopy,\n canAllocateBufferSize,\n createInflateRawStream,\n inflateRaw,\n isNaN,\n MAX_SAFE_BUFFER_LENGTH,\n objectAssign,\n PassThrough,\n Readable,\n readUInt64LE,\n Transform,\n Writable,\n writeUInt64LE,\n} from './compat.ts';\nexport { crc32, crc32Region, verifyCrc32, verifyCrc32Region } from './crc32.ts';\nexport { default as EntryStream } from './EntryStream.ts';\nexport { type CleanupFn, default as Lock } from './Lock.ts';\nexport { default as normalizePath } from './normalizePath.ts';\nexport { default as safeJoinPath } from './safeJoinPath.ts';\nexport { default as streamToString, type StreamToStringCallback } from './streamToString.ts';\nexport { default as stripPath } from './stripPath.ts';\n"],"names":["BufferList","EntryStream","Lock","MAX_SAFE_BUFFER_LENGTH","PassThrough","Readable","Transform","Writable","allocBuffer","allocBufferUnsafe","bufferCompare","bufferConcat","bufferEquals","bufferFrom","bufferSliceCopy","canAllocateBufferSize","crc32","crc32Region","createInflateRawStream","inflateRaw","isNaN","normalizePath","objectAssign","readUInt64LE","safeJoinPath","streamToString","stripPath","verifyCrc32","verifyCrc32Region","writeUInt64LE"],"mappings":"AAAA;;;;;;;;;;CAUC;;;;;;;;;;;QAIQA;eAAAA,qBAAU;;QA8BCC;eAAAA,sBAAW;;QACKC;eAAAA,eAAI;;QAXtCC;eAAAA,gCAAsB;;QAEtBC;eAAAA,qBAAW;;QACXC;eAAAA,kBAAQ;;QAERC;eAAAA,mBAAS;;QACTC;eAAAA,kBAAQ;;QAjBRC;eAAAA,qBAAW;;QACXC;eAAAA,2BAAiB;;QACjBC;eAAAA,uBAAa;;QACbC;eAAAA,sBAAY;;QACZC;eAAAA,sBAAY;;QACZC;eAAAA,oBAAU;;QACVC;eAAAA,yBAAe;;QACfC;eAAAA,+BAAqB;;QAadC;eAAAA,cAAK;;QAAEC;eAAAA,oBAAW;;QAZzBC;eAAAA,gCAAsB;;QACtBC;eAAAA,oBAAU;;QACVC;eAAAA,eAAK;;QAaaC;eAAAA,wBAAa;;QAX/BC;eAAAA,sBAAY;;QAGZC;eAAAA,sBAAY;;QASMC;eAAAA,uBAAY;;QACZC;eAAAA,yBAAc;;QACdC;eAAAA,oBAAS;;QANAC;eAAAA,oBAAW;;QAAEC;eAAAA,0BAAiB;;QAFzDC;eAAAA,uBAAa;;;mEA7BQ;wBA8BhB;uBAC4D;oEAC5B;6DACS;sEACP;qEACD;uEAC+B;kEAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function safeJoinPath(dest: string, relPath: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function safeJoinPath(dest: string, relPath: string): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "default", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return safeJoinPath;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
12
|
+
var _compatts = require("./compat.js");
|
|
13
|
+
function _interop_require_default(obj) {
|
|
14
|
+
return obj && obj.__esModule ? obj : {
|
|
15
|
+
default: obj
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function safeJoinPath(dest, relPath) {
|
|
19
|
+
var resolvedDest = _path.default.resolve(dest);
|
|
20
|
+
var resolvedFull = _path.default.resolve(dest, relPath);
|
|
21
|
+
if (resolvedFull !== resolvedDest && !(0, _compatts.stringStartsWith)(resolvedFull, resolvedDest + _path.default.sep)) {
|
|
22
|
+
var err = new Error("Path traversal detected: '".concat(relPath, "' escapes destination '").concat(dest, "'"));
|
|
23
|
+
err.code = 'ETRAVERSAL';
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
26
|
+
return resolvedFull;
|
|
27
|
+
}
|
|
28
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/safeJoinPath.ts"],"sourcesContent":["import path from 'path';\nimport { stringStartsWith } from './compat.ts';\n\nexport default function safeJoinPath(dest: string, relPath: string): string {\n const resolvedDest = path.resolve(dest);\n const resolvedFull = path.resolve(dest, relPath);\n if (resolvedFull !== resolvedDest && !stringStartsWith(resolvedFull, resolvedDest + path.sep)) {\n const err = new Error(`Path traversal detected: '${relPath}' escapes destination '${dest}'`) as NodeJS.ErrnoException;\n err.code = 'ETRAVERSAL';\n throw err;\n }\n return resolvedFull;\n}\n"],"names":["safeJoinPath","dest","relPath","resolvedDest","path","resolve","resolvedFull","stringStartsWith","sep","err","Error","code"],"mappings":";;;;+BAGA;;;eAAwBA;;;2DAHP;wBACgB;;;;;;AAElB,SAASA,aAAaC,IAAY,EAAEC,OAAe;IAChE,IAAMC,eAAeC,aAAI,CAACC,OAAO,CAACJ;IAClC,IAAMK,eAAeF,aAAI,CAACC,OAAO,CAACJ,MAAMC;IACxC,IAAII,iBAAiBH,gBAAgB,CAACI,IAAAA,0BAAgB,EAACD,cAAcH,eAAeC,aAAI,CAACI,GAAG,GAAG;QAC7F,IAAMC,MAAM,IAAIC,MAAM,AAAC,6BAA6DT,OAAjCC,SAAQ,2BAA8B,OAALD,MAAK;QACzFQ,IAAIE,IAAI,GAAG;QACX,MAAMF;IACR;IACA,OAAOH;AACT"}
|
|
@@ -5,6 +5,7 @@ import chmod from './fs/chmod.js';
|
|
|
5
5
|
import chown from './fs/chown.js';
|
|
6
6
|
import utimes from './fs/utimes.js';
|
|
7
7
|
import { objectAssign } from './shared/index.js';
|
|
8
|
+
import safeJoinPath from './shared/safeJoinPath.js';
|
|
8
9
|
import stripPath from './shared/stripPath.js';
|
|
9
10
|
import validateAttributes from './validateAttributes.js';
|
|
10
11
|
import waitForAccess from './waitForAccess.js';
|
|
@@ -20,7 +21,7 @@ let DirectoryEntry = class DirectoryEntry {
|
|
|
20
21
|
if (typeof callback === 'function') {
|
|
21
22
|
try {
|
|
22
23
|
const normalizedPath = path.normalize(this.path);
|
|
23
|
-
const fullPath =
|
|
24
|
+
const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));
|
|
24
25
|
// do not check for the existence of the directory but allow out-of-order calling
|
|
25
26
|
const queue = new Queue(1);
|
|
26
27
|
queue.defer(mkdirp.bind(null, fullPath));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/DirectoryEntry.ts"],"sourcesContent":["import mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { DirectoryAttributes, ExtractOptions, NoParamCallback } from './types.ts';\n\nexport default class DirectoryEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: DirectoryAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.type === undefined) this.type = 'directory';\n if (this.basename === undefined) this.basename = path.basename(this.path);\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath =
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/DirectoryEntry.ts"],"sourcesContent":["import mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport safeJoinPath from './shared/safeJoinPath.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { DirectoryAttributes, ExtractOptions, NoParamCallback } from './types.ts';\n\nexport default class DirectoryEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: DirectoryAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.type === undefined) this.type = 'directory';\n if (this.basename === undefined) this.basename = path.basename(this.path);\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));\n\n // do not check for the existence of the directory but allow out-of-order calling\n const queue = new Queue(1);\n queue.defer(mkdirp.bind(null, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n } catch (err) {\n callback(err);\n }\n return;\n }\n\n return new Promise((resolve, reject) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\n }\n\n destroy() {}\n}\n"],"names":["mkdirp","path","Queue","chmod","chown","utimes","objectAssign","safeJoinPath","stripPath","validateAttributes","waitForAccess","MANDATORY_ATTRIBUTES","DirectoryEntry","create","dest","options","callback","normalizedPath","normalize","fullPath","queue","defer","bind","await","err","Promise","resolve","reject","done","destroy","attributes","type","undefined","basename"],"mappings":"AAAA,OAAOA,YAAY,iBAAiB;AACpC,OAAOC,UAAU,OAAO;AACxB,OAAOC,WAAW,WAAW;AAC7B,OAAOC,WAAW,gBAAgB;AAClC,OAAOC,WAAW,gBAAgB;AAClC,OAAOC,YAAY,iBAAiB;AACpC,SAASC,YAAY,QAAQ,oBAAoB;AACjD,OAAOC,kBAAkB,2BAA2B;AACpD,OAAOC,eAAe,wBAAwB;AAC9C,OAAOC,wBAAwB,0BAA0B;AACzD,OAAOC,mBAAmB,qBAAqB;AAE/C,MAAMC,uBAAuB;IAAC;IAAQ;IAAS;CAAO;AAKvC,IAAA,AAAMC,iBAAN,MAAMA;IAiBnBC,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B,EAA2B;QACpHA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,IAAI;gBACF,MAAMC,iBAAiBhB,KAAKiB,SAAS,CAAC,IAAI,CAACjB,IAAI;gBAC/C,MAAMkB,WAAWZ,aAAaO,MAAMN,UAAUS,gBAAgBF;gBAE9D,iFAAiF;gBACjF,MAAMK,QAAQ,IAAIlB,MAAM;gBACxBkB,MAAMC,KAAK,CAACrB,OAAOsB,IAAI,CAAC,MAAMH;gBAC9BC,MAAMC,KAAK,CAACX,cAAcY,IAAI,CAAC,MAAMH;gBACrCC,MAAMC,KAAK,CAAClB,MAAMmB,IAAI,CAAC,MAAMH,UAAU,IAAI,EAAEJ;gBAC7CK,MAAMC,KAAK,CAACjB,MAAMkB,IAAI,CAAC,MAAMH,UAAU,IAAI,EAAEJ;gBAC7CK,MAAMC,KAAK,CAAChB,OAAOiB,IAAI,CAAC,MAAMH,UAAU,IAAI,EAAEJ;gBAC9CK,MAAMG,KAAK,CAACP;YACd,EAAE,OAAOQ,KAAK;gBACZR,SAASQ;YACX;YACA;QACF;QAEA,OAAO,IAAIC,QAAQ,CAACC,SAASC,SAAW,IAAI,CAACd,MAAM,CAACC,MAAMC,SAAS,CAACS,KAAaI,OAAoBJ,MAAMG,OAAOH,OAAOE,QAAQE;IACnI;IAEAC,UAAU,CAAC;IApCX,YAAYC,UAA+B,CAAE;QAC3CrB,mBAAmBqB,YAAYnB;QAC/BL,aAAa,IAAI,EAAEwB;QACnB,IAAI,IAAI,CAACC,IAAI,KAAKC,WAAW,IAAI,CAACD,IAAI,GAAG;QACzC,IAAI,IAAI,CAACE,QAAQ,KAAKD,WAAW,IAAI,CAACC,QAAQ,GAAGhC,KAAKgC,QAAQ,CAAC,IAAI,CAAChC,IAAI;IAC1E;AAgCF;AA5CA,SAAqBW,4BA4CpB"}
|
package/dist/esm/FileEntry.js
CHANGED
|
@@ -7,6 +7,7 @@ import chmod from './fs/chmod.js';
|
|
|
7
7
|
import chown from './fs/chown.js';
|
|
8
8
|
import utimes from './fs/utimes.js';
|
|
9
9
|
import { objectAssign } from './shared/index.js';
|
|
10
|
+
import safeJoinPath from './shared/safeJoinPath.js';
|
|
10
11
|
import stripPath from './shared/stripPath.js';
|
|
11
12
|
import validateAttributes from './validateAttributes.js';
|
|
12
13
|
import waitForAccess from './waitForAccess.js';
|
|
@@ -22,7 +23,7 @@ let FileEntry = class FileEntry {
|
|
|
22
23
|
if (typeof callback === 'function') {
|
|
23
24
|
try {
|
|
24
25
|
const normalizedPath = path.normalize(this.path);
|
|
25
|
-
const fullPath =
|
|
26
|
+
const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));
|
|
26
27
|
const queue = new Queue(1);
|
|
27
28
|
if (options.force) {
|
|
28
29
|
queue.defer((callback)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/FileEntry.ts"],"sourcesContent":["import { rm } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, FileAttributes, NoParamCallback, WriteFileFn } from './types.ts';\n\ninterface AbstractFileEntry {\n _writeFile: WriteFileFn;\n}\n\nexport default class FileEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: FileAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'file';\n if ((this as unknown as AbstractFileEntry)._writeFile === undefined) throw new Error('File this missing _writeFile. Please implement this method in your subclass');\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath =
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/FileEntry.ts"],"sourcesContent":["import { rm } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport safeJoinPath from './shared/safeJoinPath.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, FileAttributes, NoParamCallback, WriteFileFn } from './types.ts';\n\ninterface AbstractFileEntry {\n _writeFile: WriteFileFn;\n}\n\nexport default class FileEntry {\n mode: Mode;\n mtime: number;\n path: string;\n basename: string;\n type: string;\n\n constructor(attributes: FileAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'file';\n if ((this as unknown as AbstractFileEntry)._writeFile === undefined) throw new Error('File this missing _writeFile. Please implement this method in your subclass');\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n } else {\n // Check if file exists - throw EEXIST if it does\n queue.defer((callback) => {\n fs.stat(fullPath, (err) => {\n if (!err) {\n const existsErr = new Error(`EEXIST: file already exists, open '${fullPath}'`) as NodeJS.ErrnoException;\n existsErr.code = 'EEXIST';\n existsErr.path = fullPath;\n return callback(existsErr);\n }\n // ENOENT means file doesn't exist - that's what we want\n if (err.code === 'ENOENT') return callback();\n // Other errors should be reported\n callback(err);\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n queue.defer((this as unknown as AbstractFileEntry)._writeFile.bind(this, fullPath, options));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n } catch (err) {\n callback(err);\n }\n return;\n }\n\n return new Promise((resolve, reject) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\n }\n\n destroy() {}\n}\n"],"names":["rm","fs","mkdirp","path","Queue","chmod","chown","utimes","objectAssign","safeJoinPath","stripPath","validateAttributes","waitForAccess","MANDATORY_ATTRIBUTES","FileEntry","create","dest","options","callback","normalizedPath","normalize","fullPath","queue","force","defer","err","code","stat","existsErr","Error","bind","dirname","_writeFile","await","Promise","resolve","reject","done","destroy","attributes","basename","undefined","type"],"mappings":"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"}
|
package/dist/esm/LinkEntry.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import { rm } from 'fs-remove-compat';
|
|
3
|
+
import isAbsolute from 'is-absolute';
|
|
3
4
|
import mkdirp from 'mkdirp-classic';
|
|
4
5
|
import path from 'path';
|
|
5
6
|
import Queue from 'queue-cb';
|
|
@@ -7,6 +8,7 @@ import chmod from './fs/chmod.js';
|
|
|
7
8
|
import chown from './fs/chown.js';
|
|
8
9
|
import utimes from './fs/utimes.js';
|
|
9
10
|
import { objectAssign } from './shared/index.js';
|
|
11
|
+
import safeJoinPath from './shared/safeJoinPath.js';
|
|
10
12
|
import stripPath from './shared/stripPath.js';
|
|
11
13
|
import validateAttributes from './validateAttributes.js';
|
|
12
14
|
import waitForAccess from './waitForAccess.js';
|
|
@@ -23,9 +25,14 @@ let LinkEntry = class LinkEntry {
|
|
|
23
25
|
if (typeof callback === 'function') {
|
|
24
26
|
try {
|
|
25
27
|
const normalizedPath = path.normalize(this.path);
|
|
26
|
-
const fullPath =
|
|
28
|
+
const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));
|
|
29
|
+
if (isAbsolute(this.linkpath)) {
|
|
30
|
+
const err = new Error(`Absolute linkpath rejected: '${this.linkpath}'`);
|
|
31
|
+
err.code = 'ETRAVERSAL';
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
27
34
|
const normalizedLinkpath = path.normalize(this.linkpath);
|
|
28
|
-
const linkFullPath =
|
|
35
|
+
const linkFullPath = safeJoinPath(dest, stripPath(normalizedLinkpath, options));
|
|
29
36
|
const queue = new Queue(1);
|
|
30
37
|
if (options.force) {
|
|
31
38
|
queue.defer((callback)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/LinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class LinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'link';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath =
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/LinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport isAbsolute from 'is-absolute';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport utimes from './fs/utimes.ts';\nimport { objectAssign } from './shared/index.ts';\nimport safeJoinPath from './shared/safeJoinPath.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class LinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'link';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));\n if (isAbsolute(this.linkpath)) {\n const err = new Error(`Absolute linkpath rejected: '${this.linkpath}'`) as NodeJS.ErrnoException;\n err.code = 'ETRAVERSAL';\n throw err;\n }\n const normalizedLinkpath = path.normalize(this.linkpath);\n const linkFullPath = safeJoinPath(dest, stripPath(normalizedLinkpath, options));\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n queue.defer(waitForAccess.bind(null, linkFullPath)); // ensure target file is accessible before linking\n queue.defer(fs.link.bind(fs, linkFullPath, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath));\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(utimes.bind(null, fullPath, this, options));\n queue.await(callback);\n } catch (err) {\n callback(err);\n }\n return;\n }\n\n return new Promise((resolve, reject) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\n }\n\n destroy() {}\n}\n"],"names":["fs","rm","isAbsolute","mkdirp","path","Queue","chmod","chown","utimes","objectAssign","safeJoinPath","stripPath","validateAttributes","waitForAccess","MANDATORY_ATTRIBUTES","LinkEntry","create","dest","options","callback","normalizedPath","normalize","fullPath","linkpath","err","Error","code","normalizedLinkpath","linkFullPath","queue","force","defer","bind","dirname","link","await","Promise","resolve","reject","done","destroy","attributes","basename","undefined","type"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import chown from './fs/chown.js';
|
|
|
9
9
|
import lutimes from './fs/lutimes.js';
|
|
10
10
|
import symlinkWin32 from './fs/symlinkWin32.js';
|
|
11
11
|
import { objectAssign } from './shared/index.js';
|
|
12
|
+
import safeJoinPath from './shared/safeJoinPath.js';
|
|
12
13
|
import stripPath from './shared/stripPath.js';
|
|
13
14
|
import validateAttributes from './validateAttributes.js';
|
|
14
15
|
import waitForAccess from './waitForAccess.js';
|
|
@@ -26,14 +27,18 @@ let SymbolicLinkEntry = class SymbolicLinkEntry {
|
|
|
26
27
|
if (typeof callback === 'function') {
|
|
27
28
|
try {
|
|
28
29
|
const normalizedPath = path.normalize(this.path);
|
|
29
|
-
const fullPath =
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
linkFullPath = path.join(dest, stripPath(linkRelativePath, options));
|
|
35
|
-
normalizedLinkpath = path.relative(path.dirname(fullPath), linkFullPath);
|
|
30
|
+
const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));
|
|
31
|
+
if (isAbsolute(this.linkpath)) {
|
|
32
|
+
const err = new Error(`Absolute linkpath rejected: '${this.linkpath}'`);
|
|
33
|
+
err.code = 'ETRAVERSAL';
|
|
34
|
+
throw err;
|
|
36
35
|
}
|
|
36
|
+
// Resolve the symlink target against the symlink's own directory and verify it
|
|
37
|
+
// stays within dest. safeJoinPath throws ETRAVERSAL if it escapes.
|
|
38
|
+
const targetAbs = path.resolve(path.dirname(fullPath), this.linkpath);
|
|
39
|
+
safeJoinPath(dest, path.relative(dest, targetAbs));
|
|
40
|
+
const normalizedLinkpath = path.relative(path.dirname(fullPath), targetAbs);
|
|
41
|
+
const linkFullPath = targetAbs;
|
|
37
42
|
const queue = new Queue(1);
|
|
38
43
|
if (options.force) {
|
|
39
44
|
queue.defer((callback)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/SymbolicLinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport isAbsolute from 'is-absolute';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport lutimes from './fs/lutimes.ts';\nimport symlinkWin32 from './fs/symlinkWin32.ts';\nimport { objectAssign } from './shared/index.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class SymbolicLinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'symlink';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath =
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/SymbolicLinkEntry.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport isAbsolute from 'is-absolute';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport chmod from './fs/chmod.ts';\nimport chown from './fs/chown.ts';\nimport lutimes from './fs/lutimes.ts';\nimport symlinkWin32 from './fs/symlinkWin32.ts';\nimport { objectAssign } from './shared/index.ts';\nimport safeJoinPath from './shared/safeJoinPath.ts';\nimport stripPath from './shared/stripPath.ts';\nimport validateAttributes from './validateAttributes.ts';\nimport waitForAccess from './waitForAccess.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n\nconst MANDATORY_ATTRIBUTES = ['mode', 'mtime', 'path', 'linkpath'];\n\nimport type { Mode } from 'fs';\nimport type { ExtractOptions, LinkAttributes, NoParamCallback } from './types.ts';\n\nexport default class SymbolicLinkEntry {\n mode: Mode;\n mtime: number;\n path: string;\n linkpath: string;\n basename: string;\n type: string;\n\n constructor(attributes: LinkAttributes) {\n validateAttributes(attributes, MANDATORY_ATTRIBUTES);\n objectAssign(this, attributes);\n if (this.basename === undefined) this.basename = path.basename(this.path);\n if (this.type === undefined) this.type = 'symlink';\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n try {\n const normalizedPath = path.normalize(this.path);\n const fullPath = safeJoinPath(dest, stripPath(normalizedPath, options));\n\n if (isAbsolute(this.linkpath)) {\n const err = new Error(`Absolute linkpath rejected: '${this.linkpath}'`) as NodeJS.ErrnoException;\n err.code = 'ETRAVERSAL';\n throw err;\n }\n // Resolve the symlink target against the symlink's own directory and verify it\n // stays within dest. safeJoinPath throws ETRAVERSAL if it escapes.\n const targetAbs = path.resolve(path.dirname(fullPath), this.linkpath);\n safeJoinPath(dest, path.relative(dest, targetAbs));\n const normalizedLinkpath = path.relative(path.dirname(fullPath), targetAbs);\n const linkFullPath = targetAbs;\n\n const queue = new Queue(1);\n if (options.force) {\n queue.defer((callback) => {\n rm(fullPath, (err) => {\n err && err.code !== 'ENOENT' ? callback(err) : callback();\n });\n });\n }\n queue.defer(mkdirp.bind(null, path.dirname(fullPath)));\n if (isWindows) queue.defer(symlinkWin32.bind(null, linkFullPath, normalizedLinkpath, fullPath));\n else queue.defer(fs.symlink.bind(fs, normalizedLinkpath, fullPath));\n queue.defer(waitForAccess.bind(null, fullPath, true)); // noFollow=true for symlinks\n queue.defer(chmod.bind(null, fullPath, this, options));\n queue.defer(chown.bind(null, fullPath, this, options));\n queue.defer(lutimes.bind(null, fullPath, this, options));\n queue.await(callback);\n } catch (err) {\n callback(err);\n }\n return;\n }\n\n return new Promise((resolve, reject) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\n }\n\n destroy() {}\n}\n"],"names":["fs","rm","isAbsolute","mkdirp","path","Queue","chmod","chown","lutimes","symlinkWin32","objectAssign","safeJoinPath","stripPath","validateAttributes","waitForAccess","isWindows","process","platform","test","env","OSTYPE","MANDATORY_ATTRIBUTES","SymbolicLinkEntry","create","dest","options","callback","normalizedPath","normalize","fullPath","linkpath","err","Error","code","targetAbs","resolve","dirname","relative","normalizedLinkpath","linkFullPath","queue","force","defer","bind","symlink","await","Promise","reject","done","destroy","attributes","basename","undefined","type"],"mappings":"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"}
|
|
@@ -85,6 +85,7 @@ export declare function bufferConcat(list: (Buffer | Uint8Array)[], totalLength?
|
|
|
85
85
|
* Uses self-comparison: NaN is the only value not equal to itself
|
|
86
86
|
*/
|
|
87
87
|
export declare function isNaN(value: number): boolean;
|
|
88
|
+
export declare function stringStartsWith(str: string, search: string, position?: number): boolean;
|
|
88
89
|
export declare function inflateRaw(input: Buffer): Buffer;
|
|
89
90
|
export declare function createInflateRawStream(): NodeJS.ReadWriteStream;
|
|
90
91
|
export declare function objectAssign<T, U>(target: T, source: U): T & U;
|
|
@@ -296,6 +296,16 @@ export function isNaN(value) {
|
|
|
296
296
|
// biome-ignore lint/suspicious/noSelfCompare: NaN check pattern
|
|
297
297
|
return value !== value;
|
|
298
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* String.prototype.startsWith wrapper for Node.js 0.8+
|
|
301
|
+
* - Uses native startsWith on Node 4.0+ / ES2015+
|
|
302
|
+
* - Falls back to indexOf on Node 0.8-3.x
|
|
303
|
+
*/ const hasStartsWith = typeof String.prototype.startsWith === 'function';
|
|
304
|
+
export function stringStartsWith(str, search, position) {
|
|
305
|
+
if (hasStartsWith) return str.startsWith(search, position);
|
|
306
|
+
position = position || 0;
|
|
307
|
+
return str.indexOf(search, position) === position;
|
|
308
|
+
}
|
|
299
309
|
/**
|
|
300
310
|
* Decompress raw DEFLATE data (no zlib/gzip header)
|
|
301
311
|
* - Uses native zlib.inflateRawSync() on Node 0.11.12+
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/compat.ts"],"sourcesContent":["/**\n * Buffer Compatibility Layer for Node.js 0.8+\n *\n * Provides buffer utilities that work across all Node.js versions\n * WITHOUT modifying global Buffer object.\n *\n * Version history:\n * - Node 0.8-4.4: Only has `new Buffer()`, no `Buffer.alloc/from`\n * - Node 4.5+: Has `Buffer.alloc/from`, deprecates `new Buffer()`\n * - Node 10+: Warns or errors on `new Buffer()`\n *\n * Solution: Feature detection with graceful fallback in both directions.\n */\n\n// ESM-compatible require - works in both CJS and ESM\nimport Module from 'module';\n\nconst _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\n\n// Feature detection (runs once at module load)\nconst hasBufferAlloc = typeof Buffer.alloc === 'function';\nconst hasBufferAllocUnsafe = typeof Buffer.allocUnsafe === 'function';\nconst hasBufferFrom = typeof Buffer.from === 'function' && Buffer.from !== Uint8Array.from;\n\n// Maximum buffer size that works across all Node.js versions\n// Node 0.8-4.x: kMaxLength = 0x3fffffff (~1073MB) but actual limit may be lower\n// Node 6-7.x: ~1073MB for Uint8Array\n// Node 8+: ~2GB for Buffer\n// Node 10+: 2^31-1 (~2147MB) for Buffer.allocUnsafe\n// Use 256MB as a conservative limit for buffer operations\n// Must leave room for pairwise combination (256MB * 2 = 512MB, 512MB * 2 = 1024MB, etc.)\nexport const MAX_SAFE_BUFFER_LENGTH = 256 * 1024 * 1024; // 256MB\n\n// Try to detect the actual kMaxLength for this Node version\n// If we can't detect it (older Node), assume conservative limit\nlet DETECTED_MAX_LENGTH: number | null = null;\n\nfunction getMaxBufferLength(): number {\n if (DETECTED_MAX_LENGTH !== null) return DETECTED_MAX_LENGTH;\n\n // kMaxLength may not exist at runtime on very old or very new Node\n // Modern Node (v8+) doesn't expose kMaxLength but allows large buffers\n const maxLen = (Buffer as { kMaxLength?: number }).kMaxLength;\n if (maxLen !== undefined) {\n DETECTED_MAX_LENGTH = maxLen;\n } else {\n // Node 0.8-4.x: use conservative limit\n // Node 8+: can allocate up to ~2GB (v8 array buffer limit)\n // Use the higher limit for modern Node\n const nodeVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n if (nodeVersion >= 8) {\n DETECTED_MAX_LENGTH = Number.MAX_SAFE_INTEGER; // Effectively unlimited\n } else {\n DETECTED_MAX_LENGTH = 0x3fffffff; // ~1073MB for older Node\n }\n }\n\n return DETECTED_MAX_LENGTH;\n}\n\n/**\n * Check if a buffer size can be safely allocated on this Node version\n * Uses conservative limit to work across all versions\n */\nexport function canAllocateBufferSize(size: number): boolean {\n return size >= 0 && size <= MAX_SAFE_BUFFER_LENGTH;\n}\n\n/**\n * Create a single chunk of the specified size\n */\nfunction createChunk(size: number, zeroFill: boolean): Buffer {\n if (hasBufferAlloc) {\n return Buffer.alloc(size);\n }\n const buf = new Buffer(size);\n if (zeroFill) buf.fill(0);\n return buf;\n}\n\n/**\n * Combine an array of buffers into one by iterative concatenation\n * Stays under the actual kMaxLength for each Node version\n * Uses a \"fill and continue\" approach\n */\nfunction combineBuffersPairwise(buffers: Buffer[]): Buffer {\n const maxLength = getMaxBufferLength();\n\n // Calculate total size\n let totalSize = 0;\n for (let i = 0; i < buffers.length; i++) {\n totalSize += buffers[i].length;\n }\n\n // If total exceeds this Node version's limit, we cannot combine\n // LZMA1 requires a single contiguous Buffer input\n if (totalSize > maxLength) {\n throw new Error(`Cannot combine buffers: total size (${totalSize} bytes) exceeds Node.js buffer limit (${maxLength} bytes). LZMA1 archives with folders larger than ${Math.floor(maxLength / 1024 / 1024)}MB cannot be processed on this Node version.`);\n }\n\n // If everything fits in a single allocation, do it directly\n const result = createChunk(totalSize, false);\n let offset = 0;\n for (let i = 0; i < buffers.length; i++) {\n buffers[i].copy(result, offset);\n offset += buffers[i].length;\n }\n return result;\n}\n\n/**\n * Allocate a large buffer by allocating in chunks and combining them\n * Handles both zero-filled (safe) and uninitialized (unsafe) variants\n */\nfunction allocBufferLarge(size: number, zeroFill: boolean): Buffer {\n // For large sizes, allocate smaller chunks and combine them\n const numChunks = Math.ceil(size / MAX_SAFE_BUFFER_LENGTH);\n const chunks: Buffer[] = [];\n\n // Allocate individual chunks (each <= MAX_SAFE_BUFFER_LENGTH)\n for (let i = 0; i < numChunks; i++) {\n const chunkSize = Math.min(MAX_SAFE_BUFFER_LENGTH, size - i * MAX_SAFE_BUFFER_LENGTH);\n chunks.push(createChunk(chunkSize, zeroFill));\n }\n\n // Combine chunks iteratively using pairwise combination\n return combineBuffersPairwise(chunks);\n}\n\n/**\n * Allocate a zero-filled buffer (safe) - handles very large allocations\n * - Uses Buffer.alloc() on Node 4.5+\n * - Falls back to new Buffer() + fill on Node 0.8-4.4\n * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks and copies\n */\nexport function allocBuffer(size: number): Buffer {\n if (size === 0) {\n return new Buffer(0);\n }\n\n // Use native allocation for sizes within safe limits\n if (canAllocateBufferSize(size)) {\n if (hasBufferAlloc) {\n return Buffer.alloc(size);\n }\n // Legacy fallback: new Buffer() is uninitialized, must zero-fill\n const buf = new Buffer(size);\n buf.fill(0);\n return buf;\n }\n\n // For large sizes, allocate in chunks with zero-filling\n return allocBufferLarge(size, true);\n}\n\n/**\n * Allocate a buffer without initialization (unsafe but faster)\n * - Uses Buffer.allocUnsafe() on Node 4.5+\n * - Falls back to new Buffer() on Node 0.8-4.4\n * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks without zeroing\n *\n * WARNING: Buffer contents are uninitialized and may contain sensitive data.\n * Only use when you will immediately overwrite all bytes.\n */\nexport function allocBufferUnsafe(size: number): Buffer {\n if (size === 0) {\n return new Buffer(0);\n }\n\n // Use native allocation for sizes within safe limits\n if (canAllocateBufferSize(size)) {\n if (hasBufferAllocUnsafe) {\n return Buffer.allocUnsafe(size);\n }\n return new Buffer(size);\n }\n\n // For large sizes, allocate in chunks without zero-filling\n return allocBufferLarge(size, false);\n}\n\n/**\n * Create a buffer from string, array, or existing buffer\n * - Uses Buffer.from() on Node 4.5+\n * - Falls back to new Buffer() on Node 0.8-4.4\n * - Handles Uint8Array conversion for Node 0.8 (crypto output compatibility)\n */\nexport function bufferFrom(data: string | number[] | Buffer | Uint8Array, encoding?: BufferEncoding): Buffer {\n if (hasBufferFrom) {\n if (typeof data === 'string') {\n return Buffer.from(data, encoding);\n }\n return Buffer.from(data as number[] | Buffer);\n }\n // Node 0.8 compatibility - deprecated Buffer constructor\n // For Uint8Array, convert to array first (needed for crypto output in Node 0.8)\n if (data instanceof Uint8Array && !(data instanceof Buffer)) {\n const arr: number[] = [];\n for (let i = 0; i < data.length; i++) {\n arr.push(data[i]);\n }\n return new Buffer(arr);\n }\n return new Buffer(data as string & number[], encoding);\n}\n\n/**\n * Compare two buffers or buffer regions\n * - Uses Buffer.compare() on Node 5.10+ (with offset support)\n * - Falls back to manual comparison on Node 0.8-5.9\n */\nexport function bufferCompare(source: Buffer, target: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number {\n sourceStart = sourceStart || 0;\n sourceEnd = sourceEnd || source.length;\n targetStart = targetStart || 0;\n targetEnd = targetEnd || target.length;\n\n // Check if native compare with offset support exists (Node 5.10+)\n if (source.compare && source.compare.length >= 5) {\n return source.compare(target, targetStart, targetEnd, sourceStart, sourceEnd);\n }\n\n // Manual comparison for older Node versions\n const sourceLen = sourceEnd - sourceStart;\n const targetLen = targetEnd - targetStart;\n const len = Math.min(sourceLen, targetLen);\n\n for (let i = 0; i < len; i++) {\n const s = source[sourceStart + i];\n const t = target[targetStart + i];\n if (s !== t) return s < t ? -1 : 1;\n }\n\n return sourceLen - targetLen;\n}\n\n/**\n * Check if buffer region equals byte array\n * Useful for magic number detection without Buffer.from()\n */\nexport function bufferEquals(buf: Buffer, offset: number, expected: number[]): boolean {\n if (offset + expected.length > buf.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (buf[offset + i] !== expected[i]) return false;\n }\n return true;\n}\n\n/**\n * Copy buffer region to new buffer\n * Works on all Node versions\n */\nexport function bufferSliceCopy(buf: Buffer, start: number, end: number): Buffer {\n const result = allocBuffer(end - start);\n buf.copy(result, 0, start, end);\n return result;\n}\n\n/**\n * Read 64-bit unsigned integer (little-endian)\n * Uses two 32-bit reads since BigInt not available until Node 10.4\n *\n * WARNING: Only accurate for values < Number.MAX_SAFE_INTEGER (2^53 - 1)\n * This covers files up to ~9 PB which is practical for all real use cases.\n */\nexport function readUInt64LE(buf: Buffer, offset: number): number {\n const low = buf.readUInt32LE(offset);\n const high = buf.readUInt32LE(offset + 4);\n return high * 0x100000000 + low;\n}\n\n/**\n * Write 64-bit unsigned integer (little-endian)\n * Same precision limitation as readUInt64LE\n */\nexport function writeUInt64LE(buf: Buffer, value: number, offset: number): void {\n const low = value >>> 0;\n const high = (value / 0x100000000) >>> 0;\n buf.writeUInt32LE(low, offset);\n buf.writeUInt32LE(high, offset + 4);\n}\n\n/**\n * Concatenate buffers - compatible with Node 0.8+\n * Handles crypto output which may not be proper Buffer instances in old Node.\n * Also handles very large concatenations that would exceed buffer limits.\n *\n * NOTE: This function is primarily needed for AES decryption compatibility\n * in Node 0.8 where crypto output may not be proper Buffer instances.\n * Libraries not using crypto can use native Buffer.concat() directly.\n */\nexport function bufferConcat(list: (Buffer | Uint8Array)[], totalLength?: number): Buffer {\n // Calculate actual total length first\n let actualLength = 0;\n for (let i = 0; i < list.length; i++) {\n actualLength += list[i].length;\n }\n\n // Use specified totalLength or actual length\n const targetLength = totalLength !== undefined ? totalLength : actualLength;\n\n // Handle empty list\n if (list.length === 0) {\n return new Buffer(0);\n }\n\n // Handle very large concatenations that would exceed buffer limits\n // Use native Buffer.concat for smaller sizes (faster)\n if (targetLength <= MAX_SAFE_BUFFER_LENGTH) {\n // Check if all items are proper Buffers AND no truncation needed\n // (Node 0.8's Buffer.concat doesn't handle truncation well)\n let allBuffers = true;\n for (let j = 0; j < list.length; j++) {\n if (!(list[j] instanceof Buffer)) {\n allBuffers = false;\n break;\n }\n }\n if (allBuffers && targetLength >= actualLength) {\n return Buffer.concat(list as Buffer[], targetLength);\n }\n }\n\n // For large or complex concatenations, use chunked approach\n // This will use allocBuffer which handles large sizes via chunking\n const result = allocBuffer(targetLength);\n let offset = 0;\n\n for (let k = 0; k < list.length && offset < targetLength; k++) {\n const buf = list[k];\n const toCopy = Math.min(buf.length, targetLength - offset);\n\n if (buf instanceof Buffer) {\n buf.copy(result, offset, 0, toCopy);\n } else {\n // Uint8Array - need to copy byte by byte\n for (let l = 0; l < toCopy; l++) {\n result[offset + l] = buf[l];\n }\n }\n offset += toCopy;\n }\n\n return result;\n}\n\n/**\n * Node 0.8 compatible isNaN (Number.isNaN didn't exist until ES2015)\n * Uses self-comparison: NaN is the only value not equal to itself\n */\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy compatibility\nexport function isNaN(value: number): boolean {\n // biome-ignore lint/suspicious/noSelfCompare: NaN check pattern\n return value !== value;\n}\n\n/**\n * Decompress raw DEFLATE data (no zlib/gzip header)\n * - Uses native zlib.inflateRawSync() on Node 0.11.12+\n * - Falls back to pako for Node 0.8-0.10\n *\n * Version history:\n * - Node 0.8-0.10: No zlib sync methods, use pako\n * - Node 0.11.12+: zlib.inflateRawSync available\n */\n// Feature detection for native zlib sync methods (Node 0.11.12+)\nlet zlib: typeof import('zlib') | null = null;\ntry {\n zlib = _require('zlib');\n} catch (_e) {\n // zlib not available (shouldn't happen in Node.js)\n}\nconst hasNativeInflateRaw = zlib !== null && typeof zlib.inflateRawSync === 'function';\n\nexport function inflateRaw(input: Buffer): Buffer {\n if (hasNativeInflateRaw && zlib) {\n return zlib.inflateRawSync(input);\n }\n // Fallback to pako for Node 0.8-0.10\n const pako = _require('pako');\n return bufferFrom(pako.inflateRaw(input));\n}\n\n/**\n * Create a streaming raw DEFLATE decompressor (Transform stream)\n * Decompresses data incrementally to avoid holding full output in memory.\n *\n * - Uses native zlib.createInflateRaw() on Node 0.11.12+\n * - Falls back to pako-based Transform for Node 0.8-0.10\n *\n * @returns A Transform stream that decompresses raw DEFLATE data\n */\n// Check for native streaming inflate (Node 0.11.12+ has createInflateRaw)\n// biome-ignore lint/suspicious/noExplicitAny: createInflateRaw not in older TS definitions\nconst hasNativeStreamingInflate = zlib !== null && typeof (zlib as any).createInflateRaw === 'function';\n\nexport function createInflateRawStream(): NodeJS.ReadWriteStream {\n if (hasNativeStreamingInflate && zlib) {\n // Use native zlib streaming Transform\n // biome-ignore lint/suspicious/noExplicitAny: createInflateRaw not in older TS definitions\n return (zlib as any).createInflateRaw();\n }\n\n // Fallback to pako-based Transform for Node 0.8-0.10\n // Use readable-stream for Node 0.8 compatibility\n const Transform = _require('readable-stream').Transform;\n const pako = _require('pako');\n\n const inflate = new pako.Inflate({ raw: true, chunkSize: 16384 });\n const transform = new Transform();\n const pendingChunks: Buffer[] = [];\n let ended = false;\n\n // Pako calls onData synchronously during push()\n inflate.onData = (chunk: Uint8Array) => {\n pendingChunks.push(bufferFrom(chunk));\n };\n\n inflate.onEnd = (status: number) => {\n ended = true;\n if (status !== 0) {\n transform.emit('error', new Error(`Inflate error: ${inflate.msg || 'unknown'}`));\n }\n };\n\n transform._transform = function (chunk: Buffer, _encoding: string, callback: (err?: Error) => void) {\n try {\n inflate.push(chunk, false);\n // Push any pending decompressed chunks\n while (pendingChunks.length > 0) {\n this.push(pendingChunks.shift());\n }\n callback();\n } catch (err) {\n callback(err as Error);\n }\n };\n\n transform._flush = function (callback: (err?: Error) => void) {\n try {\n inflate.push(new Uint8Array(0), true); // Signal end\n // Push any remaining decompressed chunks\n while (pendingChunks.length > 0) {\n this.push(pendingChunks.shift());\n }\n if (ended && inflate.err) {\n callback(new Error(`Inflate error: ${inflate.msg || 'unknown'}`));\n } else {\n callback();\n }\n } catch (err) {\n callback(err as Error);\n }\n };\n\n return transform;\n}\n\n/**\n * Object.assign wrapper for Node.js 0.8+\n * - Uses native Object.assign on Node 4.0+\n * - Falls back to manual property copy on Node 0.8-3.x\n */\nconst hasObjectAssign = typeof Object.assign === 'function';\nconst _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nexport function objectAssign<T, U>(target: T, source: U): T & U {\n if (hasObjectAssign) return Object.assign(target, source);\n\n for (const key in source) {\n if (_hasOwnProperty.call(source, key)) (target as Record<string, unknown>)[key] = source[key];\n }\n return target as T & U;\n}\n\n/**\n * Stream compatibility - Transform class\n * - Uses native stream.Transform on Node 0.10+\n * - Falls back to readable-stream for Node 0.8\n */\nconst major = +process.versions.node.split('.')[0];\nexport const Readable: typeof import('stream').Readable = major > 0 ? _require('stream').Readable : _require('readable-stream').Readable;\nexport const Writable: typeof import('stream').Writable = major > 0 ? _require('stream').Writable : _require('readable-stream').Writable;\nexport const Transform: typeof import('stream').Transform = major > 0 ? _require('stream').Transform : _require('readable-stream').Transform;\nexport const PassThrough: typeof import('stream').PassThrough = major > 0 ? _require('stream').PassThrough : _require('readable-stream').PassThrough;\n"],"names":["Module","_require","require","createRequire","url","hasBufferAlloc","Buffer","alloc","hasBufferAllocUnsafe","allocUnsafe","hasBufferFrom","from","Uint8Array","MAX_SAFE_BUFFER_LENGTH","DETECTED_MAX_LENGTH","getMaxBufferLength","maxLen","kMaxLength","undefined","nodeVersion","parseInt","process","version","slice","split","Number","MAX_SAFE_INTEGER","canAllocateBufferSize","size","createChunk","zeroFill","buf","fill","combineBuffersPairwise","buffers","maxLength","totalSize","i","length","Error","Math","floor","result","offset","copy","allocBufferLarge","numChunks","ceil","chunks","chunkSize","min","push","allocBuffer","allocBufferUnsafe","bufferFrom","data","encoding","arr","bufferCompare","source","target","targetStart","targetEnd","sourceStart","sourceEnd","compare","sourceLen","targetLen","len","s","t","bufferEquals","expected","bufferSliceCopy","start","end","readUInt64LE","low","readUInt32LE","high","writeUInt64LE","value","writeUInt32LE","bufferConcat","list","totalLength","actualLength","targetLength","allBuffers","j","concat","k","toCopy","l","isNaN","zlib","_e","hasNativeInflateRaw","inflateRawSync","inflateRaw","input","pako","hasNativeStreamingInflate","createInflateRaw","createInflateRawStream","Transform","inflate","Inflate","raw","transform","pendingChunks","ended","onData","chunk","onEnd","status","emit","msg","_transform","_encoding","callback","shift","err","_flush","hasObjectAssign","Object","assign","_hasOwnProperty","prototype","hasOwnProperty","objectAssign","key","call","major","versions","node","Readable","Writable","PassThrough"],"mappings":"AAAA;;;;;;;;;;;;CAYC,GAED,qDAAqD;AACrD,OAAOA,YAAY,SAAS;AAE5B,MAAMC,WAAW,OAAOC,YAAY,cAAcF,OAAOG,aAAa,CAAC,YAAYC,GAAG,IAAIF;AAE1F,+CAA+C;AAC/C,MAAMG,iBAAiB,OAAOC,OAAOC,KAAK,KAAK;AAC/C,MAAMC,uBAAuB,OAAOF,OAAOG,WAAW,KAAK;AAC3D,MAAMC,gBAAgB,OAAOJ,OAAOK,IAAI,KAAK,cAAcL,OAAOK,IAAI,KAAKC,WAAWD,IAAI;AAE1F,6DAA6D;AAC7D,gFAAgF;AAChF,qCAAqC;AACrC,2BAA2B;AAC3B,oDAAoD;AACpD,0DAA0D;AAC1D,yFAAyF;AACzF,OAAO,MAAME,yBAAyB,MAAM,OAAO,KAAK,CAAC,QAAQ;AAEjE,4DAA4D;AAC5D,gEAAgE;AAChE,IAAIC,sBAAqC;AAEzC,SAASC;IACP,IAAID,wBAAwB,MAAM,OAAOA;IAEzC,mEAAmE;IACnE,uEAAuE;IACvE,MAAME,SAAS,AAACV,OAAmCW,UAAU;IAC7D,IAAID,WAAWE,WAAW;QACxBJ,sBAAsBE;IACxB,OAAO;QACL,uCAAuC;QACvC,2DAA2D;QAC3D,uCAAuC;QACvC,MAAMG,cAAcC,SAASC,QAAQC,OAAO,CAACC,KAAK,CAAC,GAAGC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;QACrE,IAAIL,eAAe,GAAG;YACpBL,sBAAsBW,OAAOC,gBAAgB,EAAE,wBAAwB;QACzE,OAAO;YACLZ,sBAAsB,YAAY,yBAAyB;QAC7D;IACF;IAEA,OAAOA;AACT;AAEA;;;CAGC,GACD,OAAO,SAASa,sBAAsBC,IAAY;IAChD,OAAOA,QAAQ,KAAKA,QAAQf;AAC9B;AAEA;;CAEC,GACD,SAASgB,YAAYD,IAAY,EAAEE,QAAiB;IAClD,IAAIzB,gBAAgB;QAClB,OAAOC,OAAOC,KAAK,CAACqB;IACtB;IACA,MAAMG,MAAM,IAAIzB,OAAOsB;IACvB,IAAIE,UAAUC,IAAIC,IAAI,CAAC;IACvB,OAAOD;AACT;AAEA;;;;CAIC,GACD,SAASE,uBAAuBC,OAAiB;IAC/C,MAAMC,YAAYpB;IAElB,uBAAuB;IACvB,IAAIqB,YAAY;IAChB,IAAK,IAAIC,IAAI,GAAGA,IAAIH,QAAQI,MAAM,EAAED,IAAK;QACvCD,aAAaF,OAAO,CAACG,EAAE,CAACC,MAAM;IAChC;IAEA,gEAAgE;IAChE,kDAAkD;IAClD,IAAIF,YAAYD,WAAW;QACzB,MAAM,IAAII,MAAM,CAAC,oCAAoC,EAAEH,UAAU,sCAAsC,EAAED,UAAU,iDAAiD,EAAEK,KAAKC,KAAK,CAACN,YAAY,OAAO,MAAM,4CAA4C,CAAC;IACzP;IAEA,4DAA4D;IAC5D,MAAMO,SAASb,YAAYO,WAAW;IACtC,IAAIO,SAAS;IACb,IAAK,IAAIN,IAAI,GAAGA,IAAIH,QAAQI,MAAM,EAAED,IAAK;QACvCH,OAAO,CAACG,EAAE,CAACO,IAAI,CAACF,QAAQC;QACxBA,UAAUT,OAAO,CAACG,EAAE,CAACC,MAAM;IAC7B;IACA,OAAOI;AACT;AAEA;;;CAGC,GACD,SAASG,iBAAiBjB,IAAY,EAAEE,QAAiB;IACvD,4DAA4D;IAC5D,MAAMgB,YAAYN,KAAKO,IAAI,CAACnB,OAAOf;IACnC,MAAMmC,SAAmB,EAAE;IAE3B,8DAA8D;IAC9D,IAAK,IAAIX,IAAI,GAAGA,IAAIS,WAAWT,IAAK;QAClC,MAAMY,YAAYT,KAAKU,GAAG,CAACrC,wBAAwBe,OAAOS,IAAIxB;QAC9DmC,OAAOG,IAAI,CAACtB,YAAYoB,WAAWnB;IACrC;IAEA,wDAAwD;IACxD,OAAOG,uBAAuBe;AAChC;AAEA;;;;;CAKC,GACD,OAAO,SAASI,YAAYxB,IAAY;IACtC,IAAIA,SAAS,GAAG;QACd,OAAO,IAAItB,OAAO;IACpB;IAEA,qDAAqD;IACrD,IAAIqB,sBAAsBC,OAAO;QAC/B,IAAIvB,gBAAgB;YAClB,OAAOC,OAAOC,KAAK,CAACqB;QACtB;QACA,iEAAiE;QACjE,MAAMG,MAAM,IAAIzB,OAAOsB;QACvBG,IAAIC,IAAI,CAAC;QACT,OAAOD;IACT;IAEA,wDAAwD;IACxD,OAAOc,iBAAiBjB,MAAM;AAChC;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASyB,kBAAkBzB,IAAY;IAC5C,IAAIA,SAAS,GAAG;QACd,OAAO,IAAItB,OAAO;IACpB;IAEA,qDAAqD;IACrD,IAAIqB,sBAAsBC,OAAO;QAC/B,IAAIpB,sBAAsB;YACxB,OAAOF,OAAOG,WAAW,CAACmB;QAC5B;QACA,OAAO,IAAItB,OAAOsB;IACpB;IAEA,2DAA2D;IAC3D,OAAOiB,iBAAiBjB,MAAM;AAChC;AAEA;;;;;CAKC,GACD,OAAO,SAAS0B,WAAWC,IAA6C,EAAEC,QAAyB;IACjG,IAAI9C,eAAe;QACjB,IAAI,OAAO6C,SAAS,UAAU;YAC5B,OAAOjD,OAAOK,IAAI,CAAC4C,MAAMC;QAC3B;QACA,OAAOlD,OAAOK,IAAI,CAAC4C;IACrB;IACA,yDAAyD;IACzD,gFAAgF;IAChF,IAAIA,gBAAgB3C,cAAc,CAAE2C,CAAAA,gBAAgBjD,MAAK,GAAI;QAC3D,MAAMmD,MAAgB,EAAE;QACxB,IAAK,IAAIpB,IAAI,GAAGA,IAAIkB,KAAKjB,MAAM,EAAED,IAAK;YACpCoB,IAAIN,IAAI,CAACI,IAAI,CAAClB,EAAE;QAClB;QACA,OAAO,IAAI/B,OAAOmD;IACpB;IACA,OAAO,IAAInD,OAAOiD,MAA2BC;AAC/C;AAEA;;;;CAIC,GACD,OAAO,SAASE,cAAcC,MAAc,EAAEC,MAAc,EAAEC,WAAoB,EAAEC,SAAkB,EAAEC,WAAoB,EAAEC,SAAkB;IAC9ID,cAAcA,eAAe;IAC7BC,YAAYA,aAAaL,OAAOrB,MAAM;IACtCuB,cAAcA,eAAe;IAC7BC,YAAYA,aAAaF,OAAOtB,MAAM;IAEtC,kEAAkE;IAClE,IAAIqB,OAAOM,OAAO,IAAIN,OAAOM,OAAO,CAAC3B,MAAM,IAAI,GAAG;QAChD,OAAOqB,OAAOM,OAAO,CAACL,QAAQC,aAAaC,WAAWC,aAAaC;IACrE;IAEA,4CAA4C;IAC5C,MAAME,YAAYF,YAAYD;IAC9B,MAAMI,YAAYL,YAAYD;IAC9B,MAAMO,MAAM5B,KAAKU,GAAG,CAACgB,WAAWC;IAEhC,IAAK,IAAI9B,IAAI,GAAGA,IAAI+B,KAAK/B,IAAK;QAC5B,MAAMgC,IAAIV,MAAM,CAACI,cAAc1B,EAAE;QACjC,MAAMiC,IAAIV,MAAM,CAACC,cAAcxB,EAAE;QACjC,IAAIgC,MAAMC,GAAG,OAAOD,IAAIC,IAAI,CAAC,IAAI;IACnC;IAEA,OAAOJ,YAAYC;AACrB;AAEA;;;CAGC,GACD,OAAO,SAASI,aAAaxC,GAAW,EAAEY,MAAc,EAAE6B,QAAkB;IAC1E,IAAI7B,SAAS6B,SAASlC,MAAM,GAAGP,IAAIO,MAAM,EAAE,OAAO;IAClD,IAAK,IAAID,IAAI,GAAGA,IAAImC,SAASlC,MAAM,EAAED,IAAK;QACxC,IAAIN,GAAG,CAACY,SAASN,EAAE,KAAKmC,QAAQ,CAACnC,EAAE,EAAE,OAAO;IAC9C;IACA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASoC,gBAAgB1C,GAAW,EAAE2C,KAAa,EAAEC,GAAW;IACrE,MAAMjC,SAASU,YAAYuB,MAAMD;IACjC3C,IAAIa,IAAI,CAACF,QAAQ,GAAGgC,OAAOC;IAC3B,OAAOjC;AACT;AAEA;;;;;;CAMC,GACD,OAAO,SAASkC,aAAa7C,GAAW,EAAEY,MAAc;IACtD,MAAMkC,MAAM9C,IAAI+C,YAAY,CAACnC;IAC7B,MAAMoC,OAAOhD,IAAI+C,YAAY,CAACnC,SAAS;IACvC,OAAOoC,OAAO,cAAcF;AAC9B;AAEA;;;CAGC,GACD,OAAO,SAASG,cAAcjD,GAAW,EAAEkD,KAAa,EAAEtC,MAAc;IACtE,MAAMkC,MAAMI,UAAU;IACtB,MAAMF,OAAO,AAACE,QAAQ,gBAAiB;IACvClD,IAAImD,aAAa,CAACL,KAAKlC;IACvBZ,IAAImD,aAAa,CAACH,MAAMpC,SAAS;AACnC;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASwC,aAAaC,IAA6B,EAAEC,WAAoB;IAC9E,sCAAsC;IACtC,IAAIC,eAAe;IACnB,IAAK,IAAIjD,IAAI,GAAGA,IAAI+C,KAAK9C,MAAM,EAAED,IAAK;QACpCiD,gBAAgBF,IAAI,CAAC/C,EAAE,CAACC,MAAM;IAChC;IAEA,6CAA6C;IAC7C,MAAMiD,eAAeF,gBAAgBnE,YAAYmE,cAAcC;IAE/D,oBAAoB;IACpB,IAAIF,KAAK9C,MAAM,KAAK,GAAG;QACrB,OAAO,IAAIhC,OAAO;IACpB;IAEA,mEAAmE;IACnE,sDAAsD;IACtD,IAAIiF,gBAAgB1E,wBAAwB;QAC1C,iEAAiE;QACjE,4DAA4D;QAC5D,IAAI2E,aAAa;QACjB,IAAK,IAAIC,IAAI,GAAGA,IAAIL,KAAK9C,MAAM,EAAEmD,IAAK;YACpC,IAAI,CAAEL,CAAAA,IAAI,CAACK,EAAE,YAAYnF,MAAK,GAAI;gBAChCkF,aAAa;gBACb;YACF;QACF;QACA,IAAIA,cAAcD,gBAAgBD,cAAc;YAC9C,OAAOhF,OAAOoF,MAAM,CAACN,MAAkBG;QACzC;IACF;IAEA,4DAA4D;IAC5D,mEAAmE;IACnE,MAAM7C,SAASU,YAAYmC;IAC3B,IAAI5C,SAAS;IAEb,IAAK,IAAIgD,IAAI,GAAGA,IAAIP,KAAK9C,MAAM,IAAIK,SAAS4C,cAAcI,IAAK;QAC7D,MAAM5D,MAAMqD,IAAI,CAACO,EAAE;QACnB,MAAMC,SAASpD,KAAKU,GAAG,CAACnB,IAAIO,MAAM,EAAEiD,eAAe5C;QAEnD,IAAIZ,eAAezB,QAAQ;YACzByB,IAAIa,IAAI,CAACF,QAAQC,QAAQ,GAAGiD;QAC9B,OAAO;YACL,yCAAyC;YACzC,IAAK,IAAIC,IAAI,GAAGA,IAAID,QAAQC,IAAK;gBAC/BnD,MAAM,CAACC,SAASkD,EAAE,GAAG9D,GAAG,CAAC8D,EAAE;YAC7B;QACF;QACAlD,UAAUiD;IACZ;IAEA,OAAOlD;AACT;AAEA;;;CAGC,GACD,6EAA6E;AAC7E,OAAO,SAASoD,MAAMb,KAAa;IACjC,gEAAgE;IAChE,OAAOA,UAAUA;AACnB;AAEA;;;;;;;;CAQC,GACD,iEAAiE;AACjE,IAAIc,OAAqC;AACzC,IAAI;IACFA,OAAO9F,SAAS;AAClB,EAAE,OAAO+F,IAAI;AACX,mDAAmD;AACrD;AACA,MAAMC,sBAAsBF,SAAS,QAAQ,OAAOA,KAAKG,cAAc,KAAK;AAE5E,OAAO,SAASC,WAAWC,KAAa;IACtC,IAAIH,uBAAuBF,MAAM;QAC/B,OAAOA,KAAKG,cAAc,CAACE;IAC7B;IACA,qCAAqC;IACrC,MAAMC,OAAOpG,SAAS;IACtB,OAAOqD,WAAW+C,KAAKF,UAAU,CAACC;AACpC;AAEA;;;;;;;;CAQC,GACD,0EAA0E;AAC1E,2FAA2F;AAC3F,MAAME,4BAA4BP,SAAS,QAAQ,OAAO,AAACA,KAAaQ,gBAAgB,KAAK;AAE7F,OAAO,SAASC;IACd,IAAIF,6BAA6BP,MAAM;QACrC,sCAAsC;QACtC,2FAA2F;QAC3F,OAAO,AAACA,KAAaQ,gBAAgB;IACvC;IAEA,qDAAqD;IACrD,iDAAiD;IACjD,MAAME,YAAYxG,SAAS,mBAAmBwG,SAAS;IACvD,MAAMJ,OAAOpG,SAAS;IAEtB,MAAMyG,UAAU,IAAIL,KAAKM,OAAO,CAAC;QAAEC,KAAK;QAAM3D,WAAW;IAAM;IAC/D,MAAM4D,YAAY,IAAIJ;IACtB,MAAMK,gBAA0B,EAAE;IAClC,IAAIC,QAAQ;IAEZ,gDAAgD;IAChDL,QAAQM,MAAM,GAAG,CAACC;QAChBH,cAAc3D,IAAI,CAACG,WAAW2D;IAChC;IAEAP,QAAQQ,KAAK,GAAG,CAACC;QACfJ,QAAQ;QACR,IAAII,WAAW,GAAG;YAChBN,UAAUO,IAAI,CAAC,SAAS,IAAI7E,MAAM,CAAC,eAAe,EAAEmE,QAAQW,GAAG,IAAI,WAAW;QAChF;IACF;IAEAR,UAAUS,UAAU,GAAG,SAAUL,KAAa,EAAEM,SAAiB,EAAEC,QAA+B;QAChG,IAAI;YACFd,QAAQvD,IAAI,CAAC8D,OAAO;YACpB,uCAAuC;YACvC,MAAOH,cAAcxE,MAAM,GAAG,EAAG;gBAC/B,IAAI,CAACa,IAAI,CAAC2D,cAAcW,KAAK;YAC/B;YACAD;QACF,EAAE,OAAOE,KAAK;YACZF,SAASE;QACX;IACF;IAEAb,UAAUc,MAAM,GAAG,SAAUH,QAA+B;QAC1D,IAAI;YACFd,QAAQvD,IAAI,CAAC,IAAIvC,WAAW,IAAI,OAAO,aAAa;YACpD,yCAAyC;YACzC,MAAOkG,cAAcxE,MAAM,GAAG,EAAG;gBAC/B,IAAI,CAACa,IAAI,CAAC2D,cAAcW,KAAK;YAC/B;YACA,IAAIV,SAASL,QAAQgB,GAAG,EAAE;gBACxBF,SAAS,IAAIjF,MAAM,CAAC,eAAe,EAAEmE,QAAQW,GAAG,IAAI,WAAW;YACjE,OAAO;gBACLG;YACF;QACF,EAAE,OAAOE,KAAK;YACZF,SAASE;QACX;IACF;IAEA,OAAOb;AACT;AAEA;;;;CAIC,GACD,MAAMe,kBAAkB,OAAOC,OAAOC,MAAM,KAAK;AACjD,MAAMC,kBAAkBF,OAAOG,SAAS,CAACC,cAAc;AAEvD,OAAO,SAASC,aAAmBtE,MAAS,EAAED,MAAS;IACrD,IAAIiE,iBAAiB,OAAOC,OAAOC,MAAM,CAAClE,QAAQD;IAElD,IAAK,MAAMwE,OAAOxE,OAAQ;QACxB,IAAIoE,gBAAgBK,IAAI,CAACzE,QAAQwE,MAAM,AAACvE,MAAkC,CAACuE,IAAI,GAAGxE,MAAM,CAACwE,IAAI;IAC/F;IACA,OAAOvE;AACT;AAEA;;;;CAIC,GACD,MAAMyE,QAAQ,CAAChH,QAAQiH,QAAQ,CAACC,IAAI,CAAC/G,KAAK,CAAC,IAAI,CAAC,EAAE;AAClD,OAAO,MAAMgH,WAA6CH,QAAQ,IAAIpI,SAAS,UAAUuI,QAAQ,GAAGvI,SAAS,mBAAmBuI,QAAQ,CAAC;AACzI,OAAO,MAAMC,WAA6CJ,QAAQ,IAAIpI,SAAS,UAAUwI,QAAQ,GAAGxI,SAAS,mBAAmBwI,QAAQ,CAAC;AACzI,OAAO,MAAMhC,YAA+C4B,QAAQ,IAAIpI,SAAS,UAAUwG,SAAS,GAAGxG,SAAS,mBAAmBwG,SAAS,CAAC;AAC7I,OAAO,MAAMiC,cAAmDL,QAAQ,IAAIpI,SAAS,UAAUyI,WAAW,GAAGzI,SAAS,mBAAmByI,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/compat.ts"],"sourcesContent":["/**\n * Buffer Compatibility Layer for Node.js 0.8+\n *\n * Provides buffer utilities that work across all Node.js versions\n * WITHOUT modifying global Buffer object.\n *\n * Version history:\n * - Node 0.8-4.4: Only has `new Buffer()`, no `Buffer.alloc/from`\n * - Node 4.5+: Has `Buffer.alloc/from`, deprecates `new Buffer()`\n * - Node 10+: Warns or errors on `new Buffer()`\n *\n * Solution: Feature detection with graceful fallback in both directions.\n */\n\n// ESM-compatible require - works in both CJS and ESM\nimport Module from 'module';\n\nconst _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\n\n// Feature detection (runs once at module load)\nconst hasBufferAlloc = typeof Buffer.alloc === 'function';\nconst hasBufferAllocUnsafe = typeof Buffer.allocUnsafe === 'function';\nconst hasBufferFrom = typeof Buffer.from === 'function' && Buffer.from !== Uint8Array.from;\n\n// Maximum buffer size that works across all Node.js versions\n// Node 0.8-4.x: kMaxLength = 0x3fffffff (~1073MB) but actual limit may be lower\n// Node 6-7.x: ~1073MB for Uint8Array\n// Node 8+: ~2GB for Buffer\n// Node 10+: 2^31-1 (~2147MB) for Buffer.allocUnsafe\n// Use 256MB as a conservative limit for buffer operations\n// Must leave room for pairwise combination (256MB * 2 = 512MB, 512MB * 2 = 1024MB, etc.)\nexport const MAX_SAFE_BUFFER_LENGTH = 256 * 1024 * 1024; // 256MB\n\n// Try to detect the actual kMaxLength for this Node version\n// If we can't detect it (older Node), assume conservative limit\nlet DETECTED_MAX_LENGTH: number | null = null;\n\nfunction getMaxBufferLength(): number {\n if (DETECTED_MAX_LENGTH !== null) return DETECTED_MAX_LENGTH;\n\n // kMaxLength may not exist at runtime on very old or very new Node\n // Modern Node (v8+) doesn't expose kMaxLength but allows large buffers\n const maxLen = (Buffer as { kMaxLength?: number }).kMaxLength;\n if (maxLen !== undefined) {\n DETECTED_MAX_LENGTH = maxLen;\n } else {\n // Node 0.8-4.x: use conservative limit\n // Node 8+: can allocate up to ~2GB (v8 array buffer limit)\n // Use the higher limit for modern Node\n const nodeVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n if (nodeVersion >= 8) {\n DETECTED_MAX_LENGTH = Number.MAX_SAFE_INTEGER; // Effectively unlimited\n } else {\n DETECTED_MAX_LENGTH = 0x3fffffff; // ~1073MB for older Node\n }\n }\n\n return DETECTED_MAX_LENGTH;\n}\n\n/**\n * Check if a buffer size can be safely allocated on this Node version\n * Uses conservative limit to work across all versions\n */\nexport function canAllocateBufferSize(size: number): boolean {\n return size >= 0 && size <= MAX_SAFE_BUFFER_LENGTH;\n}\n\n/**\n * Create a single chunk of the specified size\n */\nfunction createChunk(size: number, zeroFill: boolean): Buffer {\n if (hasBufferAlloc) {\n return Buffer.alloc(size);\n }\n const buf = new Buffer(size);\n if (zeroFill) buf.fill(0);\n return buf;\n}\n\n/**\n * Combine an array of buffers into one by iterative concatenation\n * Stays under the actual kMaxLength for each Node version\n * Uses a \"fill and continue\" approach\n */\nfunction combineBuffersPairwise(buffers: Buffer[]): Buffer {\n const maxLength = getMaxBufferLength();\n\n // Calculate total size\n let totalSize = 0;\n for (let i = 0; i < buffers.length; i++) {\n totalSize += buffers[i].length;\n }\n\n // If total exceeds this Node version's limit, we cannot combine\n // LZMA1 requires a single contiguous Buffer input\n if (totalSize > maxLength) {\n throw new Error(`Cannot combine buffers: total size (${totalSize} bytes) exceeds Node.js buffer limit (${maxLength} bytes). LZMA1 archives with folders larger than ${Math.floor(maxLength / 1024 / 1024)}MB cannot be processed on this Node version.`);\n }\n\n // If everything fits in a single allocation, do it directly\n const result = createChunk(totalSize, false);\n let offset = 0;\n for (let i = 0; i < buffers.length; i++) {\n buffers[i].copy(result, offset);\n offset += buffers[i].length;\n }\n return result;\n}\n\n/**\n * Allocate a large buffer by allocating in chunks and combining them\n * Handles both zero-filled (safe) and uninitialized (unsafe) variants\n */\nfunction allocBufferLarge(size: number, zeroFill: boolean): Buffer {\n // For large sizes, allocate smaller chunks and combine them\n const numChunks = Math.ceil(size / MAX_SAFE_BUFFER_LENGTH);\n const chunks: Buffer[] = [];\n\n // Allocate individual chunks (each <= MAX_SAFE_BUFFER_LENGTH)\n for (let i = 0; i < numChunks; i++) {\n const chunkSize = Math.min(MAX_SAFE_BUFFER_LENGTH, size - i * MAX_SAFE_BUFFER_LENGTH);\n chunks.push(createChunk(chunkSize, zeroFill));\n }\n\n // Combine chunks iteratively using pairwise combination\n return combineBuffersPairwise(chunks);\n}\n\n/**\n * Allocate a zero-filled buffer (safe) - handles very large allocations\n * - Uses Buffer.alloc() on Node 4.5+\n * - Falls back to new Buffer() + fill on Node 0.8-4.4\n * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks and copies\n */\nexport function allocBuffer(size: number): Buffer {\n if (size === 0) {\n return new Buffer(0);\n }\n\n // Use native allocation for sizes within safe limits\n if (canAllocateBufferSize(size)) {\n if (hasBufferAlloc) {\n return Buffer.alloc(size);\n }\n // Legacy fallback: new Buffer() is uninitialized, must zero-fill\n const buf = new Buffer(size);\n buf.fill(0);\n return buf;\n }\n\n // For large sizes, allocate in chunks with zero-filling\n return allocBufferLarge(size, true);\n}\n\n/**\n * Allocate a buffer without initialization (unsafe but faster)\n * - Uses Buffer.allocUnsafe() on Node 4.5+\n * - Falls back to new Buffer() on Node 0.8-4.4\n * - For sizes > MAX_SAFE_BUFFER_LENGTH, allocates in chunks without zeroing\n *\n * WARNING: Buffer contents are uninitialized and may contain sensitive data.\n * Only use when you will immediately overwrite all bytes.\n */\nexport function allocBufferUnsafe(size: number): Buffer {\n if (size === 0) {\n return new Buffer(0);\n }\n\n // Use native allocation for sizes within safe limits\n if (canAllocateBufferSize(size)) {\n if (hasBufferAllocUnsafe) {\n return Buffer.allocUnsafe(size);\n }\n return new Buffer(size);\n }\n\n // For large sizes, allocate in chunks without zero-filling\n return allocBufferLarge(size, false);\n}\n\n/**\n * Create a buffer from string, array, or existing buffer\n * - Uses Buffer.from() on Node 4.5+\n * - Falls back to new Buffer() on Node 0.8-4.4\n * - Handles Uint8Array conversion for Node 0.8 (crypto output compatibility)\n */\nexport function bufferFrom(data: string | number[] | Buffer | Uint8Array, encoding?: BufferEncoding): Buffer {\n if (hasBufferFrom) {\n if (typeof data === 'string') {\n return Buffer.from(data, encoding);\n }\n return Buffer.from(data as number[] | Buffer);\n }\n // Node 0.8 compatibility - deprecated Buffer constructor\n // For Uint8Array, convert to array first (needed for crypto output in Node 0.8)\n if (data instanceof Uint8Array && !(data instanceof Buffer)) {\n const arr: number[] = [];\n for (let i = 0; i < data.length; i++) {\n arr.push(data[i]);\n }\n return new Buffer(arr);\n }\n return new Buffer(data as string & number[], encoding);\n}\n\n/**\n * Compare two buffers or buffer regions\n * - Uses Buffer.compare() on Node 5.10+ (with offset support)\n * - Falls back to manual comparison on Node 0.8-5.9\n */\nexport function bufferCompare(source: Buffer, target: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number {\n sourceStart = sourceStart || 0;\n sourceEnd = sourceEnd || source.length;\n targetStart = targetStart || 0;\n targetEnd = targetEnd || target.length;\n\n // Check if native compare with offset support exists (Node 5.10+)\n if (source.compare && source.compare.length >= 5) {\n return source.compare(target, targetStart, targetEnd, sourceStart, sourceEnd);\n }\n\n // Manual comparison for older Node versions\n const sourceLen = sourceEnd - sourceStart;\n const targetLen = targetEnd - targetStart;\n const len = Math.min(sourceLen, targetLen);\n\n for (let i = 0; i < len; i++) {\n const s = source[sourceStart + i];\n const t = target[targetStart + i];\n if (s !== t) return s < t ? -1 : 1;\n }\n\n return sourceLen - targetLen;\n}\n\n/**\n * Check if buffer region equals byte array\n * Useful for magic number detection without Buffer.from()\n */\nexport function bufferEquals(buf: Buffer, offset: number, expected: number[]): boolean {\n if (offset + expected.length > buf.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (buf[offset + i] !== expected[i]) return false;\n }\n return true;\n}\n\n/**\n * Copy buffer region to new buffer\n * Works on all Node versions\n */\nexport function bufferSliceCopy(buf: Buffer, start: number, end: number): Buffer {\n const result = allocBuffer(end - start);\n buf.copy(result, 0, start, end);\n return result;\n}\n\n/**\n * Read 64-bit unsigned integer (little-endian)\n * Uses two 32-bit reads since BigInt not available until Node 10.4\n *\n * WARNING: Only accurate for values < Number.MAX_SAFE_INTEGER (2^53 - 1)\n * This covers files up to ~9 PB which is practical for all real use cases.\n */\nexport function readUInt64LE(buf: Buffer, offset: number): number {\n const low = buf.readUInt32LE(offset);\n const high = buf.readUInt32LE(offset + 4);\n return high * 0x100000000 + low;\n}\n\n/**\n * Write 64-bit unsigned integer (little-endian)\n * Same precision limitation as readUInt64LE\n */\nexport function writeUInt64LE(buf: Buffer, value: number, offset: number): void {\n const low = value >>> 0;\n const high = (value / 0x100000000) >>> 0;\n buf.writeUInt32LE(low, offset);\n buf.writeUInt32LE(high, offset + 4);\n}\n\n/**\n * Concatenate buffers - compatible with Node 0.8+\n * Handles crypto output which may not be proper Buffer instances in old Node.\n * Also handles very large concatenations that would exceed buffer limits.\n *\n * NOTE: This function is primarily needed for AES decryption compatibility\n * in Node 0.8 where crypto output may not be proper Buffer instances.\n * Libraries not using crypto can use native Buffer.concat() directly.\n */\nexport function bufferConcat(list: (Buffer | Uint8Array)[], totalLength?: number): Buffer {\n // Calculate actual total length first\n let actualLength = 0;\n for (let i = 0; i < list.length; i++) {\n actualLength += list[i].length;\n }\n\n // Use specified totalLength or actual length\n const targetLength = totalLength !== undefined ? totalLength : actualLength;\n\n // Handle empty list\n if (list.length === 0) {\n return new Buffer(0);\n }\n\n // Handle very large concatenations that would exceed buffer limits\n // Use native Buffer.concat for smaller sizes (faster)\n if (targetLength <= MAX_SAFE_BUFFER_LENGTH) {\n // Check if all items are proper Buffers AND no truncation needed\n // (Node 0.8's Buffer.concat doesn't handle truncation well)\n let allBuffers = true;\n for (let j = 0; j < list.length; j++) {\n if (!(list[j] instanceof Buffer)) {\n allBuffers = false;\n break;\n }\n }\n if (allBuffers && targetLength >= actualLength) {\n return Buffer.concat(list as Buffer[], targetLength);\n }\n }\n\n // For large or complex concatenations, use chunked approach\n // This will use allocBuffer which handles large sizes via chunking\n const result = allocBuffer(targetLength);\n let offset = 0;\n\n for (let k = 0; k < list.length && offset < targetLength; k++) {\n const buf = list[k];\n const toCopy = Math.min(buf.length, targetLength - offset);\n\n if (buf instanceof Buffer) {\n buf.copy(result, offset, 0, toCopy);\n } else {\n // Uint8Array - need to copy byte by byte\n for (let l = 0; l < toCopy; l++) {\n result[offset + l] = buf[l];\n }\n }\n offset += toCopy;\n }\n\n return result;\n}\n\n/**\n * Node 0.8 compatible isNaN (Number.isNaN didn't exist until ES2015)\n * Uses self-comparison: NaN is the only value not equal to itself\n */\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy compatibility\nexport function isNaN(value: number): boolean {\n // biome-ignore lint/suspicious/noSelfCompare: NaN check pattern\n return value !== value;\n}\n\n/**\n * String.prototype.startsWith wrapper for Node.js 0.8+\n * - Uses native startsWith on Node 4.0+ / ES2015+\n * - Falls back to indexOf on Node 0.8-3.x\n */\nconst hasStartsWith = typeof String.prototype.startsWith === 'function';\nexport function stringStartsWith(str: string, search: string, position?: number): boolean {\n if (hasStartsWith) return str.startsWith(search, position);\n position = position || 0;\n return str.indexOf(search, position) === position;\n}\n\n/**\n * Decompress raw DEFLATE data (no zlib/gzip header)\n * - Uses native zlib.inflateRawSync() on Node 0.11.12+\n * - Falls back to pako for Node 0.8-0.10\n *\n * Version history:\n * - Node 0.8-0.10: No zlib sync methods, use pako\n * - Node 0.11.12+: zlib.inflateRawSync available\n */\n// Feature detection for native zlib sync methods (Node 0.11.12+)\nlet zlib: typeof import('zlib') | null = null;\ntry {\n zlib = _require('zlib');\n} catch (_e) {\n // zlib not available (shouldn't happen in Node.js)\n}\nconst hasNativeInflateRaw = zlib !== null && typeof zlib.inflateRawSync === 'function';\n\nexport function inflateRaw(input: Buffer): Buffer {\n if (hasNativeInflateRaw && zlib) {\n return zlib.inflateRawSync(input);\n }\n // Fallback to pako for Node 0.8-0.10\n const pako = _require('pako');\n return bufferFrom(pako.inflateRaw(input));\n}\n\n/**\n * Create a streaming raw DEFLATE decompressor (Transform stream)\n * Decompresses data incrementally to avoid holding full output in memory.\n *\n * - Uses native zlib.createInflateRaw() on Node 0.11.12+\n * - Falls back to pako-based Transform for Node 0.8-0.10\n *\n * @returns A Transform stream that decompresses raw DEFLATE data\n */\n// Check for native streaming inflate (Node 0.11.12+ has createInflateRaw)\n// biome-ignore lint/suspicious/noExplicitAny: createInflateRaw not in older TS definitions\nconst hasNativeStreamingInflate = zlib !== null && typeof (zlib as any).createInflateRaw === 'function';\n\nexport function createInflateRawStream(): NodeJS.ReadWriteStream {\n if (hasNativeStreamingInflate && zlib) {\n // Use native zlib streaming Transform\n // biome-ignore lint/suspicious/noExplicitAny: createInflateRaw not in older TS definitions\n return (zlib as any).createInflateRaw();\n }\n\n // Fallback to pako-based Transform for Node 0.8-0.10\n // Use readable-stream for Node 0.8 compatibility\n const Transform = _require('readable-stream').Transform;\n const pako = _require('pako');\n\n const inflate = new pako.Inflate({ raw: true, chunkSize: 16384 });\n const transform = new Transform();\n const pendingChunks: Buffer[] = [];\n let ended = false;\n\n // Pako calls onData synchronously during push()\n inflate.onData = (chunk: Uint8Array) => {\n pendingChunks.push(bufferFrom(chunk));\n };\n\n inflate.onEnd = (status: number) => {\n ended = true;\n if (status !== 0) {\n transform.emit('error', new Error(`Inflate error: ${inflate.msg || 'unknown'}`));\n }\n };\n\n transform._transform = function (chunk: Buffer, _encoding: string, callback: (err?: Error) => void) {\n try {\n inflate.push(chunk, false);\n // Push any pending decompressed chunks\n while (pendingChunks.length > 0) {\n this.push(pendingChunks.shift());\n }\n callback();\n } catch (err) {\n callback(err as Error);\n }\n };\n\n transform._flush = function (callback: (err?: Error) => void) {\n try {\n inflate.push(new Uint8Array(0), true); // Signal end\n // Push any remaining decompressed chunks\n while (pendingChunks.length > 0) {\n this.push(pendingChunks.shift());\n }\n if (ended && inflate.err) {\n callback(new Error(`Inflate error: ${inflate.msg || 'unknown'}`));\n } else {\n callback();\n }\n } catch (err) {\n callback(err as Error);\n }\n };\n\n return transform;\n}\n\n/**\n * Object.assign wrapper for Node.js 0.8+\n * - Uses native Object.assign on Node 4.0+\n * - Falls back to manual property copy on Node 0.8-3.x\n */\nconst hasObjectAssign = typeof Object.assign === 'function';\nconst _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nexport function objectAssign<T, U>(target: T, source: U): T & U {\n if (hasObjectAssign) return Object.assign(target, source);\n\n for (const key in source) {\n if (_hasOwnProperty.call(source, key)) (target as Record<string, unknown>)[key] = source[key];\n }\n return target as T & U;\n}\n\n/**\n * Stream compatibility - Transform class\n * - Uses native stream.Transform on Node 0.10+\n * - Falls back to readable-stream for Node 0.8\n */\nconst major = +process.versions.node.split('.')[0];\nexport const Readable: typeof import('stream').Readable = major > 0 ? _require('stream').Readable : _require('readable-stream').Readable;\nexport const Writable: typeof import('stream').Writable = major > 0 ? _require('stream').Writable : _require('readable-stream').Writable;\nexport const Transform: typeof import('stream').Transform = major > 0 ? _require('stream').Transform : _require('readable-stream').Transform;\nexport const PassThrough: typeof import('stream').PassThrough = major > 0 ? _require('stream').PassThrough : _require('readable-stream').PassThrough;\n"],"names":["Module","_require","require","createRequire","url","hasBufferAlloc","Buffer","alloc","hasBufferAllocUnsafe","allocUnsafe","hasBufferFrom","from","Uint8Array","MAX_SAFE_BUFFER_LENGTH","DETECTED_MAX_LENGTH","getMaxBufferLength","maxLen","kMaxLength","undefined","nodeVersion","parseInt","process","version","slice","split","Number","MAX_SAFE_INTEGER","canAllocateBufferSize","size","createChunk","zeroFill","buf","fill","combineBuffersPairwise","buffers","maxLength","totalSize","i","length","Error","Math","floor","result","offset","copy","allocBufferLarge","numChunks","ceil","chunks","chunkSize","min","push","allocBuffer","allocBufferUnsafe","bufferFrom","data","encoding","arr","bufferCompare","source","target","targetStart","targetEnd","sourceStart","sourceEnd","compare","sourceLen","targetLen","len","s","t","bufferEquals","expected","bufferSliceCopy","start","end","readUInt64LE","low","readUInt32LE","high","writeUInt64LE","value","writeUInt32LE","bufferConcat","list","totalLength","actualLength","targetLength","allBuffers","j","concat","k","toCopy","l","isNaN","hasStartsWith","String","prototype","startsWith","stringStartsWith","str","search","position","indexOf","zlib","_e","hasNativeInflateRaw","inflateRawSync","inflateRaw","input","pako","hasNativeStreamingInflate","createInflateRaw","createInflateRawStream","Transform","inflate","Inflate","raw","transform","pendingChunks","ended","onData","chunk","onEnd","status","emit","msg","_transform","_encoding","callback","shift","err","_flush","hasObjectAssign","Object","assign","_hasOwnProperty","hasOwnProperty","objectAssign","key","call","major","versions","node","Readable","Writable","PassThrough"],"mappings":"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"}
|
|
@@ -22,5 +22,6 @@ export { crc32, crc32Region, verifyCrc32, verifyCrc32Region } from './crc32.js';
|
|
|
22
22
|
export { default as EntryStream } from './EntryStream.js';
|
|
23
23
|
export { type CleanupFn, default as Lock } from './Lock.js';
|
|
24
24
|
export { default as normalizePath } from './normalizePath.js';
|
|
25
|
+
export { default as safeJoinPath } from './safeJoinPath.js';
|
|
25
26
|
export { default as streamToString, type StreamToStringCallback } from './streamToString.js';
|
|
26
27
|
export { default as stripPath } from './stripPath.js';
|
package/dist/esm/shared/index.js
CHANGED
|
@@ -15,5 +15,6 @@ export { crc32, crc32Region, verifyCrc32, verifyCrc32Region } from './crc32.js';
|
|
|
15
15
|
export { default as EntryStream } from './EntryStream.js';
|
|
16
16
|
export { default as Lock } from './Lock.js';
|
|
17
17
|
export { default as normalizePath } from './normalizePath.js';
|
|
18
|
+
export { default as safeJoinPath } from './safeJoinPath.js';
|
|
18
19
|
export { default as streamToString } from './streamToString.js';
|
|
19
20
|
export { default as stripPath } from './stripPath.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/index.ts"],"sourcesContent":["/**\n * Shared utilities for iterator libraries\n *\n * These utilities are designed to be used by:\n * - zip-iterator\n * - 7z-iterator\n * - tar-iterator\n * - Any other archive iterator library\n *\n * All utilities support Node.js 0.8+\n */\n\nimport BufferList from './BufferList.ts';\n\nexport { BufferList };\n\n/**\n * Type alias for Buffer or BufferList - both can be read byte-by-byte.\n * Use this when an API should accept either contiguous data (Buffer)\n * or chunked streaming data (BufferList).\n */\nexport type BufferLike = Buffer | BufferList;\nexport {\n allocBuffer,\n allocBufferUnsafe,\n bufferCompare,\n bufferConcat,\n bufferEquals,\n bufferFrom,\n bufferSliceCopy,\n canAllocateBufferSize,\n createInflateRawStream,\n inflateRaw,\n isNaN,\n MAX_SAFE_BUFFER_LENGTH,\n objectAssign,\n PassThrough,\n Readable,\n readUInt64LE,\n Transform,\n Writable,\n writeUInt64LE,\n} from './compat.ts';\nexport { crc32, crc32Region, verifyCrc32, verifyCrc32Region } from './crc32.ts';\nexport { default as EntryStream } from './EntryStream.ts';\nexport { type CleanupFn, default as Lock } from './Lock.ts';\nexport { default as normalizePath } from './normalizePath.ts';\nexport { default as streamToString, type StreamToStringCallback } from './streamToString.ts';\nexport { default as stripPath } from './stripPath.ts';\n"],"names":["BufferList","allocBuffer","allocBufferUnsafe","bufferCompare","bufferConcat","bufferEquals","bufferFrom","bufferSliceCopy","canAllocateBufferSize","createInflateRawStream","inflateRaw","isNaN","MAX_SAFE_BUFFER_LENGTH","objectAssign","PassThrough","Readable","readUInt64LE","Transform","Writable","writeUInt64LE","crc32","crc32Region","verifyCrc32","verifyCrc32Region","default","EntryStream","Lock","normalizePath","streamToString","stripPath"],"mappings":"AAAA;;;;;;;;;;CAUC,GAED,OAAOA,gBAAgB,kBAAkB;AAEzC,SAASA,UAAU,GAAG;AAQtB,SACEC,WAAW,EACXC,iBAAiB,EACjBC,aAAa,EACbC,YAAY,EACZC,YAAY,EACZC,UAAU,EACVC,eAAe,EACfC,qBAAqB,EACrBC,sBAAsB,EACtBC,UAAU,EACVC,KAAK,EACLC,sBAAsB,EACtBC,YAAY,EACZC,WAAW,EACXC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,QAAQ,EACRC,aAAa,QACR,cAAc;AACrB,SAASC,KAAK,EAAEC,WAAW,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,aAAa;AAChF,SAASC,WAAWC,WAAW,QAAQ,mBAAmB;AAC1D,SAAyBD,WAAWE,IAAI,QAAQ,YAAY;AAC5D,SAASF,WAAWG,aAAa,QAAQ,qBAAqB;AAC9D,SAASH,WAAWI,cAAc,QAAqC,sBAAsB;AAC7F,
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/index.ts"],"sourcesContent":["/**\n * Shared utilities for iterator libraries\n *\n * These utilities are designed to be used by:\n * - zip-iterator\n * - 7z-iterator\n * - tar-iterator\n * - Any other archive iterator library\n *\n * All utilities support Node.js 0.8+\n */\n\nimport BufferList from './BufferList.ts';\n\nexport { BufferList };\n\n/**\n * Type alias for Buffer or BufferList - both can be read byte-by-byte.\n * Use this when an API should accept either contiguous data (Buffer)\n * or chunked streaming data (BufferList).\n */\nexport type BufferLike = Buffer | BufferList;\nexport {\n allocBuffer,\n allocBufferUnsafe,\n bufferCompare,\n bufferConcat,\n bufferEquals,\n bufferFrom,\n bufferSliceCopy,\n canAllocateBufferSize,\n createInflateRawStream,\n inflateRaw,\n isNaN,\n MAX_SAFE_BUFFER_LENGTH,\n objectAssign,\n PassThrough,\n Readable,\n readUInt64LE,\n Transform,\n Writable,\n writeUInt64LE,\n} from './compat.ts';\nexport { crc32, crc32Region, verifyCrc32, verifyCrc32Region } from './crc32.ts';\nexport { default as EntryStream } from './EntryStream.ts';\nexport { type CleanupFn, default as Lock } from './Lock.ts';\nexport { default as normalizePath } from './normalizePath.ts';\nexport { default as safeJoinPath } from './safeJoinPath.ts';\nexport { default as streamToString, type StreamToStringCallback } from './streamToString.ts';\nexport { default as stripPath } from './stripPath.ts';\n"],"names":["BufferList","allocBuffer","allocBufferUnsafe","bufferCompare","bufferConcat","bufferEquals","bufferFrom","bufferSliceCopy","canAllocateBufferSize","createInflateRawStream","inflateRaw","isNaN","MAX_SAFE_BUFFER_LENGTH","objectAssign","PassThrough","Readable","readUInt64LE","Transform","Writable","writeUInt64LE","crc32","crc32Region","verifyCrc32","verifyCrc32Region","default","EntryStream","Lock","normalizePath","safeJoinPath","streamToString","stripPath"],"mappings":"AAAA;;;;;;;;;;CAUC,GAED,OAAOA,gBAAgB,kBAAkB;AAEzC,SAASA,UAAU,GAAG;AAQtB,SACEC,WAAW,EACXC,iBAAiB,EACjBC,aAAa,EACbC,YAAY,EACZC,YAAY,EACZC,UAAU,EACVC,eAAe,EACfC,qBAAqB,EACrBC,sBAAsB,EACtBC,UAAU,EACVC,KAAK,EACLC,sBAAsB,EACtBC,YAAY,EACZC,WAAW,EACXC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,QAAQ,EACRC,aAAa,QACR,cAAc;AACrB,SAASC,KAAK,EAAEC,WAAW,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,aAAa;AAChF,SAASC,WAAWC,WAAW,QAAQ,mBAAmB;AAC1D,SAAyBD,WAAWE,IAAI,QAAQ,YAAY;AAC5D,SAASF,WAAWG,aAAa,QAAQ,qBAAqB;AAC9D,SAASH,WAAWI,YAAY,QAAQ,oBAAoB;AAC5D,SAASJ,WAAWK,cAAc,QAAqC,sBAAsB;AAC7F,SAASL,WAAWM,SAAS,QAAQ,iBAAiB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function safeJoinPath(dest: string, relPath: string): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { stringStartsWith } from './compat.js';
|
|
3
|
+
export default function safeJoinPath(dest, relPath) {
|
|
4
|
+
const resolvedDest = path.resolve(dest);
|
|
5
|
+
const resolvedFull = path.resolve(dest, relPath);
|
|
6
|
+
if (resolvedFull !== resolvedDest && !stringStartsWith(resolvedFull, resolvedDest + path.sep)) {
|
|
7
|
+
const err = new Error(`Path traversal detected: '${relPath}' escapes destination '${dest}'`);
|
|
8
|
+
err.code = 'ETRAVERSAL';
|
|
9
|
+
throw err;
|
|
10
|
+
}
|
|
11
|
+
return resolvedFull;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/extract-base-iterator/src/shared/safeJoinPath.ts"],"sourcesContent":["import path from 'path';\nimport { stringStartsWith } from './compat.ts';\n\nexport default function safeJoinPath(dest: string, relPath: string): string {\n const resolvedDest = path.resolve(dest);\n const resolvedFull = path.resolve(dest, relPath);\n if (resolvedFull !== resolvedDest && !stringStartsWith(resolvedFull, resolvedDest + path.sep)) {\n const err = new Error(`Path traversal detected: '${relPath}' escapes destination '${dest}'`) as NodeJS.ErrnoException;\n err.code = 'ETRAVERSAL';\n throw err;\n }\n return resolvedFull;\n}\n"],"names":["path","stringStartsWith","safeJoinPath","dest","relPath","resolvedDest","resolve","resolvedFull","sep","err","Error","code"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AACxB,SAASC,gBAAgB,QAAQ,cAAc;AAE/C,eAAe,SAASC,aAAaC,IAAY,EAAEC,OAAe;IAChE,MAAMC,eAAeL,KAAKM,OAAO,CAACH;IAClC,MAAMI,eAAeP,KAAKM,OAAO,CAACH,MAAMC;IACxC,IAAIG,iBAAiBF,gBAAgB,CAACJ,iBAAiBM,cAAcF,eAAeL,KAAKQ,GAAG,GAAG;QAC7F,MAAMC,MAAM,IAAIC,MAAM,CAAC,0BAA0B,EAAEN,QAAQ,uBAAuB,EAAED,KAAK,CAAC,CAAC;QAC3FM,IAAIE,IAAI,GAAG;QACX,MAAMF;IACR;IACA,OAAOF;AACT"}
|