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,282 @@
|
|
|
1
|
+
const isObject = value => {
|
|
2
|
+
const type = typeof value;
|
|
3
|
+
return value !== null && (type === 'object' || type === 'function');
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
const disallowedKeys = new Set([
|
|
7
|
+
'__proto__',
|
|
8
|
+
'prototype',
|
|
9
|
+
'constructor',
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
// Maximum allowed array index to prevent DoS via memory exhaustion.
|
|
13
|
+
const MAX_ARRAY_INDEX = 1_000_000;
|
|
14
|
+
|
|
15
|
+
// Optimized digit check without Set overhead.
|
|
16
|
+
const isDigit = character => character >= '0' && character <= '9';
|
|
17
|
+
|
|
18
|
+
// Check if a segment should be coerced to a number.
|
|
19
|
+
function shouldCoerceToNumber(segment) {
|
|
20
|
+
// Only coerce valid non-negative integers without leading zeros.
|
|
21
|
+
if (segment === '0') {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (/^[1-9]\d*$/.test(segment)) {
|
|
26
|
+
const parsedNumber = Number.parseInt(segment, 10);
|
|
27
|
+
// Check within safe integer range and under MAX_ARRAY_INDEX to prevent DoS.
|
|
28
|
+
return parsedNumber <= Number.MAX_SAFE_INTEGER && parsedNumber <= MAX_ARRAY_INDEX;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Helper to process a path segment (eliminates duplication).
|
|
35
|
+
function processSegment(segment, parts) {
|
|
36
|
+
if (disallowedKeys.has(segment)) {
|
|
37
|
+
return false; // Signal to return empty array.
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (segment && shouldCoerceToNumber(segment)) {
|
|
41
|
+
parts.push(Number.parseInt(segment, 10));
|
|
42
|
+
} else {
|
|
43
|
+
parts.push(segment);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function parsePath(path) { // eslint-disable-line complexity
|
|
50
|
+
if (typeof path !== 'string') {
|
|
51
|
+
throw new TypeError(`Expected a string, got ${typeof path}`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const parts = [];
|
|
55
|
+
let currentSegment = '';
|
|
56
|
+
let currentPart = 'start';
|
|
57
|
+
let isEscaping = false;
|
|
58
|
+
let position = 0;
|
|
59
|
+
|
|
60
|
+
for (const character of path) {
|
|
61
|
+
position++;
|
|
62
|
+
|
|
63
|
+
// Handle escaping.
|
|
64
|
+
if (isEscaping) {
|
|
65
|
+
currentSegment += character;
|
|
66
|
+
isEscaping = false;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Handle escape character.
|
|
71
|
+
if (character === '\\') {
|
|
72
|
+
if (currentPart === 'index') {
|
|
73
|
+
throw new Error(`Invalid character '${character}' in an index at position ${position}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (currentPart === 'indexEnd') {
|
|
77
|
+
throw new Error(`Invalid character '${character}' after an index at position ${position}`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
isEscaping = true;
|
|
81
|
+
currentPart = currentPart === 'start' ? 'property' : currentPart;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
switch (character) {
|
|
86
|
+
case '.': {
|
|
87
|
+
if (currentPart === 'index') {
|
|
88
|
+
throw new Error(`Invalid character '${character}' in an index at position ${position}`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (currentPart === 'indexEnd') {
|
|
92
|
+
currentPart = 'property';
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!processSegment(currentSegment, parts)) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
currentSegment = '';
|
|
101
|
+
currentPart = 'property';
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
case '[': {
|
|
106
|
+
if (currentPart === 'index') {
|
|
107
|
+
throw new Error(`Invalid character '${character}' in an index at position ${position}`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (currentPart === 'indexEnd') {
|
|
111
|
+
currentPart = 'index';
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (currentPart === 'property' || currentPart === 'start') {
|
|
116
|
+
// Only push if we have content OR if we're in 'property' mode (not 'start')
|
|
117
|
+
if ((currentSegment || currentPart === 'property') && !processSegment(currentSegment, parts)) {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
currentSegment = '';
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
currentPart = 'index';
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
case ']': {
|
|
129
|
+
if (currentPart === 'index') {
|
|
130
|
+
if (currentSegment === '') {
|
|
131
|
+
// Empty brackets - backtrack and treat as literal
|
|
132
|
+
const lastSegment = parts.pop() || '';
|
|
133
|
+
currentSegment = lastSegment + '[]';
|
|
134
|
+
currentPart = 'property';
|
|
135
|
+
} else {
|
|
136
|
+
// Index must be digits only (enforced by default case)
|
|
137
|
+
const parsedNumber = Number.parseInt(currentSegment, 10);
|
|
138
|
+
const isValidInteger = !Number.isNaN(parsedNumber)
|
|
139
|
+
&& Number.isFinite(parsedNumber)
|
|
140
|
+
&& parsedNumber >= 0
|
|
141
|
+
&& parsedNumber <= Number.MAX_SAFE_INTEGER
|
|
142
|
+
&& parsedNumber <= MAX_ARRAY_INDEX
|
|
143
|
+
&& currentSegment === String(parsedNumber);
|
|
144
|
+
|
|
145
|
+
if (isValidInteger) {
|
|
146
|
+
parts.push(parsedNumber);
|
|
147
|
+
} else {
|
|
148
|
+
// Keep as string if not a valid integer representation or exceeds MAX_ARRAY_INDEX
|
|
149
|
+
parts.push(currentSegment);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
currentSegment = '';
|
|
153
|
+
currentPart = 'indexEnd';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (currentPart === 'indexEnd') {
|
|
160
|
+
throw new Error(`Invalid character '${character}' after an index at position ${position}`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// In property context, treat ] as literal character
|
|
164
|
+
currentSegment += character;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
default: {
|
|
169
|
+
if (currentPart === 'index' && !isDigit(character)) {
|
|
170
|
+
throw new Error(`Invalid character '${character}' in an index at position ${position}`);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (currentPart === 'indexEnd') {
|
|
174
|
+
throw new Error(`Invalid character '${character}' after an index at position ${position}`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (currentPart === 'start') {
|
|
178
|
+
currentPart = 'property';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
currentSegment += character;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Handle unfinished escaping (trailing backslash)
|
|
187
|
+
if (isEscaping) {
|
|
188
|
+
currentSegment += '\\';
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Handle end of path
|
|
192
|
+
switch (currentPart) {
|
|
193
|
+
case 'property': {
|
|
194
|
+
if (!processSegment(currentSegment, parts)) {
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
case 'index': {
|
|
202
|
+
throw new Error('Index was not closed');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
case 'start': {
|
|
206
|
+
parts.push('');
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
// No default
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return parts;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function normalizePath(path) {
|
|
216
|
+
if (typeof path === 'string') {
|
|
217
|
+
return parsePath(path);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (Array.isArray(path)) {
|
|
221
|
+
const normalized = [];
|
|
222
|
+
|
|
223
|
+
for (const [index, segment] of path.entries()) {
|
|
224
|
+
// Type validation.
|
|
225
|
+
if (typeof segment !== 'string' && typeof segment !== 'number') {
|
|
226
|
+
throw new TypeError(`Expected a string or number for path segment at index ${index}, got ${typeof segment}`);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Validate numbers are finite (reject NaN, Infinity, -Infinity).
|
|
230
|
+
if (typeof segment === 'number' && !Number.isFinite(segment)) {
|
|
231
|
+
throw new TypeError(`Path segment at index ${index} must be a finite number, got ${segment}`);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Check for disallowed keys.
|
|
235
|
+
if (disallowedKeys.has(segment)) {
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Normalize numeric strings to numbers for simplicity.
|
|
240
|
+
// This treats ['items', '0'] the same as ['items', 0].
|
|
241
|
+
if (typeof segment === 'string' && shouldCoerceToNumber(segment)) {
|
|
242
|
+
normalized.push(Number.parseInt(segment, 10));
|
|
243
|
+
} else {
|
|
244
|
+
normalized.push(segment);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return normalized;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function getProperty(object, path, value) {
|
|
255
|
+
if (!isObject(object) || (typeof path !== 'string' && !Array.isArray(path))) {
|
|
256
|
+
return value === undefined ? object : value;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const pathArray = normalizePath(path);
|
|
260
|
+
if (pathArray.length === 0) {
|
|
261
|
+
return value;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
for (let index = 0; index < pathArray.length; index++) {
|
|
265
|
+
const key = pathArray[index];
|
|
266
|
+
object = object[key];
|
|
267
|
+
|
|
268
|
+
if (object === undefined || object === null) {
|
|
269
|
+
// Return default value if we hit undefined/null before the end of the path.
|
|
270
|
+
// This ensures get({foo: null}, 'foo.bar') returns the default value, not null.
|
|
271
|
+
if (index !== pathArray.length - 1) {
|
|
272
|
+
return value;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return object === undefined ? value : object;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export { getProperty as g };
|