@procedures/archive 0.3.0 → 0.5.0
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/CHANGELOG.md +40 -0
- package/README.md +30 -7
- package/dist/.tsbuildinfo +1 -1
- package/dist/format.d.ts +3 -1
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/module.d.ts +12 -5
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +15 -8
- package/dist/module.js.map +1 -1
- package/dist/procedures/archive/create.d.ts +3 -0
- package/dist/procedures/archive/create.d.ts.map +1 -1
- package/dist/procedures/archive/create.js +16 -7
- package/dist/procedures/archive/create.js.map +1 -1
- package/dist/procedures/archive/extract.d.ts +3 -0
- package/dist/procedures/archive/extract.d.ts.map +1 -1
- package/dist/procedures/archive/extract.js +12 -3
- package/dist/procedures/archive/extract.js.map +1 -1
- package/dist/procedures/archive/list.d.ts +2 -1
- package/dist/procedures/archive/list.d.ts.map +1 -1
- package/dist/procedures/archive/list.js +4 -3
- package/dist/procedures/archive/list.js.map +1 -1
- package/dist/root.d.ts +59 -0
- package/dist/root.d.ts.map +1 -0
- package/dist/root.js +128 -0
- package/dist/root.js.map +1 -0
- package/package.json +2 -2
- package/src/format.ts +3 -1
- package/src/index.ts +2 -0
- package/src/module.ts +21 -8
- package/src/procedures/archive/create.ts +14 -7
- package/src/procedures/archive/extract.ts +12 -3
- package/src/procedures/archive/list.ts +4 -3
- package/src/root.ts +149 -0
package/dist/format.d.ts
CHANGED
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
* And the limits of the module.
|
|
4
4
|
*/
|
|
5
5
|
import type { ArchiveFormat } from "./types.js";
|
|
6
|
-
/** The limits of the procedures of a module. */
|
|
6
|
+
/** The limits and the root of the procedures of a module. */
|
|
7
7
|
export interface ArchiveSettings {
|
|
8
8
|
/** The most bytes of the files of one archive: `extract` and `create` refuse more. */
|
|
9
9
|
readonly maxBytes: number;
|
|
10
10
|
/** The most entries of one archive. */
|
|
11
11
|
readonly maxEntries: number;
|
|
12
|
+
/** The absolute folder that confines each path of the inputs (roadmap R33), or undefined for no root. */
|
|
13
|
+
readonly root?: string | undefined;
|
|
12
14
|
}
|
|
13
15
|
/** The default most bytes: 1 GiB. */
|
|
14
16
|
export declare const DEFAULT_MAX_BYTES: number;
|
package/dist/format.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yGAAyG;IACzG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,qCAAqC;AACrC,eAAO,MAAM,iBAAiB,EAAE,MAA2B,CAAC;AAC5D,gCAAgC;AAChC,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAE3C,0CAA0C;AAC1C,eAAO,MAAM,wBAAwB,EAAE,eAAiG,CAAC;AAEzI,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,CAO1F;AAED,oEAAoE;AACpE,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAclF;AAED,yGAAyG;AACzG,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAUzG"}
|
package/dist/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,5 +4,6 @@ export { archiveCreate, archiveExtract, archiveList } from "./procedures/archive
|
|
|
4
4
|
export { ArchiveError, type ArchiveErrorCode } from "./errors.js";
|
|
5
5
|
export { DEFAULT_ARCHIVE_SETTINGS, DEFAULT_MAX_BYTES, DEFAULT_MAX_ENTRIES, formatOfFile, formatOfName, sniffFormat, type ArchiveSettings } from "./format.js";
|
|
6
6
|
export { entryParts, isAbsoluteName, planExtract, type PlanOptions, type PlannedEntry, type RawEntry } from "./paths.js";
|
|
7
|
+
export { OUTSIDE_ROOT, isInside, isOutsideRoot } from "./root.js";
|
|
7
8
|
export { crc32, readZipDirectory, writeZip, type ZipEntry, type ZipWriteEntry } from "./zip.js";
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE3F,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9J,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE3F,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9J,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,5 +6,7 @@ export { archiveCreate, archiveExtract, archiveList } from "./procedures/archive
|
|
|
6
6
|
export { ArchiveError } from "./errors.js";
|
|
7
7
|
export { DEFAULT_ARCHIVE_SETTINGS, DEFAULT_MAX_BYTES, DEFAULT_MAX_ENTRIES, formatOfFile, formatOfName, sniffFormat } from "./format.js";
|
|
8
8
|
export { entryParts, isAbsoluteName, planExtract } from "./paths.js";
|
|
9
|
+
// The root that confines each path (roadmap R33)
|
|
10
|
+
export { OUTSIDE_ROOT, isInside, isOutsideRoot } from "./root.js";
|
|
9
11
|
export { crc32, readZipDirectory, writeZip } from "./zip.js";
|
|
10
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC3F,2CAA2C;AAC3C,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAC;AAC9J,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAsD,MAAM,YAAY,CAAC;AACzH,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAqC,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC3F,2CAA2C;AAC3C,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAC;AAC9J,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAsD,MAAM,YAAY,CAAC;AACzH,iDAAiD;AACjD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAqC,MAAM,UAAU,CAAC"}
|
package/dist/module.d.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Scaffold a procedure with: mark procedure new <name> --path packages/archive
|
|
5
5
|
*
|
|
6
6
|
* `archiveModule` has the default limits: 1 GiB of files and 100000 entries in one archive.
|
|
7
|
-
* `createArchiveModule()` gives the same procedures with other limits (roadmap R46)
|
|
7
|
+
* `createArchiveModule()` gives the same procedures with other limits (roadmap R46), or with a
|
|
8
|
+
* root that confines each path of the inputs (roadmap R33, `root.ts`).
|
|
8
9
|
*/
|
|
9
10
|
import { type ProcedureModule, type ProcedureRegistry } from "@procedures/client";
|
|
10
11
|
/**
|
|
@@ -19,16 +20,22 @@ export interface ArchiveModuleOptions {
|
|
|
19
20
|
readonly maxBytes?: number | undefined;
|
|
20
21
|
/** The most entries of one archive. The default is 100000. */
|
|
21
22
|
readonly maxEntries?: number | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* The folder that confines each path of the procedures (roadmap R33), as `createFsModule({ root })`
|
|
25
|
+
* does. A relative path of an input starts at the root. A path outside the root gives `FORBIDDEN`
|
|
26
|
+
* with the reason `outside-root`. A relative root starts at the working folder of the process.
|
|
27
|
+
*/
|
|
28
|
+
readonly root?: string | undefined;
|
|
22
29
|
}
|
|
23
30
|
/**
|
|
24
|
-
* This function gives the module of this package with other limits
|
|
25
|
-
* `archiveModule`. A host gives it to `createRegistry()` before its bundles, so it
|
|
26
|
-
* `archiveModule` that a bundle requires (the first module of a name counts).
|
|
31
|
+
* This function gives the module of this package with other limits, or with a root. Without
|
|
32
|
+
* options, it gives `archiveModule`. A host gives it to `createRegistry()` before its bundles, so it
|
|
33
|
+
* replaces the `archiveModule` that a bundle requires (the first module of a name counts).
|
|
27
34
|
*/
|
|
28
35
|
export declare function createArchiveModule(options?: ArchiveModuleOptions): ProcedureModule;
|
|
29
36
|
/**
|
|
30
37
|
* This function registers the procedures of @procedures/archive in a registry. The default is the
|
|
31
|
-
* global registry. The options are the options of `createArchiveModule()
|
|
38
|
+
* global registry. The options are the options of `createArchiveModule()`, with the root too.
|
|
32
39
|
*/
|
|
33
40
|
export declare function registerArchiveProcedures(registry?: ProcedureRegistry, options?: ArchiveModuleOptions): void;
|
|
34
41
|
//# sourceMappingURL=module.d.ts.map
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAQL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAoI5B;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,eAAkG,CAAC;eAEhH,aAAa;AAE5B,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,eAAe,CAevF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,GAAE,iBAAsC,EAAE,OAAO,GAAE,oBAAyB,GAAG,IAAI,CAEpI"}
|
package/dist/module.js
CHANGED
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
* Scaffold a procedure with: mark procedure new <name> --path packages/archive
|
|
5
5
|
*
|
|
6
6
|
* `archiveModule` has the default limits: 1 GiB of files and 100000 entries in one archive.
|
|
7
|
-
* `createArchiveModule()` gives the same procedures with other limits (roadmap R46)
|
|
7
|
+
* `createArchiveModule()` gives the same procedures with other limits (roadmap R46), or with a
|
|
8
|
+
* root that confines each path of the inputs (roadmap R33, `root.ts`).
|
|
8
9
|
*/
|
|
10
|
+
import { resolve } from "node:path";
|
|
9
11
|
import { z } from "zod";
|
|
10
12
|
import { defineModule, registerModules, PROCEDURE_REGISTRY, createProcedure, zodAdapter, } from "@procedures/client";
|
|
11
13
|
import { archiveCreate } from "./procedures/archive/create.js";
|
|
@@ -21,7 +23,7 @@ const ArchiveCreateInputSchema = z.object({
|
|
|
21
23
|
output: path("The archive to make"),
|
|
22
24
|
source: path("A folder: the archive gets its content").optional(),
|
|
23
25
|
files: z.array(z.string().min(1).max(4096)).min(1).max(10_000).optional().describe("Files and folders, relative to cwd. A folder goes in with its content"),
|
|
24
|
-
cwd: path("The base folder of files (default: the working folder)").optional(),
|
|
26
|
+
cwd: path("The base folder of files (default: the working folder, or the root of the module)").optional(),
|
|
25
27
|
format: format.optional().describe("The format (default: from the name of output: .tar.gz, .tgz, .tar or .zip)"),
|
|
26
28
|
overwrite: z.boolean().optional().describe("True: replace an existing archive (default false)"),
|
|
27
29
|
});
|
|
@@ -121,26 +123,31 @@ function archiveProcedures(settings) {
|
|
|
121
123
|
export const archiveModule = defineModule("@procedures/archive", archiveProcedures(DEFAULT_ARCHIVE_SETTINGS));
|
|
122
124
|
export default archiveModule;
|
|
123
125
|
/**
|
|
124
|
-
* This function gives the module of this package with other limits
|
|
125
|
-
* `archiveModule`. A host gives it to `createRegistry()` before its bundles, so it
|
|
126
|
-
* `archiveModule` that a bundle requires (the first module of a name counts).
|
|
126
|
+
* This function gives the module of this package with other limits, or with a root. Without
|
|
127
|
+
* options, it gives `archiveModule`. A host gives it to `createRegistry()` before its bundles, so it
|
|
128
|
+
* replaces the `archiveModule` that a bundle requires (the first module of a name counts).
|
|
127
129
|
*/
|
|
128
130
|
export function createArchiveModule(options = {}) {
|
|
129
131
|
if (Object.values(options).every((value) => value === undefined))
|
|
130
132
|
return archiveModule;
|
|
131
|
-
const
|
|
133
|
+
const limits = {
|
|
132
134
|
maxBytes: options.maxBytes ?? DEFAULT_ARCHIVE_SETTINGS.maxBytes,
|
|
133
135
|
maxEntries: options.maxEntries ?? DEFAULT_ARCHIVE_SETTINGS.maxEntries,
|
|
134
136
|
};
|
|
135
|
-
for (const [name, value] of Object.entries(
|
|
137
|
+
for (const [name, value] of Object.entries(limits)) {
|
|
136
138
|
if (!Number.isSafeInteger(value) || value < 0)
|
|
137
139
|
throw new TypeError(`createArchiveModule: ${name} must be a whole number of 0 or more`);
|
|
138
140
|
}
|
|
141
|
+
if (options.root !== undefined && (typeof options.root !== "string" || options.root === "")) {
|
|
142
|
+
throw new TypeError("createArchiveModule: root must be the path of a folder");
|
|
143
|
+
}
|
|
144
|
+
// The root resolves against the working folder of the process now, as the root of @procedures/fs
|
|
145
|
+
const settings = { ...limits, ...(options.root !== undefined ? { root: resolve(options.root) } : {}) };
|
|
139
146
|
return defineModule("@procedures/archive", archiveProcedures(settings));
|
|
140
147
|
}
|
|
141
148
|
/**
|
|
142
149
|
* This function registers the procedures of @procedures/archive in a registry. The default is the
|
|
143
|
-
* global registry. The options are the options of `createArchiveModule()
|
|
150
|
+
* global registry. The options are the options of `createArchiveModule()`, with the root too.
|
|
144
151
|
*/
|
|
145
152
|
export function registerArchiveProcedures(registry = PROCEDURE_REGISTRY, options = {}) {
|
|
146
153
|
registerModules(registry, [createArchiveModule(options)]);
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
* Make a tar.gz, tar or zip archive of a folder or of files. The procedure writes a temporary
|
|
5
5
|
* file next to the archive, and renames it at the end: a failed call leaves no part of an
|
|
6
6
|
* archive. The walk does not follow a symbolic link: the archive gets the link.
|
|
7
|
+
*
|
|
8
|
+
* With the root of the module, the archive, the source, `cwd` and the folder of each file must be
|
|
9
|
+
* in the root. A link in the input goes into the archive as a link: the walk does not read its target.
|
|
7
10
|
*/
|
|
8
11
|
import { type ArchiveSettings } from "../../format.js";
|
|
9
12
|
import type { ArchiveCreateInput, ArchiveCreateOutput } from "../../types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/procedures/archive/create.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/procedures/archive/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAM/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAwB9E;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,GAAE,eAA0C,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA0CjJ"}
|
|
@@ -4,49 +4,58 @@
|
|
|
4
4
|
* Make a tar.gz, tar or zip archive of a folder or of files. The procedure writes a temporary
|
|
5
5
|
* file next to the archive, and renames it at the end: a failed call leaves no part of an
|
|
6
6
|
* archive. The walk does not follow a symbolic link: the archive gets the link.
|
|
7
|
+
*
|
|
8
|
+
* With the root of the module, the archive, the source, `cwd` and the folder of each file must be
|
|
9
|
+
* in the root. A link in the input goes into the archive as a link: the walk does not read its target.
|
|
7
10
|
*/
|
|
8
11
|
import { randomBytes } from "node:crypto";
|
|
9
12
|
import { mkdir, open, readFile, rename, rm, stat } from "node:fs/promises";
|
|
10
|
-
import { dirname
|
|
13
|
+
import { dirname } from "node:path";
|
|
11
14
|
import { ArchiveError } from "../../errors.js";
|
|
12
15
|
import { DEFAULT_ARCHIVE_SETTINGS, formatOfName } from "../../format.js";
|
|
13
16
|
import { entryParts } from "../../paths.js";
|
|
17
|
+
import { placesOf } from "../../root.js";
|
|
14
18
|
import { createTar } from "../../tar.js";
|
|
15
|
-
import { folderNames, walk } from "../../walk.js";
|
|
19
|
+
import { folderNames, under, walk } from "../../walk.js";
|
|
16
20
|
import { writeZip } from "../../zip.js";
|
|
17
21
|
/** The base folder and the names of the input. Exactly one of `source` and `files`. */
|
|
18
|
-
async function inputNames(input) {
|
|
22
|
+
async function inputNames(input, places) {
|
|
19
23
|
if ((input.source === undefined) === (input.files === undefined)) {
|
|
20
24
|
throw new ArchiveError("UNSAFE_PATH", "archive.create needs exactly one of source and files");
|
|
21
25
|
}
|
|
22
26
|
if (input.source !== undefined) {
|
|
23
|
-
const base =
|
|
27
|
+
const base = await places.place(input.source);
|
|
24
28
|
const stats = await stat(base).catch(() => undefined);
|
|
25
29
|
if (!stats?.isDirectory())
|
|
26
30
|
throw new ArchiveError("UNSAFE_PATH", `The source ${base} is not a folder`);
|
|
27
31
|
return { base, names: await folderNames(base) };
|
|
28
32
|
}
|
|
29
|
-
const base =
|
|
33
|
+
const base = await places.place(input.cwd ?? (places.root === undefined ? process.cwd() : "."));
|
|
30
34
|
const names = (input.files ?? []).map((name) => {
|
|
31
35
|
const parts = entryParts(name);
|
|
32
36
|
if (parts.length === 0)
|
|
33
37
|
throw new ArchiveError("UNSAFE_PATH", `The file ${JSON.stringify(name)} names the base folder: give source for a whole folder`, name);
|
|
34
38
|
return parts.join("/");
|
|
35
39
|
});
|
|
40
|
+
// The walk reads through the folders of a name: they must be in the root
|
|
41
|
+
if (places.root !== undefined)
|
|
42
|
+
for (const name of names)
|
|
43
|
+
await places.place(dirname(under(base, name)));
|
|
36
44
|
return { base, names };
|
|
37
45
|
}
|
|
38
46
|
/**
|
|
39
47
|
* Make a tar.gz or zip archive of a folder or of files
|
|
40
48
|
*/
|
|
41
49
|
export async function archiveCreate(input, settings = DEFAULT_ARCHIVE_SETTINGS) {
|
|
50
|
+
const places = await placesOf(settings.root, ["archive", "create"]);
|
|
51
|
+
const output = await places.place(input.output);
|
|
42
52
|
const format = formatOfName(input.output, input.format);
|
|
43
|
-
const output = resolve(input.output);
|
|
44
53
|
const existing = await stat(output).catch(() => undefined);
|
|
45
54
|
if (existing?.isDirectory())
|
|
46
55
|
throw new ArchiveError("EXISTS", `${output} is a folder`);
|
|
47
56
|
if (existing !== undefined && input.overwrite !== true)
|
|
48
57
|
throw new ArchiveError("EXISTS", `${output} exists: give overwrite: true to replace it`);
|
|
49
|
-
const { base, names } = await inputNames(input);
|
|
58
|
+
const { base, names } = await inputNames(input, places);
|
|
50
59
|
const temporary = `${output}.${randomBytes(6).toString("hex")}.tmp`;
|
|
51
60
|
const entries = await walk(base, names, { ...settings, exclude: new Set([output, temporary]) });
|
|
52
61
|
await mkdir(dirname(output), { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/procedures/archive/create.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/procedures/archive/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* `overwrite`, or an archive over the limits changes nothing.
|
|
8
8
|
*
|
|
9
9
|
* A damaged entry (its size or its CRC-32) stops the extract, and the files before it stay.
|
|
10
|
+
*
|
|
11
|
+
* With the root of the module, the archive and the target must be in the root. The checks of the
|
|
12
|
+
* entries keep each entry in the target, so the extract stays in the root.
|
|
10
13
|
*/
|
|
11
14
|
import { type ArchiveSettings } from "../../format.js";
|
|
12
15
|
import type { ArchiveExtractInput, ArchiveExtractOutput } from "../../types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/procedures/archive/extract.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/procedures/archive/extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAK/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAqDhF;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,GAAE,eAA0C,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkCpJ"}
|
|
@@ -7,11 +7,15 @@
|
|
|
7
7
|
* `overwrite`, or an archive over the limits changes nothing.
|
|
8
8
|
*
|
|
9
9
|
* A damaged entry (its size or its CRC-32) stops the extract, and the files before it stay.
|
|
10
|
+
*
|
|
11
|
+
* With the root of the module, the archive and the target must be in the root. The checks of the
|
|
12
|
+
* entries keep each entry in the target, so the extract stays in the root.
|
|
10
13
|
*/
|
|
11
14
|
import { lstat, mkdir, realpath, rm, symlink, unlink, utimes } from "node:fs/promises";
|
|
12
|
-
import { dirname, join
|
|
15
|
+
import { dirname, join } from "node:path";
|
|
13
16
|
import { DEFAULT_ARCHIVE_SETTINGS, formatOfFile } from "../../format.js";
|
|
14
17
|
import { planExtract } from "../../paths.js";
|
|
18
|
+
import { isInside, outsideRoot, placesOf } from "../../root.js";
|
|
15
19
|
import { extractTar, readTarEntries } from "../../tar.js";
|
|
16
20
|
import { extractZipFile, readZipDirectory, readZipLink } from "../../zip.js";
|
|
17
21
|
/** This function removes an old file or link at a path, so a new write does not follow it. */
|
|
@@ -70,7 +74,9 @@ function countsOf(planned) {
|
|
|
70
74
|
* Extract a tar.gz or zip archive into a folder, with a check of each path
|
|
71
75
|
*/
|
|
72
76
|
export async function archiveExtract(input, settings = DEFAULT_ARCHIVE_SETTINGS) {
|
|
73
|
-
const
|
|
77
|
+
const places = await placesOf(settings.root, ["archive", "extract"]);
|
|
78
|
+
const archive = await places.place(input.archive);
|
|
79
|
+
const folder = await places.place(input.target);
|
|
74
80
|
const format = await formatOfFile(archive, input.format);
|
|
75
81
|
const overwrite = input.overwrite === true;
|
|
76
82
|
// The entries, before a write
|
|
@@ -86,9 +92,12 @@ export async function archiveExtract(input, settings = DEFAULT_ARCHIVE_SETTINGS)
|
|
|
86
92
|
else {
|
|
87
93
|
raw = (await readTarEntries(archive, settings)).map((entry) => ({ name: entry.name, kind: entry.kind, size: entry.size, linkTarget: entry.linkTarget }));
|
|
88
94
|
}
|
|
89
|
-
const folder = resolve(input.target);
|
|
90
95
|
await mkdir(folder, { recursive: true });
|
|
91
96
|
const target = await realpath(folder);
|
|
97
|
+
// A link that came after the check of the root does not lead the extract out of it
|
|
98
|
+
if (places.root !== undefined && !isInside(places.root.real, target)) {
|
|
99
|
+
throw outsideRoot(["archive", "extract"], `the target ${JSON.stringify(input.target)} leads out of the root ${places.root.folder}`);
|
|
100
|
+
}
|
|
92
101
|
const planned = planExtract(raw, target, { overwrite, maxBytes: settings.maxBytes, maxEntries: settings.maxEntries });
|
|
93
102
|
if (format === "zip") {
|
|
94
103
|
await writeZipEntries(archive, target, planned, zipEntries);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/procedures/archive/extract.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/procedures/archive/extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* archive.list procedure
|
|
3
3
|
*
|
|
4
4
|
* The entries of a tar.gz, tar or zip archive: the path, the kind, the size, the mode, the time
|
|
5
|
-
* and the target of a link. The list reads the archive and writes nothing.
|
|
5
|
+
* and the target of a link. The list reads the archive and writes nothing. With the root of the
|
|
6
|
+
* module, the archive must be in the root.
|
|
6
7
|
*/
|
|
7
8
|
import { type ArchiveSettings } from "../../format.js";
|
|
8
9
|
import type { ArchiveEntry, ArchiveFormat, ArchiveListInput, ArchiveListOutput } from "../../types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/procedures/archive/list.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/procedures/archive/list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAI/F,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEvG,4EAA4E;AAC5E,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAyBzH;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,GAAE,eAA0C,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAK3I"}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* archive.list procedure
|
|
3
3
|
*
|
|
4
4
|
* The entries of a tar.gz, tar or zip archive: the path, the kind, the size, the mode, the time
|
|
5
|
-
* and the target of a link. The list reads the archive and writes nothing.
|
|
5
|
+
* and the target of a link. The list reads the archive and writes nothing. With the root of the
|
|
6
|
+
* module, the archive must be in the root.
|
|
6
7
|
*/
|
|
7
|
-
import { resolve } from "node:path";
|
|
8
8
|
import { DEFAULT_ARCHIVE_SETTINGS, formatOfFile } from "../../format.js";
|
|
9
|
+
import { placesOf } from "../../root.js";
|
|
9
10
|
import { readTarEntries } from "../../tar.js";
|
|
10
11
|
import { readZipDirectory, readZipLink } from "../../zip.js";
|
|
11
12
|
/** The entries of an archive of a known format. `extract` uses them too. */
|
|
@@ -39,7 +40,7 @@ export async function readEntries(path, format, settings) {
|
|
|
39
40
|
* The entries of a tar.gz or zip archive
|
|
40
41
|
*/
|
|
41
42
|
export async function archiveList(input, settings = DEFAULT_ARCHIVE_SETTINGS) {
|
|
42
|
-
const path =
|
|
43
|
+
const path = await (await placesOf(settings.root, ["archive", "list"])).place(input.archive);
|
|
43
44
|
const format = await formatOfFile(path, input.format);
|
|
44
45
|
const entries = await readEntries(path, format, { ...settings, maxBytes: Number.MAX_SAFE_INTEGER });
|
|
45
46
|
return { format, entries, bytes: entries.reduce((sum, entry) => sum + (entry.kind === "file" ? entry.size : 0), 0) };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/procedures/archive/list.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/procedures/archive/list.ts"],"names":[],"mappings":"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"}
|
package/dist/root.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The root of the archive procedures: one folder that confines each path (roadmap R33).
|
|
3
|
+
*
|
|
4
|
+
* The rules are the rules of `root.ts` of `@procedures/fs` (`createFsModule({ root })`):
|
|
5
|
+
* - A relative path starts at the root, not at the working folder of the process.
|
|
6
|
+
* - A path outside the root gives `FORBIDDEN` with the reason `outside-root`. This includes a
|
|
7
|
+
* path that goes up with `..`, an absolute path outside the root, a path on another drive, and
|
|
8
|
+
* a symlink or a junction that leads out of the root.
|
|
9
|
+
* - The check uses the real path (`fs.realpath`) of the path. For a path that does not exist, it
|
|
10
|
+
* uses the real path of the nearest existing ancestor. So a symlinked parent folder cannot
|
|
11
|
+
* lead a write or a `mkdir` out of the root.
|
|
12
|
+
*
|
|
13
|
+
* On Windows, the comparison ignores the case of the letters, and `/` and `\` are the same.
|
|
14
|
+
*/
|
|
15
|
+
import { InvocationError, type ProcedurePath } from "@procedures/client";
|
|
16
|
+
/** The reason of the `FORBIDDEN` error for a path outside the root. */
|
|
17
|
+
export declare const OUTSIDE_ROOT = "outside-root";
|
|
18
|
+
/**
|
|
19
|
+
* This function tells if `path` is `folder` or a path in `folder`. The two paths are absolute.
|
|
20
|
+
* On Windows, the case of the letters is not significant.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isInside(folder: string, path: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* This function gives the real path of an absolute path. For a path that does not exist, it
|
|
25
|
+
* gives the real path of the nearest existing ancestor and the rest of the path. A symlink whose
|
|
26
|
+
* target does not exist leads to its target, because a write follows it.
|
|
27
|
+
*/
|
|
28
|
+
export declare function realPathOf(path: string, links?: number): Promise<string>;
|
|
29
|
+
/** A root: the absolute path that the host gave, and its real path. */
|
|
30
|
+
export interface ResolvedRoot {
|
|
31
|
+
folder: string;
|
|
32
|
+
real: string;
|
|
33
|
+
}
|
|
34
|
+
/** This function gives the absolute path and the real path of a root. The root must exist. */
|
|
35
|
+
export declare function resolveRoot(root: string): Promise<ResolvedRoot>;
|
|
36
|
+
/** The `FORBIDDEN` error for a path outside the root. */
|
|
37
|
+
export declare function outsideRoot(procedure: ProcedurePath, message: string): InvocationError;
|
|
38
|
+
/** True for the `FORBIDDEN` error of a path outside the root. */
|
|
39
|
+
export declare function isOutsideRoot(error: unknown): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* This function gives the absolute path of `path` in the root. A relative path starts at the
|
|
42
|
+
* root. The real path decides: a path whose real path is outside the real path of the root gives
|
|
43
|
+
* `FORBIDDEN` with the reason `outside-root`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function inRoot(root: ResolvedRoot, path: string, procedure: ProcedurePath): Promise<string>;
|
|
46
|
+
/** The paths of one call of a procedure. */
|
|
47
|
+
export interface Places {
|
|
48
|
+
/** The root of the call, or undefined for a module without a root. */
|
|
49
|
+
readonly root: ResolvedRoot | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* This function gives the absolute path of a path of the input. Without a root, a relative path
|
|
52
|
+
* starts at the working folder. With a root, it starts at the root, and a path outside it gives
|
|
53
|
+
* `FORBIDDEN` with the reason `outside-root`.
|
|
54
|
+
*/
|
|
55
|
+
place(path: string): Promise<string>;
|
|
56
|
+
}
|
|
57
|
+
/** This function gives the paths of one call. With a root, the root must exist when the call starts. */
|
|
58
|
+
export declare function placesOf(root: string | undefined, procedure: ProcedurePath): Promise<Places>;
|
|
59
|
+
//# sourceMappingURL=root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEzE,uEAAuE;AACvE,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAK3C;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAG9D;AAoBD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBzE;AAED,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,8FAA8F;AAC9F,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAUrE;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAEtF;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAYxG;AAED,4CAA4C;AAC5C,MAAM,WAAW,MAAM;IACrB,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,wGAAwG;AACxG,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlG"}
|