vxrn 1.21.6 → 1.21.7
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/config/getOptionsFilled.mjs +3 -5
- package/dist/config/getOptionsFilled.mjs.map +1 -1
- package/dist/config/getOptionsFilled.native.js +3 -5
- package/dist/config/getOptionsFilled.native.js.map +1 -1
- package/dist/exports/clean.mjs +84 -16
- package/dist/exports/clean.mjs.map +1 -1
- package/dist/exports/clean.native.js +89 -16
- package/dist/exports/clean.native.js.map +1 -1
- package/dist/exports/clean.test.mjs +81 -0
- package/dist/exports/clean.test.mjs.map +1 -0
- package/dist/exports/clean.test.native.js +88 -0
- package/dist/exports/clean.test.native.js.map +1 -0
- package/dist/exports/dev.mjs +8 -3
- package/dist/exports/dev.mjs.map +1 -1
- package/dist/exports/dev.native.js +8 -3
- package/dist/exports/dev.native.js.map +1 -1
- package/dist/serve/node.mjs +20 -24
- package/dist/serve/node.mjs.map +1 -1
- package/dist/serve/node.native.js +20 -22
- package/dist/serve/node.native.js.map +1 -1
- package/dist/serve/node.test.mjs +60 -0
- package/dist/serve/node.test.mjs.map +1 -0
- package/dist/serve/node.test.native.js +72 -0
- package/dist/serve/node.test.native.js.map +1 -0
- package/dist/utils/state.mjs +11 -1
- package/dist/utils/state.mjs.map +1 -1
- package/dist/utils/state.native.js +11 -1
- package/dist/utils/state.native.js.map +1 -1
- package/package.json +11 -11
- package/src/config/getOptionsFilled.ts +2 -4
- package/src/exports/clean.test.ts +82 -0
- package/src/exports/clean.ts +90 -26
- package/src/exports/dev.ts +8 -3
- package/src/serve/node.test.ts +63 -0
- package/src/serve/node.ts +22 -26
- package/src/utils/state.ts +9 -1
- package/types/config/getOptionsFilled.d.ts +2 -0
- package/types/config/getOptionsFilled.d.ts.map +1 -1
- package/types/exports/build.d.ts +1 -0
- package/types/exports/build.d.ts.map +1 -1
- package/types/exports/clean.d.ts +6 -9
- package/types/exports/clean.d.ts.map +1 -1
- package/types/exports/clean.test.d.ts.map +1 -0
- package/types/exports/dev.d.ts.map +1 -1
- package/types/serve/node.d.ts.map +1 -1
- package/types/serve/node.test.d.ts.map +1 -0
- package/types/utils/state.d.ts.map +1 -1
|
@@ -4,7 +4,7 @@ import { tmpdir } from "node:os";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { readPackageJSON } from "pkg-types";
|
|
6
6
|
import { getServerOptionsFilled } from "./getServerOptionsFilled.mjs";
|
|
7
|
-
import { readState
|
|
7
|
+
import { readState } from "../utils/state.mjs";
|
|
8
8
|
import { getCacheDir } from "../utils/getCacheDir.mjs";
|
|
9
9
|
const require2 = createRequire(import.meta.url);
|
|
10
10
|
let optionsFilled = null;
|
|
@@ -26,9 +26,6 @@ async function fillOptions(options, {
|
|
|
26
26
|
} : void 0;
|
|
27
27
|
const versionHash = hashString(JSON.stringify(packageJSON));
|
|
28
28
|
const clean = options.clean ?? (state.versionHash && state.versionHash !== versionHash) ? "vite" : false;
|
|
29
|
-
void writeState(cacheDir, {
|
|
30
|
-
versionHash
|
|
31
|
-
});
|
|
32
29
|
if (typeof options.build?.server !== "boolean" && !options.build?.server) {
|
|
33
30
|
options.build ||= {};
|
|
34
31
|
options.build.server = false;
|
|
@@ -54,7 +51,8 @@ async function fillOptions(options, {
|
|
|
54
51
|
packageVersions,
|
|
55
52
|
state,
|
|
56
53
|
packageRootDir,
|
|
57
|
-
cacheDir
|
|
54
|
+
cacheDir,
|
|
55
|
+
versionHash
|
|
58
56
|
};
|
|
59
57
|
optionsFilled = final;
|
|
60
58
|
return final;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createHash","createRequire","tmpdir","join","readPackageJSON","getServerOptionsFilled","readState","
|
|
1
|
+
{"version":3,"names":["createHash","createRequire","tmpdir","join","readPackageJSON","getServerOptionsFilled","readState","getCacheDir","require","import","meta","url","optionsFilled","fillOptions","options","mode","root","process","cwd","entries","devMode","packageRootDir","resolve","cacheDir","state","packageJSON","Promise","all","deps","dependencies","packageVersions","react","replace","reactNative","versionHash","hashString","JSON","stringify","clean","build","server","debugBundlePath","debugBundle","Math","round","random","final","debugBundlePaths","ios","android","native","getOptionsFilled","str","hash","update","digest"],"sources":["../../src/config/getOptionsFilled.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAA,QAAkB;AAC3B,SAASC,aAAA,QAAqB;AAC9B,SAASC,MAAA,QAAc;AACvB,SAASC,IAAA,QAAY;AACrB,SAASC,eAAA,QAAuB;AAEhC,SAASC,sBAAA,QAA8B;AACvC,SAASC,SAAA,QAAiB;AAC1B,SAASC,WAAA,QAAmB;AAE5B,MAAMC,QAAA,GAAUP,aAAA,CAAcQ,MAAA,CAAAC,IAAA,CAAYC,GAAG;AAgC7C,IAAIC,aAAA,GAA0C;AAE9C,eAAsBC,YACpBC,OAAA,EACA;EAAEC,IAAA,GAAO;AAAM,IAAqB,CAAC,GACrC;EACA,MAAM;IAAEC,IAAA,GAAOC,OAAA,CAAQC,GAAA,CAAI;IAAGC;EAAQ,IAAIL,OAAA;EAE1C,MAAMM,OAAA,GAAUN,OAAA,CAAQC,IAAA,KAAS,eAAe,QAAQA,IAAA,KAAS;EAEjE,MAAMM,cAAA,GAAiBlB,IAAA,CAAKK,QAAA,CAAQc,OAAA,CAAQ,MAAM,GAAG,OAAO;EAC5D,MAAMC,QAAA,GAAWhB,WAAA,CAAYS,IAAI;EAEjC,MAAM,CAACQ,KAAA,EAAOC,WAAW,IAAI,MAAMC,OAAA,CAAQC,GAAA,CAAI,CAACrB,SAAA,CAAUiB,QAAQ,GAAGnB,eAAA,CAAgB,CAAC,CAAC;EAEvF,MAAMwB,IAAA,GAAOH,WAAA,CAAYI,YAAA,IAAgB,CAAC;EAE1C,MAAMC,eAAA,GACJF,IAAA,CAAKG,KAAA,IAASH,IAAA,CAAK,cAAc,IAC7B;IACEG,KAAA,EAAOH,IAAA,CAAKG,KAAA,CAAMC,OAAA,CAAQ,SAAS,EAAE;IACrCC,WAAA,EAAaL,IAAA,CAAK,cAAc,EAAEI,OAAA,CAAQ,SAAS,EAAE;EACvD,IACA;EAEN,MAAME,WAAA,GAAcC,UAAA,CAAWC,IAAA,CAAKC,SAAA,CAAUZ,WAAW,CAAC;EAC1D,MAAMa,KAAA,GACHxB,OAAA,CAAQwB,KAAA,KAAUd,KAAA,CAAMU,WAAA,IAAeV,KAAA,CAAMU,WAAA,KAAgBA,WAAA,IAC1D,SACA;EAEN,IAAI,OAAOpB,OAAA,CAAQyB,KAAA,EAAOC,MAAA,KAAW,aAAa,CAAC1B,OAAA,CAAQyB,KAAA,EAAOC,MAAA,EAAQ;IAExE1B,OAAA,CAAQyB,KAAA,KAAU,CAAC;IACnBzB,OAAA,CAAQyB,KAAA,CAAMC,MAAA,GAAS;EACzB;EAEA,MAAMC,eAAA,GACJ3B,OAAA,CAAQ4B,WAAA,IAAe,OAAO5B,OAAA,CAAQ4B,WAAA,KAAgB,WAClD5B,OAAA,CAAQ4B,WAAA,GACRvC,IAAA,CAAKD,MAAA,CAAO,GAAG,UAAUyC,IAAA,CAAKC,KAAA,CAAMD,IAAA,CAAKE,MAAA,CAAO,IAAI,GAAO,CAAC,KAAK;EAEvE,MAAMC,KAAA,GAAQ;IACZ,GAAGhC,OAAA;IAAA;IAEHiC,gBAAA,EAAkB;MAChBC,GAAA,EAAKP,eAAA;MACLQ,OAAA,EAASR;IACX;IACA1B,IAAA,EAAMK,OAAA,GAAW,gBAA2B;IAC5CkB,KAAA;IACAtB,IAAA;IACAwB,MAAA,EAAQ,MAAMnC,sBAAA,CAAuBS,OAAA,CAAQ0B,MAAA,EAAQzB,IAAI;IACzDI,OAAA,EAAS;MACP+B,MAAA,EAAQ;MACRV,MAAA,EAAQ;MACR,GAAGrB;IACL;IACAM,WAAA;IACAK,eAAA;IACAN,KAAA;IACAH,cAAA;IACAE,QAAA;IACAW;EACF;EAEAtB,aAAA,GAAgBkC,KAAA;EAEhB,OAAOA,KAAA;AACT;AAEO,SAASK,iBAAA,EAAmB;EACjC,OAAOvC,aAAA;AACT;AAEA,SAASuB,WAAWiB,GAAA,EAAqB;EACvC,MAAMC,IAAA,GAAOrD,UAAA,CAAW,QAAQ;EAChCqD,IAAA,CAAKC,MAAA,CAAOF,GAAG;EACf,OAAOC,IAAA,CAAKE,MAAA,CAAO,KAAK;AAC1B","ignoreList":[]}
|
|
@@ -4,7 +4,7 @@ import { tmpdir } from "os";
|
|
|
4
4
|
import { join } from "path";
|
|
5
5
|
import { readPackageJSON } from "pkg-types";
|
|
6
6
|
import { getServerOptionsFilled } from "./getServerOptionsFilled.native.js";
|
|
7
|
-
import { readState
|
|
7
|
+
import { readState } from "../utils/state.native.js";
|
|
8
8
|
import { getCacheDir } from "../utils/getCacheDir.native.js";
|
|
9
9
|
var require2 = createRequire(import.meta.url);
|
|
10
10
|
var optionsFilled = null;
|
|
@@ -29,9 +29,6 @@ async function fillOptions(options) {
|
|
|
29
29
|
} : void 0;
|
|
30
30
|
var versionHash = hashString(JSON.stringify(packageJSON));
|
|
31
31
|
var clean = ((_options_clean = options.clean) !== null && _options_clean !== void 0 ? _options_clean : state.versionHash && state.versionHash !== versionHash) ? "vite" : false;
|
|
32
|
-
void writeState(cacheDir, {
|
|
33
|
-
versionHash
|
|
34
|
-
});
|
|
35
32
|
if (typeof ((_options_build = options.build) === null || _options_build === void 0 ? void 0 : _options_build.server) !== "boolean" && !((_options_build1 = options.build) === null || _options_build1 === void 0 ? void 0 : _options_build1.server)) {
|
|
36
33
|
var _options;
|
|
37
34
|
(_options = options).build || (_options.build = {});
|
|
@@ -58,7 +55,8 @@ async function fillOptions(options) {
|
|
|
58
55
|
packageVersions,
|
|
59
56
|
state,
|
|
60
57
|
packageRootDir,
|
|
61
|
-
cacheDir
|
|
58
|
+
cacheDir,
|
|
59
|
+
versionHash
|
|
62
60
|
};
|
|
63
61
|
optionsFilled = final;
|
|
64
62
|
return final;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createHash","createRequire","tmpdir","join","readPackageJSON","getServerOptionsFilled","readState","
|
|
1
|
+
{"version":3,"names":["createHash","createRequire","tmpdir","join","readPackageJSON","getServerOptionsFilled","readState","getCacheDir","require2","import","meta","url","optionsFilled","fillOptions","options","mode","arguments","length","_options_clean","_options_build","_options_build1","root","process","cwd","entries","devMode","packageRootDir","resolve","cacheDir","state","packageJSON","Promise","all","deps","dependencies","packageVersions","react","replace","reactNative","versionHash","hashString","JSON","stringify","clean","build","server","_options","debugBundlePath","debugBundle","Math","round","random","final","debugBundlePaths","ios","android","native","getOptionsFilled"],"sources":["../../src/config/getOptionsFilled.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAA,QAAkB;AAC3B,SAASC,aAAA,QAAqB;AAC9B,SAASC,MAAA,QAAc;AACvB,SAASC,IAAA,QAAY;AACrB,SAASC,eAAA,QAAuB;AAEhC,SAASC,sBAAA,QAA8B;AACvC,SAASC,SAAA,QAAiB;AAC1B,SAASC,WAAA,QAAmB;AAE5B,IAAAC,QAAM,GAAAP,aAAU,CAAAQ,MAAc,CAAAC,IAAA,CAAAC,GAAY;AAgC1C,IAAIC,aAAA,GAA0C;AAE9C,eAAsBC,YACpBC,OAAA,EACA;EAEA;IAAMC,IAAE;EAAO,IAAQC,SAAO,CAAAC,MAAQ,GAAI,KAAAD,SAAA,iBAAAA,SAAA;EAE1C,IAAAE,cAAgB;EAEhB,IAAAC,cAAM,EAAAC,eAAsB;EAC5B;IAAMC,IAAA,GAAAC,OAAW,CAAAC,GAAA;IAAAC;EAAgB,IAAAV,OAAA;EAEjC,IAAAW,OAAO,GAAOX,OAAA,CAAAC,IAAW,KAAI,YAAc,QAAK,GAAAA,IAAU,UAAQ;EAElE,IAAAW,cAAa,GAAAvB,IAAY,CAAAK,QAAA,CAAAmB,OAAiB;EAE1C,IAAAC,QAAM,GAAArB,WACJ,CAAAc,IAAK;EACD,IACE,CAAAQ,KAAO,EAAAC,WAAW,UAAQC,OAAW,CAAAC,GAAA,EACrC1B,SAAA,CAAAsB,QAAkB,GACpBxB,eACA,GAEN;EACA,IAAA6B,IAAM,GAAAH,WACK,CAAAI,YAAU,IAAM;EAI3B,IAAIC,eAAe,GAAAF,IAAO,CAAAG,KAAA,IAAAH,IAAW,eAAc,IAAQ;IAEzDG,KAAA,EAAAH,IAAQ,CAAAG,KAAA,CAAUC,OAAC;IACnBC,WAAQ,EAAAL,IAAM,eAAS,EAAAI,OAAA;EACzB;EAEA,IAAAE,WAAM,GAAAC,UACJ,CAAAC,IAAQ,CAAAC,SAAA,CAAAZ,WAAsB;EAIhC,IAAAa,KAAM,KAAQzB,cAAA,GAAAJ,OAAA,CAAA6B,KAAA,cAAAzB,cAAA,cAAAA,cAAA,GAAAW,KAAA,CAAAU,WAAA,IAAAV,KAAA,CAAAU,WAAA,KAAAA,WAAA;EAAA,IACZ,QAAG,CAAApB,cAAA,GAAAL,OAAA,CAAA8B,KAAA,cAAAzB,cAAA,uBAAAA,cAAA,CAAA0B,MAAA,sBAAAzB,eAAA,GAAAN,OAAA,CAAA8B,KAAA,cAAAxB,eAAA,uBAAAA,eAAA,CAAAyB,MAAA;IAAA,IAAAC,QAAA;IAEH,CAAAA,QAAA,GAAAhC,OAAkB,EAAA8B,KAAA,KAAAE,QAAA,CAAAF,KAAA;IAAA9B,OACX,CAAA8B,KAAA,CAAAC,MAAA;EAAA;EACI,IACXE,eAAA,GAAAjC,OAAA,CAAAkC,WAAA,WAAAlC,OAAA,CAAAkC,WAAA,gBAAAlC,OAAA,CAAAkC,WAAA,GAAA7C,IAAA,CAAAD,MAAA,cAAA+C,IAAA,CAAAC,KAAA,CAAAD,IAAA,CAAAE,MAAA;EAAA,IACAC,KAAM;IACN,GAAAtC,OAAA;IACA;IACAuC,gBAAc;MACdC,GAAA,EAAAP,eAAS;MACPQ,OAAA,EAAQR;IAAA;IACAhC,IACR,EAAGU,OAAA;IACLkB,KAAA;IACAtB,IAAA;IACAwB,MAAA,QAAAxC,sBAAA,CAAAS,OAAA,CAAA+B,MAAA,EAAA9B,IAAA;IACAS,OAAA;MACAgC,MAAA;MACAX,MAAA;MACA,GAAArB;IACF;IAEAM,WAAA;IAEAK,eAAO;IACTN,KAAA;IAEOH,cAAS;IACdE,QAAO;IACTW;EAEA;EACE3B,aAAa,GAAAwC,KAAA;EACb,OAAKA,KAAO;AACZ;AACF,SAAAK,iBAAA","ignoreList":[]}
|
package/dist/exports/clean.mjs
CHANGED
|
@@ -1,31 +1,99 @@
|
|
|
1
|
-
import { rm } from "node:fs/promises";
|
|
2
|
-
import { join } from "node:path";
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
3
|
import { fillOptions } from "../config/getOptionsFilled.mjs";
|
|
4
4
|
import { getSSRExternalsCachePath } from "../plugins/autoDepOptimizePlugin.mjs";
|
|
5
5
|
import { getCacheDir } from "../utils/getCacheDir.mjs";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
import { readState, writeState } from "../utils/state.mjs";
|
|
7
|
+
const CLEAN_LOCK_WAIT_MS = 25;
|
|
8
|
+
const CLEAN_LOCK_TIMEOUT_MS = 6e4;
|
|
9
|
+
function getErrorCode(err) {
|
|
10
|
+
if (err instanceof Error && "code" in err && typeof err.code === "string") {
|
|
11
|
+
return err.code;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async function withCacheCleanLock(cacheDir, action) {
|
|
15
|
+
const lockPath = join(dirname(cacheDir), ".vxrn-clean.lock");
|
|
16
|
+
const startedAt = Date.now();
|
|
17
|
+
await mkdir(dirname(lockPath), {
|
|
18
|
+
recursive: true
|
|
19
|
+
});
|
|
20
|
+
while (true) {
|
|
21
|
+
try {
|
|
22
|
+
await writeFile(lockPath, `${process.pid}
|
|
23
|
+
`, {
|
|
24
|
+
flag: "wx"
|
|
25
|
+
});
|
|
26
|
+
break;
|
|
27
|
+
} catch (err) {
|
|
28
|
+
if (getErrorCode(err) !== "EEXIST") {
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
if (Date.now() - startedAt >= CLEAN_LOCK_TIMEOUT_MS) {
|
|
32
|
+
let owner = "unknown process";
|
|
33
|
+
try {
|
|
34
|
+
owner = `process ${(await readFile(lockPath, "utf8")).trim()}`;
|
|
35
|
+
} catch (readErr) {
|
|
36
|
+
if (getErrorCode(readErr) === "ENOENT") {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
throw readErr;
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`Timed out waiting for VXRN cache cleanup lock held by ${owner}`);
|
|
42
|
+
}
|
|
43
|
+
await new Promise(resolve => setTimeout(resolve, CLEAN_LOCK_WAIT_MS));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
return await action();
|
|
48
|
+
} finally {
|
|
49
|
+
await rm(lockPath, {
|
|
50
|
+
force: true
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function removeCachePaths(root, only) {
|
|
55
|
+
const removeVxrnCache = process.env.VXRN_DONT_CLEAN_SELF ? rm(getSSRExternalsCachePath(root)).catch(throwIfNotMissingError) : rm(getCacheDir(root), {
|
|
13
56
|
recursive: true,
|
|
14
57
|
force: true
|
|
15
|
-
}).catch(throwIfNotMissingError)
|
|
58
|
+
}).catch(throwIfNotMissingError);
|
|
59
|
+
console.info(`[vxrn] cleaning`);
|
|
60
|
+
await Promise.all([rm(join(root, "node_modules", ".vite"), {
|
|
16
61
|
recursive: true,
|
|
17
62
|
force: true
|
|
18
|
-
}).catch(throwIfNotMissingError), only === "vite" ? null : rm(join(root, "dist"), {
|
|
63
|
+
}).catch(throwIfNotMissingError), removeVxrnCache, only === "vite" ? null : rm(join(root, "dist"), {
|
|
19
64
|
recursive: true,
|
|
20
65
|
force: true
|
|
21
66
|
}).catch(throwIfNotMissingError)]);
|
|
67
|
+
}
|
|
68
|
+
async function prepareCacheForVersion({
|
|
69
|
+
root,
|
|
70
|
+
cacheDir,
|
|
71
|
+
versionHash,
|
|
72
|
+
forceClean = false
|
|
73
|
+
}) {
|
|
74
|
+
return withCacheCleanLock(cacheDir, async () => {
|
|
75
|
+
const state = await readState(cacheDir);
|
|
76
|
+
const versionChanged = !!state.versionHash && state.versionHash !== versionHash;
|
|
77
|
+
const shouldClean = forceClean || versionChanged;
|
|
78
|
+
if (shouldClean) {
|
|
79
|
+
await removeCachePaths(root, "vite");
|
|
80
|
+
}
|
|
81
|
+
if (shouldClean || state.versionHash !== versionHash) {
|
|
82
|
+
await writeState(cacheDir, {
|
|
83
|
+
versionHash
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return shouldClean;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const clean = async (rest, only) => {
|
|
90
|
+
const options = await fillOptions(rest);
|
|
91
|
+
await withCacheCleanLock(options.cacheDir, () => removeCachePaths(options.root, only));
|
|
22
92
|
};
|
|
23
93
|
function throwIfNotMissingError(err) {
|
|
24
|
-
if (err
|
|
25
|
-
|
|
26
|
-
throw Error;
|
|
27
|
-
}
|
|
94
|
+
if (getErrorCode(err) !== "ENOENT") {
|
|
95
|
+
throw err;
|
|
28
96
|
}
|
|
29
97
|
}
|
|
30
|
-
export { clean };
|
|
98
|
+
export { clean, prepareCacheForVersion };
|
|
31
99
|
//# sourceMappingURL=clean.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["rm","join","fillOptions","getSSRExternalsCachePath","getCacheDir","
|
|
1
|
+
{"version":3,"names":["mkdir","readFile","rm","writeFile","dirname","join","fillOptions","getSSRExternalsCachePath","getCacheDir","readState","writeState","CLEAN_LOCK_WAIT_MS","CLEAN_LOCK_TIMEOUT_MS","getErrorCode","err","Error","code","withCacheCleanLock","cacheDir","action","lockPath","startedAt","Date","now","recursive","process","pid","flag","owner","trim","readErr","Promise","resolve","setTimeout","force","removeCachePaths","root","only","removeVxrnCache","env","VXRN_DONT_CLEAN_SELF","catch","throwIfNotMissingError","console","info","all","prepareCacheForVersion","versionHash","forceClean","state","versionChanged","shouldClean","clean","rest","options"],"sources":["../../src/exports/clean.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { rm } from "fs/promises";
|
|
2
|
-
import { join } from "path";
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from "fs/promises";
|
|
2
|
+
import { dirname, join } from "path";
|
|
3
3
|
import { fillOptions } from "../config/getOptionsFilled.native.js";
|
|
4
4
|
import { getSSRExternalsCachePath } from "../plugins/autoDepOptimizePlugin.native.js";
|
|
5
5
|
import { getCacheDir } from "../utils/getCacheDir.native.js";
|
|
6
|
+
import { readState, writeState } from "../utils/state.native.js";
|
|
6
7
|
function _instanceof(left, right) {
|
|
7
8
|
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
8
9
|
return !!right[Symbol.hasInstance](left);
|
|
@@ -10,29 +11,101 @@ function _instanceof(left, right) {
|
|
|
10
11
|
return left instanceof right;
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
var CLEAN_LOCK_WAIT_MS = 25;
|
|
15
|
+
var CLEAN_LOCK_TIMEOUT_MS = 6e4;
|
|
16
|
+
function getErrorCode(err) {
|
|
17
|
+
if (_instanceof(err, Error) && "code" in err && typeof err.code === "string") {
|
|
18
|
+
return err.code;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function withCacheCleanLock(cacheDir, action) {
|
|
22
|
+
var lockPath = join(dirname(cacheDir), ".vxrn-clean.lock");
|
|
23
|
+
var startedAt = Date.now();
|
|
24
|
+
await mkdir(dirname(lockPath), {
|
|
25
|
+
recursive: true
|
|
26
|
+
});
|
|
27
|
+
while (true) {
|
|
28
|
+
try {
|
|
29
|
+
await writeFile(lockPath, `${process.pid}
|
|
30
|
+
`, {
|
|
31
|
+
flag: "wx"
|
|
32
|
+
});
|
|
33
|
+
break;
|
|
34
|
+
} catch (err) {
|
|
35
|
+
if (getErrorCode(err) !== "EEXIST") {
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
if (Date.now() - startedAt >= CLEAN_LOCK_TIMEOUT_MS) {
|
|
39
|
+
var owner = "unknown process";
|
|
40
|
+
try {
|
|
41
|
+
owner = `process ${(await readFile(lockPath, "utf8")).trim()}`;
|
|
42
|
+
} catch (readErr) {
|
|
43
|
+
if (getErrorCode(readErr) === "ENOENT") {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
throw readErr;
|
|
47
|
+
}
|
|
48
|
+
throw new Error(`Timed out waiting for VXRN cache cleanup lock held by ${owner}`);
|
|
49
|
+
}
|
|
50
|
+
await new Promise(function (resolve) {
|
|
51
|
+
return setTimeout(resolve, CLEAN_LOCK_WAIT_MS);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
return await action();
|
|
57
|
+
} finally {
|
|
58
|
+
await rm(lockPath, {
|
|
59
|
+
force: true
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function removeCachePaths(root, only) {
|
|
64
|
+
var removeVxrnCache = process.env.VXRN_DONT_CLEAN_SELF ? rm(getSSRExternalsCachePath(root)).catch(throwIfNotMissingError) : rm(getCacheDir(root), {
|
|
20
65
|
recursive: true,
|
|
21
66
|
force: true
|
|
22
|
-
}).catch(throwIfNotMissingError)
|
|
67
|
+
}).catch(throwIfNotMissingError);
|
|
68
|
+
console.info(`[vxrn] cleaning`);
|
|
69
|
+
await Promise.all([rm(join(root, "node_modules", ".vite"), {
|
|
23
70
|
recursive: true,
|
|
24
71
|
force: true
|
|
25
|
-
}).catch(throwIfNotMissingError), only === "vite" ? null : rm(join(root, "dist"), {
|
|
72
|
+
}).catch(throwIfNotMissingError), removeVxrnCache, only === "vite" ? null : rm(join(root, "dist"), {
|
|
26
73
|
recursive: true,
|
|
27
74
|
force: true
|
|
28
75
|
}).catch(throwIfNotMissingError)]);
|
|
76
|
+
}
|
|
77
|
+
async function prepareCacheForVersion(param) {
|
|
78
|
+
var {
|
|
79
|
+
root,
|
|
80
|
+
cacheDir,
|
|
81
|
+
versionHash,
|
|
82
|
+
forceClean = false
|
|
83
|
+
} = param;
|
|
84
|
+
return withCacheCleanLock(cacheDir, async function () {
|
|
85
|
+
var state = await readState(cacheDir);
|
|
86
|
+
var versionChanged = !!state.versionHash && state.versionHash !== versionHash;
|
|
87
|
+
var shouldClean = forceClean || versionChanged;
|
|
88
|
+
if (shouldClean) {
|
|
89
|
+
await removeCachePaths(root, "vite");
|
|
90
|
+
}
|
|
91
|
+
if (shouldClean || state.versionHash !== versionHash) {
|
|
92
|
+
await writeState(cacheDir, {
|
|
93
|
+
versionHash
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return shouldClean;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
var clean = async function (rest, only) {
|
|
100
|
+
var options = await fillOptions(rest);
|
|
101
|
+
await withCacheCleanLock(options.cacheDir, function () {
|
|
102
|
+
return removeCachePaths(options.root, only);
|
|
103
|
+
});
|
|
29
104
|
};
|
|
30
105
|
function throwIfNotMissingError(err) {
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
throw Error;
|
|
34
|
-
}
|
|
106
|
+
if (getErrorCode(err) !== "ENOENT") {
|
|
107
|
+
throw err;
|
|
35
108
|
}
|
|
36
109
|
}
|
|
37
|
-
export { clean };
|
|
110
|
+
export { clean, prepareCacheForVersion };
|
|
38
111
|
//# sourceMappingURL=clean.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["rm","join","fillOptions","getSSRExternalsCachePath","getCacheDir","_instanceof","left","right","Symbol","hasInstance","
|
|
1
|
+
{"version":3,"names":["mkdir","readFile","rm","writeFile","dirname","join","fillOptions","getSSRExternalsCachePath","getCacheDir","readState","writeState","_instanceof","left","right","Symbol","hasInstance","CLEAN_LOCK_WAIT_MS","CLEAN_LOCK_TIMEOUT_MS","getErrorCode","err","Error","code","withCacheCleanLock","cacheDir","action","lockPath","startedAt","Date","now","recursive","process","pid","flag","owner","trim","readErr","Promise","resolve","setTimeout","force","removeCachePaths","root","only","removeVxrnCache","env","VXRN_DONT_CLEAN_SELF","catch","throwIfNotMissingError","console","info","all","prepareCacheForVersion","param","versionHash","forceClean","state","versionChanged","shouldClean"],"sources":["../../src/exports/clean.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { mkdtemp, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
describe("prepareCacheForVersion", () => {
|
|
10
|
+
let root;
|
|
11
|
+
afterEach(async () => {
|
|
12
|
+
if (root) {
|
|
13
|
+
await rm(root, {
|
|
14
|
+
recursive: true,
|
|
15
|
+
force: true
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
it("lets one process clean a stale same-root cache", async () => {
|
|
20
|
+
root = await mkdtemp(join(tmpdir(), "vxrn-concurrent-clean-"));
|
|
21
|
+
const cacheDir = join(root, "node_modules", ".vxrn");
|
|
22
|
+
const viteDir = join(root, "node_modules", ".vite");
|
|
23
|
+
const participantsDir = join(root, "participants");
|
|
24
|
+
const participantCount = 4;
|
|
25
|
+
await Promise.all([mkdir(cacheDir, {
|
|
26
|
+
recursive: true
|
|
27
|
+
}), mkdir(viteDir, {
|
|
28
|
+
recursive: true
|
|
29
|
+
}), mkdir(participantsDir, {
|
|
30
|
+
recursive: true
|
|
31
|
+
})]);
|
|
32
|
+
await Promise.all([writeFile(join(cacheDir, "state.json"), JSON.stringify({
|
|
33
|
+
versionHash: "old"
|
|
34
|
+
})), writeFile(join(cacheDir, "stale"), "stale"), writeFile(join(viteDir, "stale"), "stale")]);
|
|
35
|
+
const moduleUrl = pathToFileURL(join(dirname(import.meta.filename), "clean.ts")).href;
|
|
36
|
+
const workerScript = participant => `
|
|
37
|
+
import { readdir, writeFile } from 'node:fs/promises'
|
|
38
|
+
import { join } from 'node:path'
|
|
39
|
+
import { prepareCacheForVersion } from ${JSON.stringify(moduleUrl)}
|
|
40
|
+
|
|
41
|
+
const root = ${JSON.stringify(root)}
|
|
42
|
+
const participantsDir = ${JSON.stringify(participantsDir)}
|
|
43
|
+
await writeFile(join(participantsDir, ${JSON.stringify(String(participant))}), '')
|
|
44
|
+
while ((await readdir(participantsDir)).length < ${participantCount}) {
|
|
45
|
+
await Bun.sleep(5)
|
|
46
|
+
}
|
|
47
|
+
const cleaned = await prepareCacheForVersion({
|
|
48
|
+
root,
|
|
49
|
+
cacheDir: join(root, 'node_modules', '.vxrn'),
|
|
50
|
+
versionHash: 'new',
|
|
51
|
+
})
|
|
52
|
+
console.info(cleaned ? 'cleaned-by-worker' : 'cache-already-current')
|
|
53
|
+
`;
|
|
54
|
+
const results = await Promise.all(Array.from({
|
|
55
|
+
length: participantCount
|
|
56
|
+
}, (_, participant) => execFileAsync("bun", ["-e", workerScript(participant)], {
|
|
57
|
+
env: {
|
|
58
|
+
...process.env,
|
|
59
|
+
VXRN_DONT_CLEAN_SELF: ""
|
|
60
|
+
}
|
|
61
|
+
})));
|
|
62
|
+
const output = results.map(({
|
|
63
|
+
stdout
|
|
64
|
+
}) => stdout).join("\n");
|
|
65
|
+
expect(output.match(/\[vxrn\] cleaning/g)).toHaveLength(1);
|
|
66
|
+
expect(output.match(/cleaned-by-worker/g)).toHaveLength(1);
|
|
67
|
+
expect(JSON.parse(await readFile(join(cacheDir, "state.json"), "utf8"))).toEqual({
|
|
68
|
+
versionHash: "new"
|
|
69
|
+
});
|
|
70
|
+
await expect(readFile(join(cacheDir, "stale"))).rejects.toMatchObject({
|
|
71
|
+
code: "ENOENT"
|
|
72
|
+
});
|
|
73
|
+
await expect(readFile(join(viteDir, "stale"))).rejects.toMatchObject({
|
|
74
|
+
code: "ENOENT"
|
|
75
|
+
});
|
|
76
|
+
await expect(readFile(join(root, "node_modules", ".vxrn-clean.lock"))).rejects.toMatchObject({
|
|
77
|
+
code: "ENOENT"
|
|
78
|
+
});
|
|
79
|
+
}, 2e4);
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=clean.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["execFile","mkdtemp","mkdir","readFile","rm","writeFile","tmpdir","dirname","join","pathToFileURL","promisify","afterEach","describe","expect","it","execFileAsync","root","recursive","force","cacheDir","viteDir","participantsDir","participantCount","Promise","all","JSON","stringify","versionHash","moduleUrl","import","meta","filename","href","workerScript","participant","String","results","Array","from","length","_","env","process","VXRN_DONT_CLEAN_SELF","output","map","stdout","match","toHaveLength","parse","toEqual","rejects","toMatchObject","code"],"sources":["../../src/exports/clean.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { execFile } from "child_process";
|
|
2
|
+
import { mkdtemp, mkdir, readFile, rm, writeFile } from "fs/promises";
|
|
3
|
+
import { tmpdir } from "os";
|
|
4
|
+
import { dirname, join } from "path";
|
|
5
|
+
import { pathToFileURL } from "url";
|
|
6
|
+
import { promisify } from "util";
|
|
7
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
8
|
+
var execFileAsync = promisify(execFile);
|
|
9
|
+
describe("prepareCacheForVersion", function () {
|
|
10
|
+
var root;
|
|
11
|
+
afterEach(async function () {
|
|
12
|
+
if (root) {
|
|
13
|
+
await rm(root, {
|
|
14
|
+
recursive: true,
|
|
15
|
+
force: true
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
it("lets one process clean a stale same-root cache", async function () {
|
|
20
|
+
root = await mkdtemp(join(tmpdir(), "vxrn-concurrent-clean-"));
|
|
21
|
+
var cacheDir = join(root, "node_modules", ".vxrn");
|
|
22
|
+
var viteDir = join(root, "node_modules", ".vite");
|
|
23
|
+
var participantsDir = join(root, "participants");
|
|
24
|
+
var participantCount = 4;
|
|
25
|
+
await Promise.all([mkdir(cacheDir, {
|
|
26
|
+
recursive: true
|
|
27
|
+
}), mkdir(viteDir, {
|
|
28
|
+
recursive: true
|
|
29
|
+
}), mkdir(participantsDir, {
|
|
30
|
+
recursive: true
|
|
31
|
+
})]);
|
|
32
|
+
await Promise.all([writeFile(join(cacheDir, "state.json"), JSON.stringify({
|
|
33
|
+
versionHash: "old"
|
|
34
|
+
})), writeFile(join(cacheDir, "stale"), "stale"), writeFile(join(viteDir, "stale"), "stale")]);
|
|
35
|
+
var moduleUrl = pathToFileURL(join(dirname(import.meta.filename), "clean.ts")).href;
|
|
36
|
+
var workerScript = function (participant) {
|
|
37
|
+
return `
|
|
38
|
+
import { readdir, writeFile } from 'node:fs/promises'
|
|
39
|
+
import { join } from 'node:path'
|
|
40
|
+
import { prepareCacheForVersion } from ${JSON.stringify(moduleUrl)}
|
|
41
|
+
|
|
42
|
+
const root = ${JSON.stringify(root)}
|
|
43
|
+
const participantsDir = ${JSON.stringify(participantsDir)}
|
|
44
|
+
await writeFile(join(participantsDir, ${JSON.stringify(String(participant))}), '')
|
|
45
|
+
while ((await readdir(participantsDir)).length < ${participantCount}) {
|
|
46
|
+
await Bun.sleep(5)
|
|
47
|
+
}
|
|
48
|
+
const cleaned = await prepareCacheForVersion({
|
|
49
|
+
root,
|
|
50
|
+
cacheDir: join(root, 'node_modules', '.vxrn'),
|
|
51
|
+
versionHash: 'new',
|
|
52
|
+
})
|
|
53
|
+
console.info(cleaned ? 'cleaned-by-worker' : 'cache-already-current')
|
|
54
|
+
`;
|
|
55
|
+
};
|
|
56
|
+
var results = await Promise.all(Array.from({
|
|
57
|
+
length: participantCount
|
|
58
|
+
}, function (_, participant) {
|
|
59
|
+
return execFileAsync("bun", ["-e", workerScript(participant)], {
|
|
60
|
+
env: {
|
|
61
|
+
...process.env,
|
|
62
|
+
VXRN_DONT_CLEAN_SELF: ""
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}));
|
|
66
|
+
var output = results.map(function (param) {
|
|
67
|
+
var {
|
|
68
|
+
stdout
|
|
69
|
+
} = param;
|
|
70
|
+
return stdout;
|
|
71
|
+
}).join("\n");
|
|
72
|
+
expect(output.match(/\[vxrn\] cleaning/g)).toHaveLength(1);
|
|
73
|
+
expect(output.match(/cleaned-by-worker/g)).toHaveLength(1);
|
|
74
|
+
expect(JSON.parse(await readFile(join(cacheDir, "state.json"), "utf8"))).toEqual({
|
|
75
|
+
versionHash: "new"
|
|
76
|
+
});
|
|
77
|
+
await expect(readFile(join(cacheDir, "stale"))).rejects.toMatchObject({
|
|
78
|
+
code: "ENOENT"
|
|
79
|
+
});
|
|
80
|
+
await expect(readFile(join(viteDir, "stale"))).rejects.toMatchObject({
|
|
81
|
+
code: "ENOENT"
|
|
82
|
+
});
|
|
83
|
+
await expect(readFile(join(root, "node_modules", ".vxrn-clean.lock"))).rejects.toMatchObject({
|
|
84
|
+
code: "ENOENT"
|
|
85
|
+
});
|
|
86
|
+
}, 2e4);
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=clean.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["execFile","mkdtemp","mkdir","readFile","rm","writeFile","tmpdir","dirname","join","pathToFileURL","promisify","afterEach","describe","expect","it","execFileAsync","root","recursive","force","cacheDir","viteDir","participantsDir","participantCount","Promise","all","JSON","stringify","versionHash","moduleUrl","import","meta","filename","href","workerScript","participant","String","results","Array","from","length","_","env","process","VXRN_DONT_CLEAN_SELF"],"sources":["../../src/exports/clean.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,QAAgB;AACzB,SAASC,OAAA,EAASC,KAAA,EAAOC,QAAA,EAAUC,EAAA,EAAIC,SAAA,QAAiB;AACxD,SAASC,MAAA,QAAc;AACvB,SAASC,OAAA,EAASC,IAAA,QAAY;AAC9B,SAASC,aAAA,QAAqB;AAC9B,SAASC,SAAA,QAAiB;AAC1B,SAASC,SAAA,EAAWC,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AAGhD,IAAAC,aAAM,GAAAL,SAAgB,CAAAV,QAAU;AAEhCY,QAAA,CAAS,0BAA0B,YAAM;EACvC,IAAII,IAAA;EAEJL,SAAA,CAAU,kBAAY;IACpB,IAAIK,IAAA,EAAM;MACR,MAAMZ,EAAA,CAAGY,IAAA,EAAM;QACjBC,SAAA;QACDC,KAAA;MAEE;IACD;EACA;EACAJ,EAAA,iDAA2C,EAAO;IAClDE,IAAA,GAAM,MAAAf,OAAA,CAAAO,IAAkB,CAAAF,MAAK,IAAM,wBAAc;IACjD,IAAAa,QAAM,GAAAX,IAAA,CAAAQ,IAAA,EAAmB;IAEzB,IAAAI,OAAM,GAAQZ,IAAI,CAAAQ,IAAA;IAAA,IAChBK,eAAgB,GAAEb,IAAA,CAAAQ,IAAW,gBAAM;IAAA,IACnCM,gBAAiB;IAAiB,MAClCC,OAAM,CAAAC,GAAA,EACPtB,KAAA,CAAAiB,QAAA;MACDF,SAAM,EAAQ;IACZ,IACAf,KAAA,CAAAkB,OAAU,EAAK;MACfH,SAAU;IACX,IAEDf,KAAM,CAAAmB,eAAY;MAClBJ,SAAM;IAAwC;IAAA,MAAAM,OAAA,CAAAC,GAAA,EAGsBnB,SAAA,CAAAG,IAAA,CAAAW,QAAA,iBAAAM,IAAA,CAAAC,SAAA;MAAAC,WAAA,EAEnD;IAAoB,KACsBtB,SAAA,CAAAG,IAAA,CAAAW,QAAA,mBACjB,GAAmCd,SAAA,CAAAG,IAAA,CAAAY,OAAA,qBACR;IAAA,IAAAQ,SAAA,GAAAnB,aAAA,CAAAD,IAAA,CAAAD,OAAA,CAAAsB,MAAA,CAAAC,IAAA,CAAAC,QAAA,gBAAAC,IAAA;IAAA,IAAAC,YAAA,YAAAA,CAAAC,WAAA;MAAA;AAAA;AAAA;AAAA,+CAAAT,IAAA,CAAAC,SAAA,CAAAE,SAAA;AAAA;AAAA,qBAAAH,IAAA,CAAAC,SAAA,CAAAV,IAAA;AAWrE,gCAAsBS,IAAQ,CAAAC,SAAA,CAAAL,eAAA;AAAA,8CACtBI,IAAA,CAAAC,SAAA,CAAAS,MAAA,CAAAD,WAAA;AAAA,yDAAgCZ,gBAAA;AAAA;AACoB;AACN;AACjD;AACH;AAEF;AAEA;AACA;AACA;IAAiF;IAEjF,IAACc,OAAA,SAAAb,OAAA,CAAAC,GAAA,CAAAa,KAAA,CAAAC,IAAA;MACDC,MAAM,EAAAjB;IAAgE,GACpE,UAAMkB,CAAA,EAAAN,WAAA;MACP,OAAAnB,aAAA,SACD,IAAM,EACJkB,YAAM,CAAAC,WAAA,EACP;QACDO,GAAM;UACJ,GAAAC,OAAc,CAAAD,GAAA;UACdE,oBAAwB;QACnB;MACV","ignoreList":[]}
|
package/dist/exports/dev.mjs
CHANGED
|
@@ -38,7 +38,7 @@ const dev = async optionsIn => {
|
|
|
38
38
|
printServerUrls
|
|
39
39
|
} = await import("../utils/printServerUrls.mjs");
|
|
40
40
|
const {
|
|
41
|
-
|
|
41
|
+
prepareCacheForVersion
|
|
42
42
|
} = await import("./clean.mjs");
|
|
43
43
|
const {
|
|
44
44
|
filterViteServerResolvedUrls
|
|
@@ -103,8 +103,13 @@ export default defineConfig({
|
|
|
103
103
|
cacheDir
|
|
104
104
|
} = options;
|
|
105
105
|
bindKeypressInput();
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
const cacheWasCleaned = await prepareCacheForVersion({
|
|
107
|
+
root: options.root,
|
|
108
|
+
cacheDir,
|
|
109
|
+
versionHash: options.versionHash,
|
|
110
|
+
forceClean: optionsIn.clean === true
|
|
111
|
+
});
|
|
112
|
+
if (options.clean || cacheWasCleaned) {
|
|
108
113
|
process.env.METRO_RESET_CACHE = "1";
|
|
109
114
|
}
|
|
110
115
|
await ensureDir(cacheDir);
|
package/dist/exports/dev.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FSExtra","colors","debounce","normalizePath","ensureDir","setupOrphanDetection","process","platform","initialPpid","ppid","interval","setInterval","exit","unref","dev","optionsIn","devStartTime","Date","now","env","IS_VXRN_CLI","debug","DEBUG","startUserInterface","bindKeypressInput","fillOptions","getViteServerConfig","printServerUrls","
|
|
1
|
+
{"version":3,"names":["FSExtra","colors","debounce","normalizePath","ensureDir","setupOrphanDetection","process","platform","initialPpid","ppid","interval","setInterval","exit","unref","dev","optionsIn","devStartTime","Date","now","env","IS_VXRN_CLI","debug","DEBUG","startUserInterface","bindKeypressInput","fillOptions","getViteServerConfig","printServerUrls","prepareCacheForVersion","filterViteServerResolvedUrls","removeUndefined","createServer","loadConfigFromFile","config","mode","command","console","error","extraConfig","resolve","extraConfigPath","extraResult","mergeConfig","info","cyan","warn","yellow","oneServerConfig","plugins","find","x","Array","isArray","server","options","cacheDir","cacheWasCleaned","root","versionHash","forceClean","clean","METRO_RESET_CACHE","serverConfig","viteServer","isClosing","start","connectedNativeClients","pendingTransforms","Map","watcher","addListener","path","normalizedPath","includes","normalizedCwd","cwd","id","replace","endsWith","has","set","transformRequest","err","get","httpServer","on","listen","totalStartupTime","bold","viteServerResolvedUrls","resolvedUrls","logger","closePromise","Promise","res","stop","removeAllListeners","close"],"sources":["../../src/exports/dev.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|