nitro-nightly 4.0.0-20251010-091516-7cafddba → 4.0.0-20251030-091344-d4418b98
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/{_chunks/build2.mjs → _build/build.mjs} +108 -58
- package/dist/_build/build2.mjs +556 -0
- package/dist/_build/info.mjs +1002 -0
- package/dist/_build/prepare.mjs +1511 -0
- package/dist/_build/snapshot.mjs +185 -0
- package/dist/{_chunks/plugin.mjs → _build/vite.mjs} +295 -296
- package/dist/_build/vite2.mjs +149 -0
- package/dist/_chunks/_deps/@jridgewell/gen-mapping.mjs +189 -0
- package/dist/_chunks/_deps/@jridgewell/remapping.mjs +137 -0
- package/dist/_chunks/_deps/@jridgewell/resolve-uri.mjs +231 -0
- package/dist/_chunks/_deps/@jridgewell/sourcemap-codec.mjs +173 -0
- package/dist/_chunks/_deps/@jridgewell/trace-mapping.mjs +170 -0
- package/dist/_chunks/_deps/@pi0/vite-plugin-fullstack.mjs +575 -0
- package/dist/_chunks/_deps/@rollup/plugin-alias.mjs +89 -0
- package/dist/_chunks/_deps/@rollup/plugin-commonjs.mjs +2376 -0
- package/dist/_chunks/{index2.mjs → _deps/@rollup/plugin-inject.mjs} +5 -90
- package/dist/_chunks/_deps/@rollup/plugin-json.mjs +37 -0
- package/dist/_chunks/_deps/@rollup/plugin-node-resolve.mjs +1386 -0
- package/dist/_chunks/_deps/@rollup/plugin-replace.mjs +133 -0
- package/dist/_chunks/_deps/@rollup/pluginutils.mjs +346 -0
- package/dist/_chunks/_deps/acorn.mjs +6225 -0
- package/dist/_chunks/_deps/c12.mjs +510 -0
- package/dist/_chunks/_deps/chokidar.mjs +1428 -0
- package/dist/_chunks/_deps/citty.mjs +460 -0
- package/dist/_chunks/_deps/commondir.mjs +77 -0
- package/dist/_chunks/_deps/compatx.mjs +76 -0
- package/dist/_chunks/_deps/confbox.mjs +300 -0
- package/dist/_chunks/_deps/debug.mjs +885 -0
- package/dist/_chunks/_deps/deepmerge.mjs +147 -0
- package/dist/_chunks/_deps/depd.mjs +550 -0
- package/dist/_chunks/_deps/dot-prop.mjs +282 -0
- package/dist/_chunks/_deps/dotenv.mjs +555 -0
- package/dist/_chunks/_deps/duplexer.mjs +1 -0
- package/dist/_chunks/_deps/ee-first.mjs +104 -0
- package/dist/_chunks/_deps/encodeurl.mjs +69 -0
- package/dist/_chunks/_deps/escape-html.mjs +87 -0
- package/dist/_chunks/_deps/escape-string-regexp.mjs +13 -0
- package/dist/_chunks/_deps/estree-walker.mjs +433 -0
- package/dist/_chunks/_deps/etag.mjs +147 -0
- package/dist/_chunks/_deps/exsolve.mjs +1416 -0
- package/dist/_chunks/_deps/fdir.mjs +569 -0
- package/dist/_chunks/_deps/fresh.mjs +145 -0
- package/dist/_chunks/_deps/function-bind.mjs +106 -0
- package/dist/_chunks/{index4.mjs → _deps/giget.mjs} +21 -776
- package/dist/_chunks/_deps/gzip-size.mjs +19 -0
- package/dist/_chunks/_deps/hasown.mjs +19 -0
- package/dist/_chunks/_deps/http-errors.mjs +307 -0
- package/dist/_chunks/_deps/httpxy.mjs +580 -0
- package/dist/_chunks/_deps/inherits.mjs +57 -0
- package/dist/_chunks/_deps/is-core-module.mjs +596 -0
- package/dist/_chunks/_deps/is-module.mjs +25 -0
- package/dist/_chunks/_deps/is-reference.mjs +31 -0
- package/dist/_chunks/_deps/js-tokens.mjs +411 -0
- package/dist/_chunks/_deps/klona.mjs +137 -0
- package/dist/_chunks/_deps/knitwork.mjs +172 -0
- package/dist/_chunks/_deps/local-pkg.mjs +163 -0
- package/dist/_chunks/_deps/magic-string.mjs +1296 -0
- package/dist/_chunks/_deps/mime-db.mjs +11685 -0
- package/dist/_chunks/_deps/mime-types.mjs +287 -0
- package/dist/_chunks/_deps/mime.mjs +1172 -0
- package/dist/_chunks/_deps/mlly.mjs +2413 -0
- package/dist/_chunks/_deps/ms.mjs +172 -0
- package/dist/_chunks/_deps/node-fetch-native.mjs +3 -0
- package/dist/_chunks/_deps/nypm.mjs +219 -0
- package/dist/_chunks/_deps/on-finished.mjs +246 -0
- package/dist/_chunks/_deps/parseurl.mjs +168 -0
- package/dist/_chunks/_deps/path-parse.mjs +85 -0
- package/dist/_chunks/{pathe.M-eThtNZ.mjs → _deps/pathe.mjs} +48 -1
- package/dist/_chunks/_deps/perfect-debounce.mjs +88 -0
- package/dist/_chunks/_deps/picomatch.mjs +2144 -0
- package/dist/_chunks/_deps/pkg-types.mjs +247 -0
- package/dist/_chunks/{snapshot.mjs → _deps/pretty-bytes.mjs} +1 -105
- package/dist/_chunks/_deps/quansync.mjs +99 -0
- package/dist/_chunks/_deps/range-parser.mjs +171 -0
- package/dist/_chunks/_deps/rc9.mjs +219 -0
- package/dist/_chunks/_deps/readdirp.mjs +245 -0
- package/dist/_chunks/_deps/resolve.mjs +1260 -0
- package/dist/_chunks/_deps/rou3.mjs +326 -0
- package/dist/_chunks/_deps/send.mjs +1022 -0
- package/dist/_chunks/_deps/serve-static.mjs +228 -0
- package/dist/_chunks/_deps/setprototypeof.mjs +26 -0
- package/dist/_chunks/_deps/statuses.mjs +457 -0
- package/dist/_chunks/_deps/std-env.mjs +3 -0
- package/dist/_chunks/_deps/strip-literal.mjs +67 -0
- package/dist/_chunks/_deps/supports-color.mjs +44 -0
- package/dist/_chunks/_deps/tinyexec.mjs +552 -0
- package/dist/_chunks/_deps/tinyglobby.mjs +293 -0
- package/dist/_chunks/_deps/toidentifier.mjs +41 -0
- package/dist/_chunks/_deps/ultrahtml.mjs +3 -0
- package/dist/_chunks/_deps/unimport.mjs +2267 -0
- package/dist/_chunks/_deps/unplugin-utils.mjs +65 -0
- package/dist/_chunks/_deps/unplugin.mjs +1294 -0
- package/dist/_chunks/_deps/untyped.mjs +375 -0
- package/dist/_chunks/{info.mjs → _deps/unwasm.mjs} +8 -4206
- package/dist/_chunks/_deps/webpack-virtual-modules.mjs +360 -0
- package/dist/_chunks/_presets/_all.mjs +59 -0
- package/dist/_chunks/_presets/_nitro.mjs +74 -0
- package/dist/_chunks/_presets/_resolve.mjs +64 -0
- package/dist/_chunks/_presets/_static.mjs +69 -0
- package/dist/_chunks/_presets/_types.mjs +3 -0
- package/dist/_chunks/_presets/_utils.mjs +31 -0
- package/dist/_chunks/_presets/alwaysdata.mjs +17 -0
- package/dist/_chunks/_presets/aws-amplify.mjs +111 -0
- package/dist/_chunks/_presets/aws-lambda.mjs +23 -0
- package/dist/_chunks/_presets/azure.mjs +162 -0
- package/dist/_chunks/_presets/bun.mjs +19 -0
- package/dist/_chunks/_presets/cleavr.mjs +15 -0
- package/dist/_chunks/_presets/cloudflare.mjs +608 -0
- package/dist/_chunks/_presets/deno.mjs +196 -0
- package/dist/_chunks/_presets/digitalocean.mjs +14 -0
- package/dist/_chunks/_presets/firebase.mjs +47 -0
- package/dist/_chunks/_presets/flightcontrol.mjs +14 -0
- package/dist/_chunks/_presets/genezio.mjs +13 -0
- package/dist/_chunks/_presets/heroku.mjs +14 -0
- package/dist/_chunks/_presets/iis.mjs +194 -0
- package/dist/_chunks/_presets/index.mjs +62 -0
- package/dist/_chunks/_presets/koyeb.mjs +14 -0
- package/dist/_chunks/_presets/netlify.mjs +241 -0
- package/dist/_chunks/_presets/node.mjs +54 -0
- package/dist/_chunks/_presets/platform.mjs +14 -0
- package/dist/_chunks/_presets/render.mjs +14 -0
- package/dist/_chunks/_presets/standard.mjs +23 -0
- package/dist/_chunks/_presets/stormkit.mjs +18 -0
- package/dist/_chunks/_presets/vercel.mjs +375 -0
- package/dist/_chunks/_presets/winterjs.mjs +22 -0
- package/dist/_chunks/_presets/zeabur.mjs +69 -0
- package/dist/_chunks/_presets/zerops.mjs +27 -0
- package/dist/_chunks/app.mjs +9 -19206
- package/dist/_chunks/{index3.mjs → builder.mjs} +560 -970
- package/dist/_chunks/server.mjs +6 -4
- package/dist/{cli → _cli}/build.mjs +3 -8
- package/dist/{cli → _cli}/dev.mjs +38 -12
- package/dist/{cli/index2.mjs → _cli/index.mjs} +1 -2
- package/dist/{cli → _cli}/list.mjs +3 -4
- package/dist/{cli → _cli}/prepare.mjs +3 -4
- package/dist/{cli → _cli}/run.mjs +3 -4
- package/dist/{index.d.mts → builder.d.mts} +11 -11
- package/dist/builder.mjs +117 -0
- package/dist/cli/index.mjs +7 -464
- package/dist/node_modules/@speed-highlight/core/dist/index.js +1 -1
- package/dist/node_modules/@speed-highlight/core/dist/terminal.js +1 -1
- package/dist/node_modules/@speed-highlight/core/package.json +7 -3
- package/dist/node_modules/cookie-es/dist/index.mjs +262 -0
- package/dist/node_modules/cookie-es/package.json +37 -0
- package/dist/node_modules/hookable/dist/index.mjs +243 -266
- package/dist/node_modules/hookable/package.json +29 -26
- package/dist/node_modules/rendu/dist/index.mjs +380 -0
- package/dist/node_modules/rendu/package.json +47 -0
- package/dist/presets/_nitro/runtime/nitro-dev.mjs +4 -7
- package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +5 -4
- package/dist/presets/azure/runtime/azure-swa.mjs +1 -1
- package/dist/presets/cloudflare/runtime/_module-handler.mjs +7 -6
- package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +4 -5
- package/dist/presets/cloudflare/runtime/plugin.dev.mjs +7 -10
- package/dist/presets/cloudflare/runtime/shims/workers.dev.d.mts +21 -0
- package/dist/presets/cloudflare/runtime/shims/workers.dev.mjs +27 -0
- package/dist/presets/node/runtime/node-server.mjs +1 -1
- package/dist/runtime/index.d.mts +1 -1
- package/dist/runtime/index.mjs +1 -1
- package/dist/runtime/internal/app.d.mts +3 -1
- package/dist/runtime/internal/app.mjs +90 -64
- package/dist/runtime/internal/error/prod.d.mts +3 -2
- package/dist/runtime/internal/error/prod.mjs +9 -13
- package/dist/runtime/internal/renderer.mjs +4 -4
- package/dist/runtime/internal/routes/dev-tasks.d.mts +30 -2
- package/dist/runtime/internal/shutdown.d.mts +1 -2
- package/dist/runtime/internal/shutdown.mjs +3 -2
- package/dist/runtime/internal/task.mjs +1 -2
- package/dist/types/index.d.mts +1603 -10
- package/dist/vite.d.mts +5 -0
- package/dist/vite.mjs +94 -30
- package/lib/index.mjs +1 -0
- package/lib/indexd.mts +1 -0
- package/lib/runtime/meta.mjs +35 -0
- package/package.json +40 -41
- package/dist/_chunks/build.mjs +0 -84
- package/dist/_chunks/build3.mjs +0 -6452
- package/dist/_chunks/detect-acorn.mjs +0 -503
- package/dist/_chunks/index.mjs +0 -22242
- package/dist/_chunks/json5.mjs +0 -68
- package/dist/_chunks/jsonc.mjs +0 -51
- package/dist/_chunks/toml.mjs +0 -259
- package/dist/_chunks/yaml.mjs +0 -86
- package/dist/index.mjs +0 -55
- package/dist/node_modules/klona/dist/index.mjs +0 -81
- package/dist/node_modules/klona/full/index.mjs +0 -53
- package/dist/node_modules/klona/package.json +0 -74
- package/dist/node_modules/std-env/dist/index.mjs +0 -1
- package/dist/node_modules/std-env/package.json +0 -46
- package/dist/presets.mjs +0 -2460
- package/dist/runtime/internal/debug.d.mts +0 -2
- package/dist/runtime/internal/debug.mjs +0 -5
- package/lib/runtime-meta.mjs +0 -38
- /package/dist/{cli → _cli}/common.mjs +0 -0
- /package/lib/{runtime-meta.d.mts → runtime/meta.d.mts} +0 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import destr from 'destr';
|
|
5
|
+
import 'defu';
|
|
6
|
+
|
|
7
|
+
function isBuffer (obj) {
|
|
8
|
+
return obj &&
|
|
9
|
+
obj.constructor &&
|
|
10
|
+
(typeof obj.constructor.isBuffer === 'function') &&
|
|
11
|
+
obj.constructor.isBuffer(obj)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function keyIdentity (key) {
|
|
15
|
+
return key
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function flatten (target, opts) {
|
|
19
|
+
opts = opts || {};
|
|
20
|
+
|
|
21
|
+
const delimiter = opts.delimiter || '.';
|
|
22
|
+
const maxDepth = opts.maxDepth;
|
|
23
|
+
const transformKey = opts.transformKey || keyIdentity;
|
|
24
|
+
const output = {};
|
|
25
|
+
|
|
26
|
+
function step (object, prev, currentDepth) {
|
|
27
|
+
currentDepth = currentDepth || 1;
|
|
28
|
+
Object.keys(object).forEach(function (key) {
|
|
29
|
+
const value = object[key];
|
|
30
|
+
const isarray = opts.safe && Array.isArray(value);
|
|
31
|
+
const type = Object.prototype.toString.call(value);
|
|
32
|
+
const isbuffer = isBuffer(value);
|
|
33
|
+
const isobject = (
|
|
34
|
+
type === '[object Object]' ||
|
|
35
|
+
type === '[object Array]'
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
const newKey = prev
|
|
39
|
+
? prev + delimiter + transformKey(key)
|
|
40
|
+
: transformKey(key);
|
|
41
|
+
|
|
42
|
+
if (!isarray && !isbuffer && isobject && Object.keys(value).length &&
|
|
43
|
+
(!opts.maxDepth || currentDepth < maxDepth)) {
|
|
44
|
+
return step(value, newKey, currentDepth + 1)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
output[newKey] = value;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
step(target);
|
|
52
|
+
|
|
53
|
+
return output
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function unflatten (target, opts) {
|
|
57
|
+
opts = opts || {};
|
|
58
|
+
|
|
59
|
+
const delimiter = opts.delimiter || '.';
|
|
60
|
+
const overwrite = opts.overwrite || false;
|
|
61
|
+
const transformKey = opts.transformKey || keyIdentity;
|
|
62
|
+
const result = {};
|
|
63
|
+
|
|
64
|
+
const isbuffer = isBuffer(target);
|
|
65
|
+
if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') {
|
|
66
|
+
return target
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// safely ensure that the key is
|
|
70
|
+
// an integer.
|
|
71
|
+
function getkey (key) {
|
|
72
|
+
const parsedKey = Number(key);
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
isNaN(parsedKey) ||
|
|
76
|
+
key.indexOf('.') !== -1 ||
|
|
77
|
+
opts.object
|
|
78
|
+
)
|
|
79
|
+
? key
|
|
80
|
+
: parsedKey
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function addKeys (keyPrefix, recipient, target) {
|
|
84
|
+
return Object.keys(target).reduce(function (result, key) {
|
|
85
|
+
result[keyPrefix + delimiter + key] = target[key];
|
|
86
|
+
|
|
87
|
+
return result
|
|
88
|
+
}, recipient)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function isEmpty (val) {
|
|
92
|
+
const type = Object.prototype.toString.call(val);
|
|
93
|
+
const isArray = type === '[object Array]';
|
|
94
|
+
const isObject = type === '[object Object]';
|
|
95
|
+
|
|
96
|
+
if (!val) {
|
|
97
|
+
return true
|
|
98
|
+
} else if (isArray) {
|
|
99
|
+
return !val.length
|
|
100
|
+
} else if (isObject) {
|
|
101
|
+
return !Object.keys(val).length
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
target = Object.keys(target).reduce(function (result, key) {
|
|
106
|
+
const type = Object.prototype.toString.call(target[key]);
|
|
107
|
+
const isObject = (type === '[object Object]' || type === '[object Array]');
|
|
108
|
+
if (!isObject || isEmpty(target[key])) {
|
|
109
|
+
result[key] = target[key];
|
|
110
|
+
return result
|
|
111
|
+
} else {
|
|
112
|
+
return addKeys(
|
|
113
|
+
key,
|
|
114
|
+
result,
|
|
115
|
+
flatten(target[key], opts)
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
}, {});
|
|
119
|
+
|
|
120
|
+
Object.keys(target).forEach(function (key) {
|
|
121
|
+
const split = key.split(delimiter).map(transformKey);
|
|
122
|
+
let key1 = getkey(split.shift());
|
|
123
|
+
let key2 = getkey(split[0]);
|
|
124
|
+
let recipient = result;
|
|
125
|
+
|
|
126
|
+
while (key2 !== undefined) {
|
|
127
|
+
if (key1 === '__proto__') {
|
|
128
|
+
return
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const type = Object.prototype.toString.call(recipient[key1]);
|
|
132
|
+
const isobject = (
|
|
133
|
+
type === '[object Object]' ||
|
|
134
|
+
type === '[object Array]'
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// do not write over falsey, non-undefined values if overwrite is false
|
|
138
|
+
if (!overwrite && !isobject && typeof recipient[key1] !== 'undefined') {
|
|
139
|
+
return
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if ((overwrite && !isobject) || (!overwrite && recipient[key1] == null)) {
|
|
143
|
+
recipient[key1] = (
|
|
144
|
+
typeof key2 === 'number' &&
|
|
145
|
+
!opts.object
|
|
146
|
+
? []
|
|
147
|
+
: {}
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
recipient = recipient[key1];
|
|
152
|
+
if (split.length > 0) {
|
|
153
|
+
key1 = getkey(split.shift());
|
|
154
|
+
key2 = getkey(split[0]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// unflatten again for 'messy objects'
|
|
159
|
+
recipient[key1] = unflatten(target[key], opts);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
return result
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const RE_KEY_VAL = /^\s*([^\s=]+)\s*=\s*(.*)?\s*$/;
|
|
166
|
+
const RE_LINES = /\n|\r|\r\n/;
|
|
167
|
+
const defaults = {
|
|
168
|
+
name: ".conf",
|
|
169
|
+
dir: process.cwd(),
|
|
170
|
+
flat: false
|
|
171
|
+
};
|
|
172
|
+
function withDefaults(options) {
|
|
173
|
+
if (typeof options === "string") {
|
|
174
|
+
options = { name: options };
|
|
175
|
+
}
|
|
176
|
+
return { ...defaults, ...options };
|
|
177
|
+
}
|
|
178
|
+
function parse(contents, options = {}) {
|
|
179
|
+
const config = {};
|
|
180
|
+
const lines = contents.split(RE_LINES);
|
|
181
|
+
for (const line of lines) {
|
|
182
|
+
const match = line.match(RE_KEY_VAL);
|
|
183
|
+
if (!match) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const key = match[1];
|
|
187
|
+
if (!key || key === "__proto__" || key === "constructor") {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const value = destr(
|
|
191
|
+
(match[2] || "").trim()
|
|
192
|
+
/* val */
|
|
193
|
+
);
|
|
194
|
+
if (key.endsWith("[]")) {
|
|
195
|
+
const nkey = key.slice(0, Math.max(0, key.length - 2));
|
|
196
|
+
config[nkey] = (config[nkey] || []).concat(value);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
config[key] = value;
|
|
200
|
+
}
|
|
201
|
+
return options.flat ? config : unflatten(config, { overwrite: true });
|
|
202
|
+
}
|
|
203
|
+
function parseFile(path, options) {
|
|
204
|
+
if (!existsSync(path)) {
|
|
205
|
+
return {};
|
|
206
|
+
}
|
|
207
|
+
return parse(readFileSync(path, "utf8"), options);
|
|
208
|
+
}
|
|
209
|
+
function read(options) {
|
|
210
|
+
options = withDefaults(options);
|
|
211
|
+
return parseFile(resolve(options.dir, options.name), options);
|
|
212
|
+
}
|
|
213
|
+
function readUser(options) {
|
|
214
|
+
options = withDefaults(options);
|
|
215
|
+
options.dir = process.env.XDG_CONFIG_HOME || homedir();
|
|
216
|
+
return read(options);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export { readUser as a, read as r };
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { lstat, stat, readdir, realpath } from 'node:fs/promises';
|
|
2
|
+
import { Readable } from 'node:stream';
|
|
3
|
+
import { resolve, join, relative, sep } from 'node:path';
|
|
4
|
+
|
|
5
|
+
const EntryTypes = {
|
|
6
|
+
FILE_TYPE: 'files',
|
|
7
|
+
DIR_TYPE: 'directories',
|
|
8
|
+
FILE_DIR_TYPE: 'files_directories',
|
|
9
|
+
EVERYTHING_TYPE: 'all',
|
|
10
|
+
};
|
|
11
|
+
const defaultOptions = {
|
|
12
|
+
root: '.',
|
|
13
|
+
fileFilter: (_entryInfo) => true,
|
|
14
|
+
directoryFilter: (_entryInfo) => true,
|
|
15
|
+
type: EntryTypes.FILE_TYPE,
|
|
16
|
+
lstat: false,
|
|
17
|
+
depth: 2147483648,
|
|
18
|
+
alwaysStat: false,
|
|
19
|
+
highWaterMark: 4096,
|
|
20
|
+
};
|
|
21
|
+
Object.freeze(defaultOptions);
|
|
22
|
+
const RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';
|
|
23
|
+
const NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);
|
|
24
|
+
const ALL_TYPES = [
|
|
25
|
+
EntryTypes.DIR_TYPE,
|
|
26
|
+
EntryTypes.EVERYTHING_TYPE,
|
|
27
|
+
EntryTypes.FILE_DIR_TYPE,
|
|
28
|
+
EntryTypes.FILE_TYPE,
|
|
29
|
+
];
|
|
30
|
+
const DIR_TYPES = new Set([
|
|
31
|
+
EntryTypes.DIR_TYPE,
|
|
32
|
+
EntryTypes.EVERYTHING_TYPE,
|
|
33
|
+
EntryTypes.FILE_DIR_TYPE,
|
|
34
|
+
]);
|
|
35
|
+
const FILE_TYPES = new Set([
|
|
36
|
+
EntryTypes.EVERYTHING_TYPE,
|
|
37
|
+
EntryTypes.FILE_DIR_TYPE,
|
|
38
|
+
EntryTypes.FILE_TYPE,
|
|
39
|
+
]);
|
|
40
|
+
const isNormalFlowError = (error) => NORMAL_FLOW_ERRORS.has(error.code);
|
|
41
|
+
const wantBigintFsStats = process.platform === 'win32';
|
|
42
|
+
const emptyFn = (_entryInfo) => true;
|
|
43
|
+
const normalizeFilter = (filter) => {
|
|
44
|
+
if (filter === undefined)
|
|
45
|
+
return emptyFn;
|
|
46
|
+
if (typeof filter === 'function')
|
|
47
|
+
return filter;
|
|
48
|
+
if (typeof filter === 'string') {
|
|
49
|
+
const fl = filter.trim();
|
|
50
|
+
return (entry) => entry.basename === fl;
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(filter)) {
|
|
53
|
+
const trItems = filter.map((item) => item.trim());
|
|
54
|
+
return (entry) => trItems.some((f) => entry.basename === f);
|
|
55
|
+
}
|
|
56
|
+
return emptyFn;
|
|
57
|
+
};
|
|
58
|
+
/** Readable readdir stream, emitting new files as they're being listed. */
|
|
59
|
+
class ReaddirpStream extends Readable {
|
|
60
|
+
constructor(options = {}) {
|
|
61
|
+
super({
|
|
62
|
+
objectMode: true,
|
|
63
|
+
autoDestroy: true,
|
|
64
|
+
highWaterMark: options.highWaterMark,
|
|
65
|
+
});
|
|
66
|
+
const opts = { ...defaultOptions, ...options };
|
|
67
|
+
const { root, type } = opts;
|
|
68
|
+
this._fileFilter = normalizeFilter(opts.fileFilter);
|
|
69
|
+
this._directoryFilter = normalizeFilter(opts.directoryFilter);
|
|
70
|
+
const statMethod = opts.lstat ? lstat : stat;
|
|
71
|
+
// Use bigint stats if it's windows and stat() supports options (node 10+).
|
|
72
|
+
if (wantBigintFsStats) {
|
|
73
|
+
this._stat = (path) => statMethod(path, { bigint: true });
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
this._stat = statMethod;
|
|
77
|
+
}
|
|
78
|
+
this._maxDepth = opts.depth ?? defaultOptions.depth;
|
|
79
|
+
this._wantsDir = type ? DIR_TYPES.has(type) : false;
|
|
80
|
+
this._wantsFile = type ? FILE_TYPES.has(type) : false;
|
|
81
|
+
this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;
|
|
82
|
+
this._root = resolve(root);
|
|
83
|
+
this._isDirent = !opts.alwaysStat;
|
|
84
|
+
this._statsProp = this._isDirent ? 'dirent' : 'stats';
|
|
85
|
+
this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };
|
|
86
|
+
// Launch stream with one parent, the root dir.
|
|
87
|
+
this.parents = [this._exploreDir(root, 1)];
|
|
88
|
+
this.reading = false;
|
|
89
|
+
this.parent = undefined;
|
|
90
|
+
}
|
|
91
|
+
async _read(batch) {
|
|
92
|
+
if (this.reading)
|
|
93
|
+
return;
|
|
94
|
+
this.reading = true;
|
|
95
|
+
try {
|
|
96
|
+
while (!this.destroyed && batch > 0) {
|
|
97
|
+
const par = this.parent;
|
|
98
|
+
const fil = par && par.files;
|
|
99
|
+
if (fil && fil.length > 0) {
|
|
100
|
+
const { path, depth } = par;
|
|
101
|
+
const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path));
|
|
102
|
+
const awaited = await Promise.all(slice);
|
|
103
|
+
for (const entry of awaited) {
|
|
104
|
+
if (!entry)
|
|
105
|
+
continue;
|
|
106
|
+
if (this.destroyed)
|
|
107
|
+
return;
|
|
108
|
+
const entryType = await this._getEntryType(entry);
|
|
109
|
+
if (entryType === 'directory' && this._directoryFilter(entry)) {
|
|
110
|
+
if (depth <= this._maxDepth) {
|
|
111
|
+
this.parents.push(this._exploreDir(entry.fullPath, depth + 1));
|
|
112
|
+
}
|
|
113
|
+
if (this._wantsDir) {
|
|
114
|
+
this.push(entry);
|
|
115
|
+
batch--;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if ((entryType === 'file' || this._includeAsFile(entry)) &&
|
|
119
|
+
this._fileFilter(entry)) {
|
|
120
|
+
if (this._wantsFile) {
|
|
121
|
+
this.push(entry);
|
|
122
|
+
batch--;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const parent = this.parents.pop();
|
|
129
|
+
if (!parent) {
|
|
130
|
+
this.push(null);
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
this.parent = await parent;
|
|
134
|
+
if (this.destroyed)
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
this.destroy(error);
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
this.reading = false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async _exploreDir(path, depth) {
|
|
147
|
+
let files;
|
|
148
|
+
try {
|
|
149
|
+
files = await readdir(path, this._rdOptions);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
this._onError(error);
|
|
153
|
+
}
|
|
154
|
+
return { files, depth, path };
|
|
155
|
+
}
|
|
156
|
+
async _formatEntry(dirent, path) {
|
|
157
|
+
let entry;
|
|
158
|
+
const basename = this._isDirent ? dirent.name : dirent;
|
|
159
|
+
try {
|
|
160
|
+
const fullPath = resolve(join(path, basename));
|
|
161
|
+
entry = { path: relative(this._root, fullPath), fullPath, basename };
|
|
162
|
+
entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
this._onError(err);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
return entry;
|
|
169
|
+
}
|
|
170
|
+
_onError(err) {
|
|
171
|
+
if (isNormalFlowError(err) && !this.destroyed) {
|
|
172
|
+
this.emit('warn', err);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.destroy(err);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async _getEntryType(entry) {
|
|
179
|
+
// entry may be undefined, because a warning or an error were emitted
|
|
180
|
+
// and the statsProp is undefined
|
|
181
|
+
if (!entry && this._statsProp in entry) {
|
|
182
|
+
return '';
|
|
183
|
+
}
|
|
184
|
+
const stats = entry[this._statsProp];
|
|
185
|
+
if (stats.isFile())
|
|
186
|
+
return 'file';
|
|
187
|
+
if (stats.isDirectory())
|
|
188
|
+
return 'directory';
|
|
189
|
+
if (stats && stats.isSymbolicLink()) {
|
|
190
|
+
const full = entry.fullPath;
|
|
191
|
+
try {
|
|
192
|
+
const entryRealPath = await realpath(full);
|
|
193
|
+
const entryRealPathStats = await lstat(entryRealPath);
|
|
194
|
+
if (entryRealPathStats.isFile()) {
|
|
195
|
+
return 'file';
|
|
196
|
+
}
|
|
197
|
+
if (entryRealPathStats.isDirectory()) {
|
|
198
|
+
const len = entryRealPath.length;
|
|
199
|
+
if (full.startsWith(entryRealPath) && full.substr(len, 1) === sep) {
|
|
200
|
+
const recursiveError = new Error(`Circular symlink detected: "${full}" points to "${entryRealPath}"`);
|
|
201
|
+
// @ts-ignore
|
|
202
|
+
recursiveError.code = RECURSIVE_ERROR_CODE;
|
|
203
|
+
return this._onError(recursiveError);
|
|
204
|
+
}
|
|
205
|
+
return 'directory';
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
this._onError(error);
|
|
210
|
+
return '';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
_includeAsFile(entry) {
|
|
215
|
+
const stats = entry && entry[this._statsProp];
|
|
216
|
+
return stats && this._wantsEverything && !stats.isDirectory();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Streaming version: Reads all files and directories in given root recursively.
|
|
221
|
+
* Consumes ~constant small amount of RAM.
|
|
222
|
+
* @param root Root directory
|
|
223
|
+
* @param options Options to specify root (start directory), filters and recursion depth
|
|
224
|
+
*/
|
|
225
|
+
function readdirp(root, options = {}) {
|
|
226
|
+
// @ts-ignore
|
|
227
|
+
let type = options.entryType || options.type;
|
|
228
|
+
if (type === 'both')
|
|
229
|
+
type = EntryTypes.FILE_DIR_TYPE; // backwards-compatibility
|
|
230
|
+
if (type)
|
|
231
|
+
options.type = type;
|
|
232
|
+
if (!root) {
|
|
233
|
+
throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');
|
|
234
|
+
}
|
|
235
|
+
else if (typeof root !== 'string') {
|
|
236
|
+
throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');
|
|
237
|
+
}
|
|
238
|
+
else if (type && !ALL_TYPES.includes(type)) {
|
|
239
|
+
throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);
|
|
240
|
+
}
|
|
241
|
+
options.root = root;
|
|
242
|
+
return new ReaddirpStream(options);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export { readdirp as r };
|