@oliasoft-open-source/node-json-migrator 3.0.0 → 3.1.0-beta-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +451 -237
- package/dist/index.d.cts +50 -2
- package/dist/index.d.mts +50 -2
- package/dist/index.mjs +452 -239
- package/package.json +15 -15
package/dist/index.cjs
CHANGED
|
@@ -825,10 +825,6 @@ var isArguments = baseIsArguments(/* @__PURE__ */ function() {
|
|
|
825
825
|
return isObjectLike(value) && hasOwnProperty$8.call(value, "callee") && !propertyIsEnumerable$1.call(value, "callee");
|
|
826
826
|
};
|
|
827
827
|
|
|
828
|
-
function getDefaultExportFromCjs (x) {
|
|
829
|
-
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
830
|
-
}
|
|
831
|
-
|
|
832
828
|
function stubFalse() {
|
|
833
829
|
return false;
|
|
834
830
|
}
|
|
@@ -2345,221 +2341,213 @@ const LoaderModule = { loadModuleFromString };
|
|
|
2345
2341
|
|
|
2346
2342
|
const hash = (string) => crypto.createHash("sha256").update(string).digest("hex");
|
|
2347
2343
|
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
if (begs.length) {
|
|
2400
|
-
result = [left, right];
|
|
2401
|
-
}
|
|
2402
|
-
}
|
|
2403
|
-
return result;
|
|
2404
|
-
}
|
|
2405
|
-
return balancedMatch;
|
|
2406
|
-
}
|
|
2407
|
-
|
|
2408
|
-
var braceExpansion;
|
|
2409
|
-
var hasRequiredBraceExpansion;
|
|
2410
|
-
|
|
2411
|
-
function requireBraceExpansion () {
|
|
2412
|
-
if (hasRequiredBraceExpansion) return braceExpansion;
|
|
2413
|
-
hasRequiredBraceExpansion = 1;
|
|
2414
|
-
var balanced = requireBalancedMatch();
|
|
2415
|
-
braceExpansion = expandTop;
|
|
2416
|
-
var escSlash = "\0SLASH" + Math.random() + "\0";
|
|
2417
|
-
var escOpen = "\0OPEN" + Math.random() + "\0";
|
|
2418
|
-
var escClose = "\0CLOSE" + Math.random() + "\0";
|
|
2419
|
-
var escComma = "\0COMMA" + Math.random() + "\0";
|
|
2420
|
-
var escPeriod = "\0PERIOD" + Math.random() + "\0";
|
|
2421
|
-
function numeric(str) {
|
|
2422
|
-
return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0);
|
|
2423
|
-
}
|
|
2424
|
-
function escapeBraces(str) {
|
|
2425
|
-
return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod);
|
|
2426
|
-
}
|
|
2427
|
-
function unescapeBraces(str) {
|
|
2428
|
-
return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join(".");
|
|
2429
|
-
}
|
|
2430
|
-
function parseCommaParts(str) {
|
|
2431
|
-
if (!str)
|
|
2432
|
-
return [""];
|
|
2433
|
-
var parts = [];
|
|
2434
|
-
var m = balanced("{", "}", str);
|
|
2435
|
-
if (!m)
|
|
2436
|
-
return str.split(",");
|
|
2437
|
-
var pre = m.pre;
|
|
2438
|
-
var body = m.body;
|
|
2439
|
-
var post = m.post;
|
|
2440
|
-
var p = pre.split(",");
|
|
2441
|
-
p[p.length - 1] += "{" + body + "}";
|
|
2442
|
-
var postParts = parseCommaParts(post);
|
|
2443
|
-
if (post.length) {
|
|
2444
|
-
p[p.length - 1] += postParts.shift();
|
|
2445
|
-
p.push.apply(p, postParts);
|
|
2446
|
-
}
|
|
2447
|
-
parts.push.apply(parts, p);
|
|
2448
|
-
return parts;
|
|
2449
|
-
}
|
|
2450
|
-
function expandTop(str) {
|
|
2451
|
-
if (!str)
|
|
2452
|
-
return [];
|
|
2453
|
-
if (str.substr(0, 2) === "{}") {
|
|
2454
|
-
str = "\\{\\}" + str.substr(2);
|
|
2455
|
-
}
|
|
2456
|
-
return expand(escapeBraces(str), true).map(unescapeBraces);
|
|
2457
|
-
}
|
|
2458
|
-
function embrace(str) {
|
|
2459
|
-
return "{" + str + "}";
|
|
2460
|
-
}
|
|
2461
|
-
function isPadded(el) {
|
|
2462
|
-
return /^-?0\d/.test(el);
|
|
2463
|
-
}
|
|
2464
|
-
function lte(i, y) {
|
|
2465
|
-
return i <= y;
|
|
2466
|
-
}
|
|
2467
|
-
function gte(i, y) {
|
|
2468
|
-
return i >= y;
|
|
2469
|
-
}
|
|
2470
|
-
function expand(str, isTop) {
|
|
2471
|
-
var expansions = [];
|
|
2472
|
-
var m = balanced("{", "}", str);
|
|
2473
|
-
if (!m) return [str];
|
|
2474
|
-
var pre = m.pre;
|
|
2475
|
-
var post = m.post.length ? expand(m.post, false) : [""];
|
|
2476
|
-
if (/\$$/.test(m.pre)) {
|
|
2477
|
-
for (var k = 0; k < post.length; k++) {
|
|
2478
|
-
var expansion = pre + "{" + m.body + "}" + post[k];
|
|
2479
|
-
expansions.push(expansion);
|
|
2480
|
-
}
|
|
2481
|
-
} else {
|
|
2482
|
-
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
|
2483
|
-
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
|
2484
|
-
var isSequence = isNumericSequence || isAlphaSequence;
|
|
2485
|
-
var isOptions = m.body.indexOf(",") >= 0;
|
|
2486
|
-
if (!isSequence && !isOptions) {
|
|
2487
|
-
if (m.post.match(/,.*\}/)) {
|
|
2488
|
-
str = m.pre + "{" + m.body + escClose + m.post;
|
|
2489
|
-
return expand(str);
|
|
2490
|
-
}
|
|
2491
|
-
return [str];
|
|
2492
|
-
}
|
|
2493
|
-
var n;
|
|
2494
|
-
if (isSequence) {
|
|
2495
|
-
n = m.body.split(/\.\./);
|
|
2496
|
-
} else {
|
|
2497
|
-
n = parseCommaParts(m.body);
|
|
2498
|
-
if (n.length === 1) {
|
|
2499
|
-
n = expand(n[0], false).map(embrace);
|
|
2500
|
-
if (n.length === 1) {
|
|
2501
|
-
return post.map(function(p) {
|
|
2502
|
-
return m.pre + n[0] + p;
|
|
2503
|
-
});
|
|
2504
|
-
}
|
|
2505
|
-
}
|
|
2506
|
-
}
|
|
2507
|
-
var N;
|
|
2508
|
-
if (isSequence) {
|
|
2509
|
-
var x = numeric(n[0]);
|
|
2510
|
-
var y = numeric(n[1]);
|
|
2511
|
-
var width = Math.max(n[0].length, n[1].length);
|
|
2512
|
-
var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1;
|
|
2513
|
-
var test = lte;
|
|
2514
|
-
var reverse = y < x;
|
|
2515
|
-
if (reverse) {
|
|
2516
|
-
incr *= -1;
|
|
2517
|
-
test = gte;
|
|
2518
|
-
}
|
|
2519
|
-
var pad = n.some(isPadded);
|
|
2520
|
-
N = [];
|
|
2521
|
-
for (var i = x; test(i, y); i += incr) {
|
|
2522
|
-
var c;
|
|
2523
|
-
if (isAlphaSequence) {
|
|
2524
|
-
c = String.fromCharCode(i);
|
|
2525
|
-
if (c === "\\")
|
|
2526
|
-
c = "";
|
|
2527
|
-
} else {
|
|
2528
|
-
c = String(i);
|
|
2529
|
-
if (pad) {
|
|
2530
|
-
var need = width - c.length;
|
|
2531
|
-
if (need > 0) {
|
|
2532
|
-
var z = new Array(need + 1).join("0");
|
|
2533
|
-
if (i < 0)
|
|
2534
|
-
c = "-" + z + c.slice(1);
|
|
2535
|
-
else
|
|
2536
|
-
c = z + c;
|
|
2537
|
-
}
|
|
2538
|
-
}
|
|
2539
|
-
}
|
|
2540
|
-
N.push(c);
|
|
2541
|
-
}
|
|
2542
|
-
} else {
|
|
2543
|
-
N = [];
|
|
2544
|
-
for (var j = 0; j < n.length; j++) {
|
|
2545
|
-
N.push.apply(N, expand(n[j], false));
|
|
2546
|
-
}
|
|
2547
|
-
}
|
|
2548
|
-
for (var j = 0; j < N.length; j++) {
|
|
2549
|
-
for (var k = 0; k < post.length; k++) {
|
|
2550
|
-
var expansion = pre + N[j] + post[k];
|
|
2551
|
-
if (!isTop || isSequence || expansion)
|
|
2552
|
-
expansions.push(expansion);
|
|
2553
|
-
}
|
|
2554
|
-
}
|
|
2555
|
-
}
|
|
2556
|
-
return expansions;
|
|
2557
|
-
}
|
|
2558
|
-
return braceExpansion;
|
|
2559
|
-
}
|
|
2344
|
+
const balanced = (a, b, str) => {
|
|
2345
|
+
const ma = a instanceof RegExp ? maybeMatch(a, str) : a;
|
|
2346
|
+
const mb = b instanceof RegExp ? maybeMatch(b, str) : b;
|
|
2347
|
+
const r = ma !== null && mb != null && range(ma, mb, str);
|
|
2348
|
+
return r && {
|
|
2349
|
+
start: r[0],
|
|
2350
|
+
end: r[1],
|
|
2351
|
+
pre: str.slice(0, r[0]),
|
|
2352
|
+
body: str.slice(r[0] + ma.length, r[1]),
|
|
2353
|
+
post: str.slice(r[1] + mb.length)
|
|
2354
|
+
};
|
|
2355
|
+
};
|
|
2356
|
+
const maybeMatch = (reg, str) => {
|
|
2357
|
+
const m = str.match(reg);
|
|
2358
|
+
return m ? m[0] : null;
|
|
2359
|
+
};
|
|
2360
|
+
const range = (a, b, str) => {
|
|
2361
|
+
let begs, beg, left, right = void 0, result;
|
|
2362
|
+
let ai = str.indexOf(a);
|
|
2363
|
+
let bi = str.indexOf(b, ai + 1);
|
|
2364
|
+
let i = ai;
|
|
2365
|
+
if (ai >= 0 && bi > 0) {
|
|
2366
|
+
if (a === b) {
|
|
2367
|
+
return [ai, bi];
|
|
2368
|
+
}
|
|
2369
|
+
begs = [];
|
|
2370
|
+
left = str.length;
|
|
2371
|
+
while (i >= 0 && !result) {
|
|
2372
|
+
if (i === ai) {
|
|
2373
|
+
begs.push(i);
|
|
2374
|
+
ai = str.indexOf(a, i + 1);
|
|
2375
|
+
} else if (begs.length === 1) {
|
|
2376
|
+
const r = begs.pop();
|
|
2377
|
+
if (r !== void 0)
|
|
2378
|
+
result = [r, bi];
|
|
2379
|
+
} else {
|
|
2380
|
+
beg = begs.pop();
|
|
2381
|
+
if (beg !== void 0 && beg < left) {
|
|
2382
|
+
left = beg;
|
|
2383
|
+
right = bi;
|
|
2384
|
+
}
|
|
2385
|
+
bi = str.indexOf(b, i + 1);
|
|
2386
|
+
}
|
|
2387
|
+
i = ai < bi && ai >= 0 ? ai : bi;
|
|
2388
|
+
}
|
|
2389
|
+
if (begs.length && right !== void 0) {
|
|
2390
|
+
result = [left, right];
|
|
2391
|
+
}
|
|
2392
|
+
}
|
|
2393
|
+
return result;
|
|
2394
|
+
};
|
|
2560
2395
|
|
|
2561
|
-
|
|
2562
|
-
|
|
2396
|
+
const escSlash = "\0SLASH" + Math.random() + "\0";
|
|
2397
|
+
const escOpen = "\0OPEN" + Math.random() + "\0";
|
|
2398
|
+
const escClose = "\0CLOSE" + Math.random() + "\0";
|
|
2399
|
+
const escComma = "\0COMMA" + Math.random() + "\0";
|
|
2400
|
+
const escPeriod = "\0PERIOD" + Math.random() + "\0";
|
|
2401
|
+
const escSlashPattern = new RegExp(escSlash, "g");
|
|
2402
|
+
const escOpenPattern = new RegExp(escOpen, "g");
|
|
2403
|
+
const escClosePattern = new RegExp(escClose, "g");
|
|
2404
|
+
const escCommaPattern = new RegExp(escComma, "g");
|
|
2405
|
+
const escPeriodPattern = new RegExp(escPeriod, "g");
|
|
2406
|
+
const slashPattern = /\\\\/g;
|
|
2407
|
+
const openPattern = /\\{/g;
|
|
2408
|
+
const closePattern = /\\}/g;
|
|
2409
|
+
const commaPattern = /\\,/g;
|
|
2410
|
+
const periodPattern = /\\./g;
|
|
2411
|
+
function numeric(str) {
|
|
2412
|
+
return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);
|
|
2413
|
+
}
|
|
2414
|
+
function escapeBraces(str) {
|
|
2415
|
+
return str.replace(slashPattern, escSlash).replace(openPattern, escOpen).replace(closePattern, escClose).replace(commaPattern, escComma).replace(periodPattern, escPeriod);
|
|
2416
|
+
}
|
|
2417
|
+
function unescapeBraces(str) {
|
|
2418
|
+
return str.replace(escSlashPattern, "\\").replace(escOpenPattern, "{").replace(escClosePattern, "}").replace(escCommaPattern, ",").replace(escPeriodPattern, ".");
|
|
2419
|
+
}
|
|
2420
|
+
function parseCommaParts(str) {
|
|
2421
|
+
if (!str) {
|
|
2422
|
+
return [""];
|
|
2423
|
+
}
|
|
2424
|
+
const parts = [];
|
|
2425
|
+
const m = balanced("{", "}", str);
|
|
2426
|
+
if (!m) {
|
|
2427
|
+
return str.split(",");
|
|
2428
|
+
}
|
|
2429
|
+
const { pre, body, post } = m;
|
|
2430
|
+
const p = pre.split(",");
|
|
2431
|
+
p[p.length - 1] += "{" + body + "}";
|
|
2432
|
+
const postParts = parseCommaParts(post);
|
|
2433
|
+
if (post.length) {
|
|
2434
|
+
p[p.length - 1] += postParts.shift();
|
|
2435
|
+
p.push.apply(p, postParts);
|
|
2436
|
+
}
|
|
2437
|
+
parts.push.apply(parts, p);
|
|
2438
|
+
return parts;
|
|
2439
|
+
}
|
|
2440
|
+
function expand(str) {
|
|
2441
|
+
if (!str) {
|
|
2442
|
+
return [];
|
|
2443
|
+
}
|
|
2444
|
+
if (str.slice(0, 2) === "{}") {
|
|
2445
|
+
str = "\\{\\}" + str.slice(2);
|
|
2446
|
+
}
|
|
2447
|
+
return expand_(escapeBraces(str), true).map(unescapeBraces);
|
|
2448
|
+
}
|
|
2449
|
+
function embrace(str) {
|
|
2450
|
+
return "{" + str + "}";
|
|
2451
|
+
}
|
|
2452
|
+
function isPadded(el) {
|
|
2453
|
+
return /^-?0\d/.test(el);
|
|
2454
|
+
}
|
|
2455
|
+
function lte(i, y) {
|
|
2456
|
+
return i <= y;
|
|
2457
|
+
}
|
|
2458
|
+
function gte(i, y) {
|
|
2459
|
+
return i >= y;
|
|
2460
|
+
}
|
|
2461
|
+
function expand_(str, isTop) {
|
|
2462
|
+
const expansions = [];
|
|
2463
|
+
const m = balanced("{", "}", str);
|
|
2464
|
+
if (!m)
|
|
2465
|
+
return [str];
|
|
2466
|
+
const pre = m.pre;
|
|
2467
|
+
const post = m.post.length ? expand_(m.post, false) : [""];
|
|
2468
|
+
if (/\$$/.test(m.pre)) {
|
|
2469
|
+
for (let k = 0; k < post.length; k++) {
|
|
2470
|
+
const expansion = pre + "{" + m.body + "}" + post[k];
|
|
2471
|
+
expansions.push(expansion);
|
|
2472
|
+
}
|
|
2473
|
+
} else {
|
|
2474
|
+
const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
|
2475
|
+
const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
|
2476
|
+
const isSequence = isNumericSequence || isAlphaSequence;
|
|
2477
|
+
const isOptions = m.body.indexOf(",") >= 0;
|
|
2478
|
+
if (!isSequence && !isOptions) {
|
|
2479
|
+
if (m.post.match(/,(?!,).*\}/)) {
|
|
2480
|
+
str = m.pre + "{" + m.body + escClose + m.post;
|
|
2481
|
+
return expand_(str);
|
|
2482
|
+
}
|
|
2483
|
+
return [str];
|
|
2484
|
+
}
|
|
2485
|
+
let n;
|
|
2486
|
+
if (isSequence) {
|
|
2487
|
+
n = m.body.split(/\.\./);
|
|
2488
|
+
} else {
|
|
2489
|
+
n = parseCommaParts(m.body);
|
|
2490
|
+
if (n.length === 1 && n[0] !== void 0) {
|
|
2491
|
+
n = expand_(n[0], false).map(embrace);
|
|
2492
|
+
if (n.length === 1) {
|
|
2493
|
+
return post.map((p) => m.pre + n[0] + p);
|
|
2494
|
+
}
|
|
2495
|
+
}
|
|
2496
|
+
}
|
|
2497
|
+
let N;
|
|
2498
|
+
if (isSequence && n[0] !== void 0 && n[1] !== void 0) {
|
|
2499
|
+
const x = numeric(n[0]);
|
|
2500
|
+
const y = numeric(n[1]);
|
|
2501
|
+
const width = Math.max(n[0].length, n[1].length);
|
|
2502
|
+
let incr = n.length === 3 && n[2] !== void 0 ? Math.abs(numeric(n[2])) : 1;
|
|
2503
|
+
let test = lte;
|
|
2504
|
+
const reverse = y < x;
|
|
2505
|
+
if (reverse) {
|
|
2506
|
+
incr *= -1;
|
|
2507
|
+
test = gte;
|
|
2508
|
+
}
|
|
2509
|
+
const pad = n.some(isPadded);
|
|
2510
|
+
N = [];
|
|
2511
|
+
for (let i = x; test(i, y); i += incr) {
|
|
2512
|
+
let c;
|
|
2513
|
+
if (isAlphaSequence) {
|
|
2514
|
+
c = String.fromCharCode(i);
|
|
2515
|
+
if (c === "\\") {
|
|
2516
|
+
c = "";
|
|
2517
|
+
}
|
|
2518
|
+
} else {
|
|
2519
|
+
c = String(i);
|
|
2520
|
+
if (pad) {
|
|
2521
|
+
const need = width - c.length;
|
|
2522
|
+
if (need > 0) {
|
|
2523
|
+
const z = new Array(need + 1).join("0");
|
|
2524
|
+
if (i < 0) {
|
|
2525
|
+
c = "-" + z + c.slice(1);
|
|
2526
|
+
} else {
|
|
2527
|
+
c = z + c;
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
}
|
|
2531
|
+
}
|
|
2532
|
+
N.push(c);
|
|
2533
|
+
}
|
|
2534
|
+
} else {
|
|
2535
|
+
N = [];
|
|
2536
|
+
for (let j = 0; j < n.length; j++) {
|
|
2537
|
+
N.push.apply(N, expand_(n[j], false));
|
|
2538
|
+
}
|
|
2539
|
+
}
|
|
2540
|
+
for (let j = 0; j < N.length; j++) {
|
|
2541
|
+
for (let k = 0; k < post.length; k++) {
|
|
2542
|
+
const expansion = pre + N[j] + post[k];
|
|
2543
|
+
if (!isTop || isSequence || expansion) {
|
|
2544
|
+
expansions.push(expansion);
|
|
2545
|
+
}
|
|
2546
|
+
}
|
|
2547
|
+
}
|
|
2548
|
+
}
|
|
2549
|
+
return expansions;
|
|
2550
|
+
}
|
|
2563
2551
|
|
|
2564
2552
|
const MAX_PATTERN_LENGTH = 1024 * 64;
|
|
2565
2553
|
const assertValidPattern = (pattern) => {
|
|
@@ -3079,7 +3067,7 @@ class AST {
|
|
|
3079
3067
|
this.#hasMagic = void 0;
|
|
3080
3068
|
return [s, unescape(this.toString()), false, false];
|
|
3081
3069
|
}
|
|
3082
|
-
let bodyDotAllowed = !repeated || allowDot || dot ||
|
|
3070
|
+
let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? "" : this.#partsToRegExp(true);
|
|
3083
3071
|
if (bodyDotAllowed === body) {
|
|
3084
3072
|
bodyDotAllowed = "";
|
|
3085
3073
|
}
|
|
@@ -6157,7 +6145,7 @@ const IFREG = 8;
|
|
|
6157
6145
|
const IFLNK = 10;
|
|
6158
6146
|
const IFSOCK = 12;
|
|
6159
6147
|
const IFMT = 15;
|
|
6160
|
-
const IFMT_UNKNOWN =
|
|
6148
|
+
const IFMT_UNKNOWN = ~IFMT;
|
|
6161
6149
|
const READDIR_CALLED = 16;
|
|
6162
6150
|
const LSTAT_CALLED = 32;
|
|
6163
6151
|
const ENOTDIR = 64;
|
|
@@ -6419,7 +6407,7 @@ class PathBase {
|
|
|
6419
6407
|
}
|
|
6420
6408
|
const children = Object.assign([], { provisional: 0 });
|
|
6421
6409
|
this.#children.set(this, children);
|
|
6422
|
-
this.#type &=
|
|
6410
|
+
this.#type &= ~READDIR_CALLED;
|
|
6423
6411
|
return children;
|
|
6424
6412
|
}
|
|
6425
6413
|
/**
|
|
@@ -8941,14 +8929,15 @@ const migrationTablesExist = (db, entity) => {
|
|
|
8941
8929
|
SELECT EXISTS (
|
|
8942
8930
|
SELECT FROM information_schema.tables
|
|
8943
8931
|
WHERE table_schema = 'public'
|
|
8944
|
-
AND table_name =
|
|
8932
|
+
AND table_name = $(tableName)
|
|
8945
8933
|
)
|
|
8946
8934
|
`;
|
|
8947
|
-
|
|
8935
|
+
const params = { tableName: `${entity}_migrations` };
|
|
8936
|
+
return db.one(query, params);
|
|
8948
8937
|
};
|
|
8949
8938
|
const createMigrationsTables = (db, entity) => {
|
|
8950
8939
|
const query = `
|
|
8951
|
-
CREATE TABLE IF NOT EXISTS $
|
|
8940
|
+
CREATE TABLE IF NOT EXISTS $(migrationsTable:name) (
|
|
8952
8941
|
file_hash TEXT NOT NULL PRIMARY KEY,
|
|
8953
8942
|
file_name TEXT NOT NULL,
|
|
8954
8943
|
sequence TEXT NOT NULL,
|
|
@@ -8956,20 +8945,26 @@ const createMigrationsTables = (db, entity) => {
|
|
|
8956
8945
|
UNIQUE (file_name),
|
|
8957
8946
|
UNIQUE (sequence)
|
|
8958
8947
|
);
|
|
8959
|
-
CREATE TABLE IF NOT EXISTS $
|
|
8948
|
+
CREATE TABLE IF NOT EXISTS $(versionsTable:name) (
|
|
8960
8949
|
version TEXT NOT NULL PRIMARY KEY,
|
|
8961
8950
|
plan TEXT NOT NULL,
|
|
8962
8951
|
created_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
8963
8952
|
);
|
|
8964
8953
|
`;
|
|
8965
|
-
|
|
8954
|
+
const params = {
|
|
8955
|
+
migrationsTable: `${entity}_migrations`,
|
|
8956
|
+
versionsTable: `${entity}_versions`
|
|
8957
|
+
};
|
|
8958
|
+
return db.none(query, params);
|
|
8966
8959
|
};
|
|
8967
8960
|
const getMigrationRecords = (db, entity) => {
|
|
8968
8961
|
const query = `
|
|
8969
|
-
SELECT file_hash, file_name, sequence
|
|
8962
|
+
SELECT file_hash, file_name, sequence
|
|
8963
|
+
FROM $(migrationsTable:name)
|
|
8970
8964
|
ORDER BY sequence
|
|
8971
8965
|
`;
|
|
8972
|
-
|
|
8966
|
+
const params = { migrationsTable: `${entity}_migrations` };
|
|
8967
|
+
return db.manyOrNone(query, params).then(
|
|
8973
8968
|
(data) => data.map((r) => ({
|
|
8974
8969
|
fileHash: r.file_hash,
|
|
8975
8970
|
fileName: r.file_name,
|
|
@@ -8987,7 +8982,7 @@ const insertMigrationsRecords = (db, pgpHelpers, entity, migrations) => {
|
|
|
8987
8982
|
const cs = new pgpHelpers.ColumnSet(
|
|
8988
8983
|
["file_name", "file_hash", "sequence"],
|
|
8989
8984
|
{
|
|
8990
|
-
table: `${entity}_migrations`
|
|
8985
|
+
table: new pgpHelpers.TableName({ table: `${entity}_migrations` })
|
|
8991
8986
|
}
|
|
8992
8987
|
);
|
|
8993
8988
|
const onConflict = " ON CONFLICT(file_name) DO NOTHING";
|
|
@@ -8996,13 +8991,14 @@ const insertMigrationsRecords = (db, pgpHelpers, entity, migrations) => {
|
|
|
8996
8991
|
}
|
|
8997
8992
|
};
|
|
8998
8993
|
const replaceMigrationsRecords = async (db, pgpHelpers, entity, migrations) => {
|
|
8999
|
-
const
|
|
9000
|
-
|
|
8994
|
+
const query = `DELETE FROM $(migrationsTableName:name)`;
|
|
8995
|
+
const params = { migrationsTableName: `${entity}_migrations` };
|
|
8996
|
+
await db.none(query, params);
|
|
9001
8997
|
await insertMigrationsRecords(db, pgpHelpers, entity, migrations);
|
|
9002
8998
|
};
|
|
9003
8999
|
const insertVersions = (db, pgpHelpers, entity, records) => {
|
|
9004
9000
|
const cs = new pgpHelpers.ColumnSet(["version", "plan"], {
|
|
9005
|
-
table: `${entity}_versions`
|
|
9001
|
+
table: new pgpHelpers.TableName({ table: `${entity}_versions` })
|
|
9006
9002
|
});
|
|
9007
9003
|
const onConflict = " ON CONFLICT(version) DO NOTHING";
|
|
9008
9004
|
const query = pgpHelpers.insert(records, cs) + onConflict;
|
|
@@ -9010,19 +9006,97 @@ const insertVersions = (db, pgpHelpers, entity, records) => {
|
|
|
9010
9006
|
};
|
|
9011
9007
|
const getPlanFromVersion = (db, entity, version) => {
|
|
9012
9008
|
const query = `
|
|
9013
|
-
SELECT plan FROM $
|
|
9014
|
-
WHERE version=$
|
|
9009
|
+
SELECT plan FROM $(versionsTable:name)
|
|
9010
|
+
WHERE version=$(version);
|
|
9015
9011
|
`;
|
|
9016
|
-
|
|
9012
|
+
const params = {
|
|
9013
|
+
version,
|
|
9014
|
+
versionsTable: `${entity}_versions`
|
|
9015
|
+
};
|
|
9016
|
+
return db.oneOrNone(query, params, (r) => r?.plan || null);
|
|
9017
9017
|
};
|
|
9018
9018
|
const getVersions = async (db, entity) => {
|
|
9019
9019
|
const query = `
|
|
9020
9020
|
SELECT
|
|
9021
9021
|
version,
|
|
9022
9022
|
plan
|
|
9023
|
-
FROM $
|
|
9023
|
+
FROM $(versionsTable:name) ORDER BY created_on DESC
|
|
9024
9024
|
`;
|
|
9025
|
-
|
|
9025
|
+
const params = {
|
|
9026
|
+
versionsTable: `${entity}_versions`
|
|
9027
|
+
};
|
|
9028
|
+
return db.any(query, params);
|
|
9029
|
+
};
|
|
9030
|
+
const getRecordList = async (db, entity, entityColumnNames, latestVersion, latestVersionPlanLength) => {
|
|
9031
|
+
const query = `
|
|
9032
|
+
SELECT
|
|
9033
|
+
$(entityIdColumn:name) AS id,
|
|
9034
|
+
name,
|
|
9035
|
+
$(entityCreatedColumn:name) AS created,
|
|
9036
|
+
version
|
|
9037
|
+
FROM $(entityTable:name)
|
|
9038
|
+
WHERE (
|
|
9039
|
+
version IS NULL
|
|
9040
|
+
OR (
|
|
9041
|
+
version <> $(latestVersion)
|
|
9042
|
+
AND (
|
|
9043
|
+
SELECT
|
|
9044
|
+
CASE
|
|
9045
|
+
WHEN IS_JSON(plan) THEN JSON_ARRAY_LENGTH(plan::json)
|
|
9046
|
+
ELSE 0
|
|
9047
|
+
END AS length
|
|
9048
|
+
FROM $(entityVersionsTable:name)
|
|
9049
|
+
WHERE $(entityVersionsTable:name).version = version
|
|
9050
|
+
LIMIT 1
|
|
9051
|
+
)::integer <= $(latestVersionPlanLength)
|
|
9052
|
+
)
|
|
9053
|
+
)
|
|
9054
|
+
`;
|
|
9055
|
+
const params = {
|
|
9056
|
+
entityTable: entity,
|
|
9057
|
+
entityVersionsTable: `${entity}_versions`,
|
|
9058
|
+
entityIdColumn: entityColumnNames.id,
|
|
9059
|
+
entityCreatedColumn: entityColumnNames.created,
|
|
9060
|
+
latestVersion,
|
|
9061
|
+
latestVersionPlanLength
|
|
9062
|
+
};
|
|
9063
|
+
return db.any(query, params);
|
|
9064
|
+
};
|
|
9065
|
+
const getRecord = async (t, entity, entityColumnNames, entityId) => {
|
|
9066
|
+
const query = `
|
|
9067
|
+
SELECT *
|
|
9068
|
+
FROM $(entityTable:name)
|
|
9069
|
+
WHERE $(entityIdColumn:name) = $(entityId)
|
|
9070
|
+
`;
|
|
9071
|
+
const params = {
|
|
9072
|
+
entityTable: entity,
|
|
9073
|
+
entityId,
|
|
9074
|
+
entityIdColumn: entityColumnNames.id
|
|
9075
|
+
};
|
|
9076
|
+
return t.one(query, params);
|
|
9077
|
+
};
|
|
9078
|
+
const updateRecord = async (t, entity, entityColumnNames, entityId, currentVersion, nextData, nextVersion, etag) => {
|
|
9079
|
+
const useEtag = typeof etag === "number";
|
|
9080
|
+
const query = `
|
|
9081
|
+
UPDATE $(entityTable:name)
|
|
9082
|
+
SET data = $(nextData),
|
|
9083
|
+
version = $(nextVersion)
|
|
9084
|
+
${useEtag ? ", etag = etag + 1" : ""}
|
|
9085
|
+
WHERE $(entityIdColumn:name) = $(entityId)
|
|
9086
|
+
AND version = $(currentVersion)
|
|
9087
|
+
${useEtag ? "AND etag = $(etag)" : ""}
|
|
9088
|
+
RETURNING *
|
|
9089
|
+
`;
|
|
9090
|
+
const params = {
|
|
9091
|
+
entityTable: entity,
|
|
9092
|
+
entityId,
|
|
9093
|
+
entityIdColumn: entityColumnNames.id,
|
|
9094
|
+
currentVersion,
|
|
9095
|
+
nextData,
|
|
9096
|
+
nextVersion,
|
|
9097
|
+
etag
|
|
9098
|
+
};
|
|
9099
|
+
return t.oneOrNone(query, params);
|
|
9026
9100
|
};
|
|
9027
9101
|
|
|
9028
9102
|
let cachedPlannedVersion = null;
|
|
@@ -9586,6 +9660,145 @@ const migrate = async ({
|
|
|
9586
9660
|
};
|
|
9587
9661
|
};
|
|
9588
9662
|
|
|
9663
|
+
const migrateRecord = async ({
|
|
9664
|
+
record,
|
|
9665
|
+
config,
|
|
9666
|
+
beforeMigrateRecord,
|
|
9667
|
+
afterMigrateRecord
|
|
9668
|
+
}) => {
|
|
9669
|
+
const { dry } = config;
|
|
9670
|
+
console.log(chalk.gray(` ${record.name}`));
|
|
9671
|
+
try {
|
|
9672
|
+
await config.database.tx(async (transaction) => {
|
|
9673
|
+
const currentRecord = await getRecord(
|
|
9674
|
+
transaction,
|
|
9675
|
+
config.entity,
|
|
9676
|
+
config.entityColumnNames,
|
|
9677
|
+
record.id
|
|
9678
|
+
);
|
|
9679
|
+
const { data, etag, version: currentVersion } = currentRecord;
|
|
9680
|
+
await beforeMigrateRecord({
|
|
9681
|
+
currentRecord,
|
|
9682
|
+
dry
|
|
9683
|
+
});
|
|
9684
|
+
const { nextPayload: nextData, nextVersion } = await migrate({
|
|
9685
|
+
payload: data,
|
|
9686
|
+
config: {
|
|
9687
|
+
...config,
|
|
9688
|
+
version: currentVersion,
|
|
9689
|
+
printPendingFileNames: true
|
|
9690
|
+
}
|
|
9691
|
+
});
|
|
9692
|
+
if (!dry) {
|
|
9693
|
+
const nextRecord = await updateRecord(
|
|
9694
|
+
transaction,
|
|
9695
|
+
config?.entity,
|
|
9696
|
+
config.entityColumnNames,
|
|
9697
|
+
record.id,
|
|
9698
|
+
currentVersion,
|
|
9699
|
+
nextData,
|
|
9700
|
+
nextVersion,
|
|
9701
|
+
etag
|
|
9702
|
+
);
|
|
9703
|
+
if (!nextRecord) {
|
|
9704
|
+
throw new Error(
|
|
9705
|
+
"Failed to patch record with newest migration - The record was probably updated while migrating..."
|
|
9706
|
+
);
|
|
9707
|
+
}
|
|
9708
|
+
await afterMigrateRecord({
|
|
9709
|
+
currentRecord,
|
|
9710
|
+
nextRecord,
|
|
9711
|
+
transaction,
|
|
9712
|
+
dry
|
|
9713
|
+
});
|
|
9714
|
+
}
|
|
9715
|
+
});
|
|
9716
|
+
return null;
|
|
9717
|
+
} catch (error) {
|
|
9718
|
+
const migrationErrorPayload = {
|
|
9719
|
+
id: record.id,
|
|
9720
|
+
name: record.name,
|
|
9721
|
+
created: record.created,
|
|
9722
|
+
error,
|
|
9723
|
+
stackTrace: error.stack
|
|
9724
|
+
};
|
|
9725
|
+
console.log(
|
|
9726
|
+
chalk.red(
|
|
9727
|
+
` Dataset migration with id ${record.id} failed:
|
|
9728
|
+
${error.stack}`
|
|
9729
|
+
)
|
|
9730
|
+
);
|
|
9731
|
+
return migrationErrorPayload;
|
|
9732
|
+
}
|
|
9733
|
+
};
|
|
9734
|
+
const migrateRecords = async ({
|
|
9735
|
+
recordList,
|
|
9736
|
+
config,
|
|
9737
|
+
beforeMigrateRecord,
|
|
9738
|
+
afterMigrateRecord,
|
|
9739
|
+
onMigrationErrors
|
|
9740
|
+
}) => {
|
|
9741
|
+
const { dry } = config;
|
|
9742
|
+
const migrationErrors = [];
|
|
9743
|
+
if (recordList.length) {
|
|
9744
|
+
console.log(chalk.gray("Executing record migration scripts..."));
|
|
9745
|
+
for await (const record of recordList) {
|
|
9746
|
+
const migrationErrorPayload = await migrateRecord({
|
|
9747
|
+
record,
|
|
9748
|
+
config,
|
|
9749
|
+
beforeMigrateRecord,
|
|
9750
|
+
afterMigrateRecord
|
|
9751
|
+
});
|
|
9752
|
+
if (migrationErrorPayload) {
|
|
9753
|
+
migrationErrors.push(migrationErrorPayload);
|
|
9754
|
+
}
|
|
9755
|
+
}
|
|
9756
|
+
}
|
|
9757
|
+
if (migrationErrors.length) {
|
|
9758
|
+
console.log(
|
|
9759
|
+
chalk.yellow(
|
|
9760
|
+
`Completed ${config?.entity ?? "entity"} migrations (some failed)${config?.dry ? " [dry-run, no output written]" : ""} \u2713`
|
|
9761
|
+
)
|
|
9762
|
+
);
|
|
9763
|
+
await onMigrationErrors({
|
|
9764
|
+
migrationErrors,
|
|
9765
|
+
dry
|
|
9766
|
+
});
|
|
9767
|
+
} else {
|
|
9768
|
+
console.log(
|
|
9769
|
+
chalk.green(
|
|
9770
|
+
`Completed ${config?.entity ?? "entity"} migrations (success)${config?.dry ? " [dry-run, no output written]" : ""} \u2713`
|
|
9771
|
+
)
|
|
9772
|
+
);
|
|
9773
|
+
}
|
|
9774
|
+
};
|
|
9775
|
+
const migrateAll = async ({
|
|
9776
|
+
config,
|
|
9777
|
+
beforeMigrateRecord,
|
|
9778
|
+
afterMigrateRecord,
|
|
9779
|
+
onMigrationErrors
|
|
9780
|
+
}) => {
|
|
9781
|
+
const plan = await getPlannedMigrations({
|
|
9782
|
+
config
|
|
9783
|
+
});
|
|
9784
|
+
const latestVersion = plan.nextVersion;
|
|
9785
|
+
const latestVersionPlanLength = plan.plannedMigrations.length;
|
|
9786
|
+
const recordList = await getRecordList(
|
|
9787
|
+
config?.database,
|
|
9788
|
+
config?.entity,
|
|
9789
|
+
config?.entityColumnNames,
|
|
9790
|
+
latestVersion,
|
|
9791
|
+
latestVersionPlanLength
|
|
9792
|
+
);
|
|
9793
|
+
await migrateRecords({
|
|
9794
|
+
config,
|
|
9795
|
+
recordList,
|
|
9796
|
+
beforeMigrateRecord,
|
|
9797
|
+
afterMigrateRecord,
|
|
9798
|
+
onMigrationErrors
|
|
9799
|
+
});
|
|
9800
|
+
};
|
|
9801
|
+
|
|
9589
9802
|
const parsePlan = (plan) => {
|
|
9590
9803
|
return (() => {
|
|
9591
9804
|
try {
|
|
@@ -9639,5 +9852,6 @@ exports.getPlannedMigrations = getPlannedMigrations;
|
|
|
9639
9852
|
exports.getPlannedVersion = getPlannedVersion;
|
|
9640
9853
|
exports.getVersions = getVersions;
|
|
9641
9854
|
exports.migrate = migrate;
|
|
9855
|
+
exports.migrateAll = migrateAll;
|
|
9642
9856
|
exports.pipe = pipe;
|
|
9643
9857
|
exports.printVersionHistory = printVersionHistory;
|