@gtkx/cli 2.0.0-beta.4 → 2.0.0-beta.5
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/commands/dev.js +2 -2
- package/dist/commands/dev.js.map +1 -1
- package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
- package/dist/deploy/freedesktop/validate.js +44 -12
- package/dist/deploy/freedesktop/validate.js.map +1 -1
- package/dist/dev/catalog-writes.d.ts +8 -0
- package/dist/dev/catalog-writes.d.ts.map +1 -0
- package/dist/dev/catalog-writes.js +26 -0
- package/dist/dev/catalog-writes.js.map +1 -0
- package/dist/dev/runner-deps.d.ts.map +1 -1
- package/dist/dev/runner-deps.js +10 -6
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/dev/runner.d.ts +1 -0
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +8 -2
- package/dist/dev/runner.js.map +1 -1
- package/dist/dev/supervisor.d.ts.map +1 -1
- package/dist/dev/supervisor.js +26 -20
- package/dist/dev/supervisor.js.map +1 -1
- package/dist/i18n/catalogs.d.ts +6 -2
- package/dist/i18n/catalogs.d.ts.map +1 -1
- package/dist/i18n/catalogs.js +9 -7
- package/dist/i18n/catalogs.js.map +1 -1
- package/dist/vite-plugins/i18n.d.ts +11 -2
- package/dist/vite-plugins/i18n.d.ts.map +1 -1
- package/dist/vite-plugins/i18n.js +3 -2
- package/dist/vite-plugins/i18n.js.map +1 -1
- package/dist/vite-plugins/index.d.ts +2 -0
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +8 -2
- package/dist/vite-plugins/index.js.map +1 -1
- package/package.json +10 -10
- package/src/commands/dev.ts +2 -2
- package/src/deploy/freedesktop/validate.ts +62 -13
- package/src/dev/catalog-writes.ts +35 -0
- package/src/dev/runner-deps.ts +14 -6
- package/src/dev/runner.ts +11 -2
- package/src/dev/supervisor.ts +38 -21
- package/src/i18n/catalogs.ts +20 -8
- package/src/vite-plugins/i18n.ts +20 -6
- package/src/vite-plugins/index.ts +15 -6
package/dist/dev/supervisor.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { error, exitCodeForSignal, info, installGracefulShutdown } from "@gtkx/utils";
|
|
2
2
|
import { fork as nodeFork } from "node:child_process";
|
|
3
3
|
import { statSync, watch as watchFs } from "node:fs";
|
|
4
|
-
import { basename, dirname, join } from "node:path";
|
|
4
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from "./entry-env.js";
|
|
7
7
|
const DEV_RUNNER_URL = new URL("../../bin/gtkx-dev-runner.js", import.meta.url);
|
|
@@ -91,7 +91,7 @@ const relaunchAfterExit = (state) => {
|
|
|
91
91
|
};
|
|
92
92
|
const isSupervisorShuttingDown = (state) => state.isShuttingDown;
|
|
93
93
|
const reconcileConfigWatchers = (state, paths, previous) => {
|
|
94
|
-
const
|
|
94
|
+
const changed = changedWatchPaths(previous, paths);
|
|
95
95
|
closeWatchers(state);
|
|
96
96
|
if (state.watch !== undefined) {
|
|
97
97
|
state.watch.paths = paths;
|
|
@@ -100,10 +100,15 @@ const reconcileConfigWatchers = (state, paths, previous) => {
|
|
|
100
100
|
return;
|
|
101
101
|
}
|
|
102
102
|
installConfigWatchers(state);
|
|
103
|
-
if (
|
|
104
|
-
scheduleRestart(state);
|
|
103
|
+
if (changed.length > 0 && !state.isRestartPending) {
|
|
104
|
+
scheduleRestart(state, changed);
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
|
+
const consumeChangedPaths = (state) => {
|
|
108
|
+
const changed = [...state.changedPaths].map((path) => relative(state.cwd, path));
|
|
109
|
+
state.changedPaths.clear();
|
|
110
|
+
return changed.length === 0 ? basename(state.configFile) : changed.join(", ");
|
|
111
|
+
};
|
|
107
112
|
const restart = async (state) => {
|
|
108
113
|
const watch = state.watch;
|
|
109
114
|
if (watch === undefined || state.isShuttingDown) {
|
|
@@ -114,7 +119,7 @@ const restart = async (state) => {
|
|
|
114
119
|
return;
|
|
115
120
|
}
|
|
116
121
|
state.isRestarting = true;
|
|
117
|
-
info(`${
|
|
122
|
+
info(`${consumeChangedPaths(state)} changed; regenerating bindings...`);
|
|
118
123
|
closeWatchers(state);
|
|
119
124
|
watch.paths = watch.resolvePaths();
|
|
120
125
|
const previous = snapshotWatchPaths(watch.paths);
|
|
@@ -144,8 +149,11 @@ const restart = async (state) => {
|
|
|
144
149
|
});
|
|
145
150
|
forwardSignal(current, "SIGTERM");
|
|
146
151
|
};
|
|
147
|
-
const scheduleRestart = (state) => {
|
|
152
|
+
const scheduleRestart = (state, changedPaths = []) => {
|
|
148
153
|
const timer = state.restartTimer;
|
|
154
|
+
for (const path of changedPaths) {
|
|
155
|
+
state.changedPaths.add(path);
|
|
156
|
+
}
|
|
149
157
|
if (timer.handle !== null) {
|
|
150
158
|
clearTimeout(timer.handle);
|
|
151
159
|
}
|
|
@@ -154,11 +162,12 @@ const scheduleRestart = (state) => {
|
|
|
154
162
|
void restart(state);
|
|
155
163
|
}, CONFIG_DEBOUNCE_MS);
|
|
156
164
|
};
|
|
157
|
-
const
|
|
165
|
+
const watchedChangePath = (state, directory, names, filename) => {
|
|
158
166
|
if (filename === null || state.isShuttingDown) {
|
|
159
|
-
return
|
|
167
|
+
return undefined;
|
|
160
168
|
}
|
|
161
|
-
|
|
169
|
+
const name = basename(filename.toString());
|
|
170
|
+
return names.has(name) ? join(directory, name) : undefined;
|
|
162
171
|
};
|
|
163
172
|
const isDirectory = (path) => {
|
|
164
173
|
try {
|
|
@@ -197,15 +206,10 @@ const watchPathState = (path) => {
|
|
|
197
206
|
}
|
|
198
207
|
};
|
|
199
208
|
const snapshotWatchPaths = (paths) => new Map([...watchTargets(paths)].map((path) => [path, watchPathState(path)]));
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
return true;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return false;
|
|
208
|
-
};
|
|
209
|
+
const changedWatchPaths = (previous, paths) => [...watchTargets(paths)].filter((path) => {
|
|
210
|
+
const current = watchPathState(path);
|
|
211
|
+
return previous.has(path) ? previous.get(path) !== current : current !== null;
|
|
212
|
+
});
|
|
209
213
|
const groupWatchNamesByDirectory = (paths) => {
|
|
210
214
|
const namesByDirectory = new Map();
|
|
211
215
|
for (const path of paths) {
|
|
@@ -219,8 +223,9 @@ const groupWatchNamesByDirectory = (paths) => {
|
|
|
219
223
|
const watchConfigDirectory = (state, directory, names) => {
|
|
220
224
|
try {
|
|
221
225
|
const watcher = watchFs(directory, (_event, filename) => {
|
|
222
|
-
|
|
223
|
-
|
|
226
|
+
const changed = watchedChangePath(state, directory, names, filename);
|
|
227
|
+
if (changed !== undefined) {
|
|
228
|
+
scheduleRestart(state, [changed]);
|
|
224
229
|
}
|
|
225
230
|
});
|
|
226
231
|
watcher.on("error", (cause) => {
|
|
@@ -281,6 +286,7 @@ const runDevSupervisor = async (options) => {
|
|
|
281
286
|
args,
|
|
282
287
|
watch,
|
|
283
288
|
watchers: [],
|
|
289
|
+
changedPaths: new Set(),
|
|
284
290
|
restartTimer: { handle: null },
|
|
285
291
|
fork,
|
|
286
292
|
child: null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAkB,QAAQ,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA+C/D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChF,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,cAAc,GAAG,+BAA+B,CAAC;AACvD,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAErD,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAY,EAAE,CACnD,IAAI,CAAC,MAAM,CACP,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAC3G,CAAC;AAEN,MAAM,cAAc,GAAG,CAAC,GAAsB,EAAsB,EAAE;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC;IAEjC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjG,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAe,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACjE,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE;QAC9B,GAAG;QACH,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,EAAE;QAChF,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC;KAChD,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAE,MAAsB,EAAQ,EAAE;IAC3E,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAA6B,EAAW,EAAE;IACjE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,KAAsB,EAAE,IAAmB,EAAE,MAA6B,EAAQ,EAAE;IAC7G,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACnC,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,IAAmB,EAAE,MAA6B,EAAQ,EAAE;IACzG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IAEnB,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAEzC,OAAO;IACX,CAAC;IAED,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC7B,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEd,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACpB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,IAAI,EACV,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,EACxF,KAAK,CAAC,GAAG,CACZ,CAAC;IAEF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAEpB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACvD,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAE3B,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAClD,OAAO;IACX,CAAC;IAED,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAC/B,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACvD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;QAE3B,OAAO;IACX,CAAC;IAED,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,CAAC;IACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,KAAsB,EAAW,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;AAE3F,MAAM,uBAAuB,GAAG,CAC5B,KAAsB,EACtB,KAAe,EACf,QAA4C,EACxC,EAAE;IACN,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEvD,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,OAAO;IACX,CAAC;IAED,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAE7B,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACvC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,KAAK,EAAE,KAAsB,EAAiB,EAAE;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC9C,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE9B,OAAO;IACX,CAAC;IAED,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,oCAAoC,CAAC,CAAC;IACxE,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAE7B,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;QACvC,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC/D,KAAK,CAAC,+EAA+E,EAAE,MAAM,CAAC,CAAC;QAC/F,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzB,OAAO;IACX,CAAC;IAED,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;QAE3B,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;IAE5B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzB,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;IAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxB,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;QAC3B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,KAAkB,EAAE,QAAgC,EAAW,EAAE;IAC9G,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE;IAC1C,IAAI,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAuC,EAAE;IAC7E,IAAI,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAElC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM;QACV,CAAC;QAED,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3B,SAAS,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAe,EAAe,EAAE,CAClD,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;IAC3B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAErD,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC,CAAC;AAER,MAAM,cAAc,GAAG,CAAC,IAAY,EAAiB,EAAE;IACnD,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QAErE,OAAO,IAAI,KAAK,SAAS;YACrB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAe,EAA8B,EAAE,CACvE,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAElF,MAAM,mBAAmB,GAAG,CACxB,QAA4C,EAC5C,KAAe,EACR,EAAE;IACT,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,KAAe,EAA4B,EAAE;IAC7E,MAAM,gBAAgB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACnE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CACzB,KAAsB,EACtB,SAAiB,EACjB,KAAkB,EACd,EAAE;IACN,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACpD,IAAI,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC1C,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,KAAK,CAAC,kCAAkC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,kCAAkC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,KAAsB,EAAQ,EAAE;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;IACX,CAAC;IAED,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,0BAA0B,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACnD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAsB,EAAE,MAAsB,EAAiB,EAAE,CACvF,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;IAC1B,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACrC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;QAEV,OAAO;IACX,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAC1B,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEP,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACrD,uBAAuB,CAAC;QACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC;QACrD,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7C,gBAAgB,EAAE,qBAAqB;QACvC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;KACxG,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAA6B,EAAkB,EAAE;IAC7E,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAE3F,MAAM,KAAK,GAAoB;QAC3B,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC;QACzC,SAAS;QACT,UAAU;QACV,GAAG;QACH,IAAI;QACJ,KAAK;QACL,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC9B,IAAI;QACJ,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,KAAK;QACrB,YAAY,EAAE,KAAK;QACnB,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,SAAS;KAC/B,CAAC;IAEF,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7B,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,CAAC,CAAC;IAEd,OAAO,IAAI,OAAO,CAAQ,GAAS,EAAE,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,OAAO,EACH,iBAAiB,EACjB,gBAAgB,GAEnB,CAAC","sourcesContent":["import { error, exitCodeForSignal, info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { fork as nodeFork } from \"node:child_process\";\nimport { type FSWatcher, statSync, watch as watchFs } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from \"./entry-env.js\";\n\ntype SupervisedChild = {\n killed: boolean;\n pid?: number | undefined;\n exitCode: number | null;\n kill(signal?: number | NodeJS.Signals): boolean;\n on(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n once(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n};\n\ntype ForkRunner = (modulePath: string, args: string[], env: NodeJS.ProcessEnv, cwd: string) => SupervisedChild;\n\ntype DevWatch = {\n paths: string[];\n resolvePaths: () => string[];\n regenerate: () => Promise<string[]>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n configFile: string;\n cwd: string;\n args: string[];\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n restartTimer: DebounceTimer;\n fork: ForkRunner;\n child: SupervisedChild | null;\n isShuttingDown: boolean;\n isRestarting: boolean;\n isRestartPending: boolean;\n capturedChildExit: number | undefined;\n};\n\ntype DevSupervisorOptions = {\n entryPath: string;\n configFile: string;\n cwd: string;\n args?: string[] | undefined;\n watch?: DevWatch | undefined;\n fork?: ForkRunner | undefined;\n};\n\ntype DebounceTimer = { handle: NodeJS.Timeout | null };\n\nconst DEV_RUNNER_URL = new URL(\"../../bin/gtkx-dev-runner.js\", import.meta.url);\nconst FORCE_KILL_TIMEOUT_MS = 5000;\nconst CONFIG_DEBOUNCE_MS = 150;\nconst RESTART_EXIT_CODE = 75;\nconst CONDITION_FLAG = /^(?:--conditions|-C)(?:=.*)?$/;\nconst SPLIT_CONDITION_FLAG = /^(?:--conditions|-C)$/;\n\nconst withoutConditions = (argv: string[]): string[] =>\n argv.filter(\n (argument, index) => !CONDITION_FLAG.test(argument) && !SPLIT_CONDITION_FLAG.test(argv[index - 1] ?? \"\"),\n );\n\nconst getNodeOptions = (env: NodeJS.ProcessEnv): string | undefined => {\n const options = env.NODE_OPTIONS;\n\n return options === undefined ? undefined : withoutConditions(options.split(/\\s+/)).join(\" \");\n};\n\nconst defaultForkRunner: ForkRunner = (modulePath, args, env, cwd) => {\n const nodeOptions = getNodeOptions(env);\n\n return nodeFork(modulePath, args, {\n cwd,\n env: { ...env, ...(nodeOptions !== undefined && { NODE_OPTIONS: nodeOptions }) },\n stdio: \"inherit\",\n detached: true,\n execArgv: withoutConditions(process.execArgv),\n });\n};\n\nconst forwardSignal = (child: SupervisedChild, signal: NodeJS.Signals): void => {\n if (!child.killed) {\n child.kill(signal);\n }\n};\n\nconst didForceKillChild = (child: SupervisedChild | null): boolean => {\n if (!child?.pid || child.exitCode !== null || child.killed) {\n return false;\n }\n\n try {\n return process.kill(child.pid, \"SIGKILL\");\n } catch {\n return false;\n }\n};\n\nconst captureShutdownExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n if (code !== null) {\n state.capturedChildExit = code;\n } else if (signal) {\n state.capturedChildExit = exitCodeForSignal(signal);\n }\n};\n\nconst handleChildExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n state.child = null;\n\n if (state.isRestarting) {\n return;\n }\n\n if (state.isShuttingDown) {\n captureShutdownExit(state, code, signal);\n\n return;\n }\n\n if (code === RESTART_EXIT_CODE) {\n info(\"Restarting dev runner...\");\n launch(state);\n\n return;\n }\n\n process.exit(code ?? exitCodeForSignal(signal));\n};\n\nconst launch = (state: SupervisorState): void => {\n const child = state.fork(\n state.runnerPath,\n state.args,\n { ...process.env, [DEV_CONFIG_ENV]: state.configFile, [DEV_ENTRY_ENV]: state.entryPath },\n state.cwd,\n );\n\n state.child = child;\n\n child.on(\"exit\", (code, signal) => {\n handleChildExit(state, code, signal);\n });\n};\n\nconst runPendingRestart = (state: SupervisorState): void => {\n state.isRestarting = false;\n\n if (!state.isRestartPending || state.isShuttingDown) {\n return;\n }\n\n state.isRestartPending = false;\n void restart(state);\n};\n\nconst relaunchAfterExit = (state: SupervisorState): void => {\n if (state.isShuttingDown) {\n state.isRestarting = false;\n\n return;\n }\n\n info(\"Restarting dev runner...\");\n launch(state);\n runPendingRestart(state);\n};\n\nconst isSupervisorShuttingDown = (state: SupervisorState): boolean => state.isShuttingDown;\n\nconst reconcileConfigWatchers = (\n state: SupervisorState,\n paths: string[],\n previous: ReadonlyMap<string, string | null>,\n): void => {\n const didChange = didWatchPathsChange(previous, paths);\n\n closeWatchers(state);\n\n if (state.watch !== undefined) {\n state.watch.paths = paths;\n }\n\n if (state.isShuttingDown) {\n return;\n }\n\n installConfigWatchers(state);\n\n if (didChange && !state.isRestartPending) {\n scheduleRestart(state);\n }\n};\n\nconst restart = async (state: SupervisorState): Promise<void> => {\n const watch = state.watch;\n\n if (watch === undefined || state.isShuttingDown) {\n return;\n }\n\n if (state.isRestarting) {\n state.isRestartPending = true;\n\n return;\n }\n\n state.isRestarting = true;\n info(`${basename(state.configFile)} changed; regenerating bindings...`);\n closeWatchers(state);\n watch.paths = watch.resolvePaths();\n const previous = snapshotWatchPaths(watch.paths);\n installConfigWatchers(state);\n\n try {\n const paths = await watch.regenerate();\n reconcileConfigWatchers(state, paths, previous);\n } catch (error_) {\n reconcileConfigWatchers(state, watch.resolvePaths(), previous);\n error(\"Codegen failed; keeping the current dev runner. Fix the error and save again.\", error_);\n runPendingRestart(state);\n\n return;\n }\n\n if (isSupervisorShuttingDown(state)) {\n state.isRestarting = false;\n\n return;\n }\n\n const current = state.child;\n\n if (current === null) {\n launch(state);\n runPendingRestart(state);\n\n return;\n }\n\n current.once(\"exit\", () => {\n relaunchAfterExit(state);\n });\n\n forwardSignal(current, \"SIGTERM\");\n};\n\nconst scheduleRestart = (state: SupervisorState): void => {\n const timer = state.restartTimer;\n\n if (timer.handle !== null) {\n clearTimeout(timer.handle);\n }\n\n timer.handle = setTimeout(() => {\n timer.handle = null;\n void restart(state);\n }, CONFIG_DEBOUNCE_MS);\n};\n\nconst isWatchedChange = (state: SupervisorState, names: Set<string>, filename: string | Buffer | null): boolean => {\n if (filename === null || state.isShuttingDown) {\n return false;\n }\n\n return names.has(basename(filename.toString()));\n};\n\nconst isDirectory = (path: string): boolean => {\n try {\n return statSync(path, { throwIfNoEntry: false })?.isDirectory() === true;\n } catch {\n return false;\n }\n};\n\nconst nearestWatchTarget = (path: string): { directory: string; name: string } => {\n let directory = dirname(path);\n let name = basename(path);\n\n while (!isDirectory(directory)) {\n const parent = dirname(directory);\n\n if (parent === directory) {\n break;\n }\n\n name = basename(directory);\n directory = parent;\n }\n\n return { directory, name };\n};\n\nconst watchTargets = (paths: string[]): Set<string> =>\n new Set(paths.flatMap((path) => {\n const { directory, name } = nearestWatchTarget(path);\n\n return [path, join(directory, name)];\n }));\n\nconst watchPathState = (path: string): string | null => {\n try {\n const stat = statSync(path, { bigint: true, throwIfNoEntry: false });\n\n return stat === undefined\n ? null\n : [stat.dev, stat.ino, stat.mode, stat.size, stat.mtimeNs, stat.ctimeNs].join(\":\");\n } catch {\n return null;\n }\n};\n\nconst snapshotWatchPaths = (paths: string[]): Map<string, string | null> =>\n new Map([...watchTargets(paths)].map((path) => [path, watchPathState(path)]));\n\nconst didWatchPathsChange = (\n previous: ReadonlyMap<string, string | null>,\n paths: string[],\n): boolean => {\n for (const path of watchTargets(paths)) {\n const current = watchPathState(path);\n\n if (previous.has(path) ? previous.get(path) !== current : current !== null) {\n return true;\n }\n }\n\n return false;\n};\n\nconst groupWatchNamesByDirectory = (paths: string[]): Map<string, Set<string>> => {\n const namesByDirectory: Map<string, Set<string>> = new Map();\n\n for (const path of paths) {\n const { directory, name } = nearestWatchTarget(path);\n const names = namesByDirectory.get(directory) ?? new Set<string>();\n names.add(name);\n namesByDirectory.set(directory, names);\n }\n\n return namesByDirectory;\n};\n\nconst watchConfigDirectory = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n): void => {\n try {\n const watcher = watchFs(directory, (_event, filename) => {\n if (isWatchedChange(state, names, filename)) {\n scheduleRestart(state);\n }\n });\n\n watcher.on(\"error\", (cause) => {\n error(`Configuration watch failed for ${directory}`, cause);\n });\n state.watchers.push(watcher);\n } catch (error_) {\n error(`Configuration watch failed for ${directory}`, error_);\n }\n};\n\nconst installConfigWatchers = (state: SupervisorState): void => {\n const watch = state.watch;\n\n if (watch === undefined || watch.paths.length === 0) {\n return;\n }\n\n for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {\n watchConfigDirectory(state, directory, names);\n }\n};\n\nconst closeWatchers = (state: SupervisorState): void => {\n for (const watcher of state.watchers) {\n watcher.close();\n }\n\n state.watchers = [];\n};\n\nconst shutdownOnSignal = (state: SupervisorState, signal: NodeJS.Signals): Promise<void> =>\n new Promise<void>((resolve) => {\n state.isShuttingDown = true;\n closeWatchers(state);\n\n if (state.restartTimer.handle !== null) {\n clearTimeout(state.restartTimer.handle);\n state.restartTimer.handle = null;\n }\n\n if (!state.child) {\n resolve();\n\n return;\n }\n\n state.child.once(\"exit\", () => {\n resolve();\n });\n\n forwardSignal(state.child, signal);\n });\n\nconst installShutdown = (state: SupervisorState): void => {\n installGracefulShutdown({\n onSignal: (signal) => shutdownOnSignal(state, signal),\n onForce: () => didForceKillChild(state.child),\n forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,\n exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),\n });\n};\n\nconst runDevSupervisor = async (options: DevSupervisorOptions): Promise<never> => {\n const { entryPath, configFile, cwd, args = [], watch, fork = defaultForkRunner } = options;\n\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n configFile,\n cwd,\n args,\n watch,\n watchers: [],\n restartTimer: { handle: null },\n fork,\n child: null,\n isShuttingDown: false,\n isRestarting: false,\n isRestartPending: false,\n capturedChildExit: undefined,\n };\n\n installConfigWatchers(state);\n installShutdown(state);\n launch(state);\n\n return new Promise<never>((): void => undefined);\n};\n\nexport {\n RESTART_EXIT_CODE,\n runDevSupervisor,\n type DevWatch,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"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","sourcesContent":["import { error, exitCodeForSignal, info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { fork as nodeFork } from \"node:child_process\";\nimport { type FSWatcher, statSync, watch as watchFs } from \"node:fs\";\nimport { basename, dirname, join, relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from \"./entry-env.js\";\n\ntype SupervisedChild = {\n killed: boolean;\n pid?: number | undefined;\n exitCode: number | null;\n kill(signal?: number | NodeJS.Signals): boolean;\n on(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n once(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n};\n\ntype ForkRunner = (modulePath: string, args: string[], env: NodeJS.ProcessEnv, cwd: string) => SupervisedChild;\n\ntype DevWatch = {\n paths: string[];\n resolvePaths: () => string[];\n regenerate: () => Promise<string[]>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n configFile: string;\n cwd: string;\n args: string[];\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n changedPaths: Set<string>;\n restartTimer: DebounceTimer;\n fork: ForkRunner;\n child: SupervisedChild | null;\n isShuttingDown: boolean;\n isRestarting: boolean;\n isRestartPending: boolean;\n capturedChildExit: number | undefined;\n};\n\ntype DevSupervisorOptions = {\n entryPath: string;\n configFile: string;\n cwd: string;\n args?: string[] | undefined;\n watch?: DevWatch | undefined;\n fork?: ForkRunner | undefined;\n};\n\ntype DebounceTimer = { handle: NodeJS.Timeout | null };\n\nconst DEV_RUNNER_URL = new URL(\"../../bin/gtkx-dev-runner.js\", import.meta.url);\nconst FORCE_KILL_TIMEOUT_MS = 5000;\nconst CONFIG_DEBOUNCE_MS = 150;\nconst RESTART_EXIT_CODE = 75;\nconst CONDITION_FLAG = /^(?:--conditions|-C)(?:=.*)?$/;\nconst SPLIT_CONDITION_FLAG = /^(?:--conditions|-C)$/;\n\nconst withoutConditions = (argv: string[]): string[] =>\n argv.filter(\n (argument, index) => !CONDITION_FLAG.test(argument) && !SPLIT_CONDITION_FLAG.test(argv[index - 1] ?? \"\"),\n );\n\nconst getNodeOptions = (env: NodeJS.ProcessEnv): string | undefined => {\n const options = env.NODE_OPTIONS;\n\n return options === undefined ? undefined : withoutConditions(options.split(/\\s+/)).join(\" \");\n};\n\nconst defaultForkRunner: ForkRunner = (modulePath, args, env, cwd) => {\n const nodeOptions = getNodeOptions(env);\n\n return nodeFork(modulePath, args, {\n cwd,\n env: { ...env, ...(nodeOptions !== undefined && { NODE_OPTIONS: nodeOptions }) },\n stdio: \"inherit\",\n detached: true,\n execArgv: withoutConditions(process.execArgv),\n });\n};\n\nconst forwardSignal = (child: SupervisedChild, signal: NodeJS.Signals): void => {\n if (!child.killed) {\n child.kill(signal);\n }\n};\n\nconst didForceKillChild = (child: SupervisedChild | null): boolean => {\n if (!child?.pid || child.exitCode !== null || child.killed) {\n return false;\n }\n\n try {\n return process.kill(child.pid, \"SIGKILL\");\n } catch {\n return false;\n }\n};\n\nconst captureShutdownExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n if (code !== null) {\n state.capturedChildExit = code;\n } else if (signal) {\n state.capturedChildExit = exitCodeForSignal(signal);\n }\n};\n\nconst handleChildExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n state.child = null;\n\n if (state.isRestarting) {\n return;\n }\n\n if (state.isShuttingDown) {\n captureShutdownExit(state, code, signal);\n\n return;\n }\n\n if (code === RESTART_EXIT_CODE) {\n info(\"Restarting dev runner...\");\n launch(state);\n\n return;\n }\n\n process.exit(code ?? exitCodeForSignal(signal));\n};\n\nconst launch = (state: SupervisorState): void => {\n const child = state.fork(\n state.runnerPath,\n state.args,\n { ...process.env, [DEV_CONFIG_ENV]: state.configFile, [DEV_ENTRY_ENV]: state.entryPath },\n state.cwd,\n );\n\n state.child = child;\n\n child.on(\"exit\", (code, signal) => {\n handleChildExit(state, code, signal);\n });\n};\n\nconst runPendingRestart = (state: SupervisorState): void => {\n state.isRestarting = false;\n\n if (!state.isRestartPending || state.isShuttingDown) {\n return;\n }\n\n state.isRestartPending = false;\n void restart(state);\n};\n\nconst relaunchAfterExit = (state: SupervisorState): void => {\n if (state.isShuttingDown) {\n state.isRestarting = false;\n\n return;\n }\n\n info(\"Restarting dev runner...\");\n launch(state);\n runPendingRestart(state);\n};\n\nconst isSupervisorShuttingDown = (state: SupervisorState): boolean => state.isShuttingDown;\n\nconst reconcileConfigWatchers = (\n state: SupervisorState,\n paths: string[],\n previous: ReadonlyMap<string, string | null>,\n): void => {\n const changed = changedWatchPaths(previous, paths);\n\n closeWatchers(state);\n\n if (state.watch !== undefined) {\n state.watch.paths = paths;\n }\n\n if (state.isShuttingDown) {\n return;\n }\n\n installConfigWatchers(state);\n\n if (changed.length > 0 && !state.isRestartPending) {\n scheduleRestart(state, changed);\n }\n};\n\nconst consumeChangedPaths = (state: SupervisorState): string => {\n const changed = [...state.changedPaths].map((path) => relative(state.cwd, path));\n state.changedPaths.clear();\n\n return changed.length === 0 ? basename(state.configFile) : changed.join(\", \");\n};\n\nconst restart = async (state: SupervisorState): Promise<void> => {\n const watch = state.watch;\n\n if (watch === undefined || state.isShuttingDown) {\n return;\n }\n\n if (state.isRestarting) {\n state.isRestartPending = true;\n\n return;\n }\n\n state.isRestarting = true;\n info(`${consumeChangedPaths(state)} changed; regenerating bindings...`);\n closeWatchers(state);\n watch.paths = watch.resolvePaths();\n const previous = snapshotWatchPaths(watch.paths);\n installConfigWatchers(state);\n\n try {\n const paths = await watch.regenerate();\n reconcileConfigWatchers(state, paths, previous);\n } catch (error_) {\n reconcileConfigWatchers(state, watch.resolvePaths(), previous);\n error(\"Codegen failed; keeping the current dev runner. Fix the error and save again.\", error_);\n runPendingRestart(state);\n\n return;\n }\n\n if (isSupervisorShuttingDown(state)) {\n state.isRestarting = false;\n\n return;\n }\n\n const current = state.child;\n\n if (current === null) {\n launch(state);\n runPendingRestart(state);\n\n return;\n }\n\n current.once(\"exit\", () => {\n relaunchAfterExit(state);\n });\n\n forwardSignal(current, \"SIGTERM\");\n};\n\nconst scheduleRestart = (state: SupervisorState, changedPaths: string[] = []): void => {\n const timer = state.restartTimer;\n\n for (const path of changedPaths) {\n state.changedPaths.add(path);\n }\n\n if (timer.handle !== null) {\n clearTimeout(timer.handle);\n }\n\n timer.handle = setTimeout(() => {\n timer.handle = null;\n void restart(state);\n }, CONFIG_DEBOUNCE_MS);\n};\n\nconst watchedChangePath = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n filename: string | Buffer | null,\n): string | undefined => {\n if (filename === null || state.isShuttingDown) {\n return undefined;\n }\n\n const name = basename(filename.toString());\n\n return names.has(name) ? join(directory, name) : undefined;\n};\n\nconst isDirectory = (path: string): boolean => {\n try {\n return statSync(path, { throwIfNoEntry: false })?.isDirectory() === true;\n } catch {\n return false;\n }\n};\n\nconst nearestWatchTarget = (path: string): { directory: string; name: string } => {\n let directory = dirname(path);\n let name = basename(path);\n\n while (!isDirectory(directory)) {\n const parent = dirname(directory);\n\n if (parent === directory) {\n break;\n }\n\n name = basename(directory);\n directory = parent;\n }\n\n return { directory, name };\n};\n\nconst watchTargets = (paths: string[]): Set<string> =>\n new Set(paths.flatMap((path) => {\n const { directory, name } = nearestWatchTarget(path);\n\n return [path, join(directory, name)];\n }));\n\nconst watchPathState = (path: string): string | null => {\n try {\n const stat = statSync(path, { bigint: true, throwIfNoEntry: false });\n\n return stat === undefined\n ? null\n : [stat.dev, stat.ino, stat.mode, stat.size, stat.mtimeNs, stat.ctimeNs].join(\":\");\n } catch {\n return null;\n }\n};\n\nconst snapshotWatchPaths = (paths: string[]): Map<string, string | null> =>\n new Map([...watchTargets(paths)].map((path) => [path, watchPathState(path)]));\n\nconst changedWatchPaths = (\n previous: ReadonlyMap<string, string | null>,\n paths: string[],\n): string[] =>\n [...watchTargets(paths)].filter((path) => {\n const current = watchPathState(path);\n\n return previous.has(path) ? previous.get(path) !== current : current !== null;\n });\n\nconst groupWatchNamesByDirectory = (paths: string[]): Map<string, Set<string>> => {\n const namesByDirectory: Map<string, Set<string>> = new Map();\n\n for (const path of paths) {\n const { directory, name } = nearestWatchTarget(path);\n const names = namesByDirectory.get(directory) ?? new Set<string>();\n names.add(name);\n namesByDirectory.set(directory, names);\n }\n\n return namesByDirectory;\n};\n\nconst watchConfigDirectory = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n): void => {\n try {\n const watcher = watchFs(directory, (_event, filename) => {\n const changed = watchedChangePath(state, directory, names, filename);\n\n if (changed !== undefined) {\n scheduleRestart(state, [changed]);\n }\n });\n\n watcher.on(\"error\", (cause) => {\n error(`Configuration watch failed for ${directory}`, cause);\n });\n state.watchers.push(watcher);\n } catch (error_) {\n error(`Configuration watch failed for ${directory}`, error_);\n }\n};\n\nconst installConfigWatchers = (state: SupervisorState): void => {\n const watch = state.watch;\n\n if (watch === undefined || watch.paths.length === 0) {\n return;\n }\n\n for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {\n watchConfigDirectory(state, directory, names);\n }\n};\n\nconst closeWatchers = (state: SupervisorState): void => {\n for (const watcher of state.watchers) {\n watcher.close();\n }\n\n state.watchers = [];\n};\n\nconst shutdownOnSignal = (state: SupervisorState, signal: NodeJS.Signals): Promise<void> =>\n new Promise<void>((resolve) => {\n state.isShuttingDown = true;\n closeWatchers(state);\n\n if (state.restartTimer.handle !== null) {\n clearTimeout(state.restartTimer.handle);\n state.restartTimer.handle = null;\n }\n\n if (!state.child) {\n resolve();\n\n return;\n }\n\n state.child.once(\"exit\", () => {\n resolve();\n });\n\n forwardSignal(state.child, signal);\n });\n\nconst installShutdown = (state: SupervisorState): void => {\n installGracefulShutdown({\n onSignal: (signal) => shutdownOnSignal(state, signal),\n onForce: () => didForceKillChild(state.child),\n forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,\n exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),\n });\n};\n\nconst runDevSupervisor = async (options: DevSupervisorOptions): Promise<never> => {\n const { entryPath, configFile, cwd, args = [], watch, fork = defaultForkRunner } = options;\n\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n configFile,\n cwd,\n args,\n watch,\n watchers: [],\n changedPaths: new Set(),\n restartTimer: { handle: null },\n fork,\n child: null,\n isShuttingDown: false,\n isRestarting: false,\n isRestartPending: false,\n capturedChildExit: undefined,\n };\n\n installConfigWatchers(state);\n installShutdown(state);\n launch(state);\n\n return new Promise<never>((): void => undefined);\n};\n\nexport {\n RESTART_EXIT_CODE,\n runDevSupervisor,\n type DevWatch,\n};\n"]}
|
package/dist/i18n/catalogs.d.ts
CHANGED
|
@@ -11,11 +11,15 @@ type CatalogProject = {
|
|
|
11
11
|
poFiles: string[];
|
|
12
12
|
root: string;
|
|
13
13
|
};
|
|
14
|
+
type WrittenCatalog = {
|
|
15
|
+
content: Buffer;
|
|
16
|
+
path: string;
|
|
17
|
+
};
|
|
14
18
|
declare const LOCALE_DIRNAME = "locale";
|
|
15
19
|
declare const requiresCatalogInitialization: (project: CatalogProject) => boolean;
|
|
16
20
|
declare const resolveCatalogProject: (root: string, domain: string) => CatalogProject | null;
|
|
17
21
|
declare const compileCatalogs: (project: CatalogProject, outputDir: string) => string[];
|
|
18
|
-
declare const synchronizeCatalogs: (project: CatalogProject) =>
|
|
22
|
+
declare const synchronizeCatalogs: (project: CatalogProject) => WrittenCatalog[];
|
|
19
23
|
declare const isCatalogSource: (root: string, path: string) => boolean;
|
|
20
|
-
export { type CatalogProject, LOCALE_DIRNAME, compileCatalogs, isCatalogSource, requiresCatalogInitialization, resolveCatalogProject, synchronizeCatalogs, };
|
|
24
|
+
export { type CatalogProject, LOCALE_DIRNAME, compileCatalogs, isCatalogSource, requiresCatalogInitialization, resolveCatalogProject, synchronizeCatalogs, type WrittenCatalog, };
|
|
21
25
|
//# sourceMappingURL=catalogs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogs.d.ts","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"AAcA,KAAK,OAAO,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AASF,QAAA,MAAM,cAAc,WAAW,CAAC;AAiChC,QAAA,MAAM,6BAA6B,GAAI,SAAS,cAAc,KAAG,OACA,CAAC;AAElE,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,cAAc,GAAG,IA8B9E,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,SAAS,cAAc,EAAE,WAAW,MAAM,KAAG,MAAM,EAmB3E,CAAC;
|
|
1
|
+
{"version":3,"file":"catalogs.d.ts","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"AAcA,KAAK,OAAO,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AASF,KAAK,cAAc,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,QAAA,MAAM,cAAc,WAAW,CAAC;AAiChC,QAAA,MAAM,6BAA6B,GAAI,SAAS,cAAc,KAAG,OACA,CAAC;AAElE,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,cAAc,GAAG,IA8B9E,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,SAAS,cAAc,EAAE,WAAW,MAAM,KAAG,MAAM,EAmB3E,CAAC;AA4DF,QAAA,MAAM,mBAAmB,GAAI,SAAS,cAAc,KAAG,cAAc,EAiBpE,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,OAUrD,CAAC;AAEF,OAAO,EACH,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,eAAe,EACf,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,GACtB,CAAC"}
|
package/dist/i18n/catalogs.js
CHANGED
|
@@ -103,26 +103,28 @@ const prepareCatalog = (catalog, index, template, stagingDir) => {
|
|
|
103
103
|
else {
|
|
104
104
|
initializeCatalog(catalog, template, output);
|
|
105
105
|
}
|
|
106
|
+
const content = readFileSync(output);
|
|
106
107
|
return {
|
|
107
|
-
|
|
108
|
+
content,
|
|
109
|
+
isChanged: !isExisting || !content.equals(readFileSync(catalog.path)),
|
|
108
110
|
output,
|
|
109
111
|
target: catalog.path,
|
|
110
112
|
};
|
|
111
113
|
};
|
|
114
|
+
const replaceCatalog = (catalog) => {
|
|
115
|
+
renameSync(catalog.output, catalog.target);
|
|
116
|
+
return { content: catalog.content, path: catalog.target };
|
|
117
|
+
};
|
|
112
118
|
const synchronizeCatalogs = (project) => {
|
|
113
119
|
if (project.catalogs.length === 0) {
|
|
114
|
-
return;
|
|
120
|
+
return [];
|
|
115
121
|
}
|
|
116
122
|
const template = join(project.poDir, `${project.domain}.pot`);
|
|
117
123
|
requireFile(template);
|
|
118
124
|
const stagingDir = mkdtempSync(join(project.poDir, ".gtkx-catalog-"));
|
|
119
125
|
try {
|
|
120
126
|
const merged = project.catalogs.map((catalog, index) => prepareCatalog(catalog, index, template, stagingDir));
|
|
121
|
-
|
|
122
|
-
if (catalog.isChanged) {
|
|
123
|
-
renameSync(catalog.output, catalog.target);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
127
|
+
return merged.filter((catalog) => catalog.isChanged).map((catalog) => replaceCatalog(catalog));
|
|
126
128
|
}
|
|
127
129
|
finally {
|
|
128
130
|
rmSync(stagingDir, { recursive: true, force: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogs.js","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPathInside } from \"@gtkx/utils\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\n\ntype Catalog = {\n locale: string;\n path: string;\n};\n\ntype CatalogProject = {\n catalogs: Catalog[];\n domain: string;\n linguasPath: string;\n locales: string[];\n poDir: string;\n poFiles: string[];\n root: string;\n};\n\ntype PreparedCatalog = {\n isChanged: boolean;\n output: string;\n target: string;\n};\n\nconst PO_DIRNAME = \"po\";\nconst LOCALE_DIRNAME = \"locale\";\nconst LINGUAS_FILENAME = \"LINGUAS\";\nconst LOCALE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.@+-]*$/;\nconst DOMAIN_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst MODE_MASK = 0o7777;\n\nconst parseLocales = (linguasPath: string): string[] => {\n const source = readFileSync(linguasPath, \"utf8\");\n\n const tokens = source\n .split(/\\r?\\n/)\n .flatMap((line) => line.replace(/#.*/, \"\").trim().split(/\\s+/))\n .filter((token) => token.length > 0);\n\n const seen: Set<string> = new Set();\n\n for (const token of tokens) {\n if (!LOCALE_PATTERN.test(token) || seen.has(token)) {\n throw new Error(`Invalid locale in ${linguasPath}: ${token}`);\n }\n\n seen.add(token);\n }\n\n return tokens;\n};\n\nconst requireFile = (path: string): void => {\n if (!existsSync(path) || !statSync(path).isFile()) {\n throw new Error(`Missing translation catalog: ${path}`);\n }\n};\n\nconst requiresCatalogInitialization = (project: CatalogProject): boolean =>\n project.catalogs.some((catalog) => !existsSync(catalog.path));\n\nconst resolveCatalogProject = (root: string, domain: string): CatalogProject | null => {\n const projectRoot = resolve(root);\n const poDir = join(projectRoot, PO_DIRNAME);\n\n if (!existsSync(poDir)) {\n return null;\n }\n\n if (!statSync(poDir).isDirectory()) {\n throw new Error(`Translation source is not a directory: ${poDir}`);\n }\n\n if (!DOMAIN_PATTERN.test(domain)) {\n throw new Error(`Invalid translation domain: ${domain}`);\n }\n\n const linguasPath = join(poDir, LINGUAS_FILENAME);\n requireFile(linguasPath);\n const locales = parseLocales(linguasPath);\n const catalogs = locales.map((locale) => ({ locale, path: join(poDir, `${locale}.po`) }));\n\n return {\n catalogs,\n domain,\n linguasPath,\n locales,\n poDir,\n poFiles: catalogs.map((catalog) => catalog.path),\n root: projectRoot,\n };\n};\n\nconst compileCatalogs = (project: CatalogProject, outputDir: string): string[] => {\n const localeDir = resolve(outputDir);\n\n for (const catalog of project.catalogs) {\n requireFile(catalog.path);\n }\n\n return project.catalogs.map((catalog) => {\n const output = join(localeDir, catalog.locale, \"LC_MESSAGES\", `${project.domain}.mo`);\n mkdirSync(dirname(output), { recursive: true });\n\n runCliTool({\n tool: \"msgfmt\",\n args: [\"--check\", \"--output-file\", output, catalog.path],\n target: catalog.path,\n });\n\n return output;\n });\n};\n\nconst initializeCatalog = (catalog: Catalog, template: string, output: string): void => {\n runCliTool({\n tool: \"msginit\",\n args: [\n \"--no-translator\",\n \"--no-wrap\",\n `--locale=${catalog.locale}`,\n `--input=${template}`,\n `--output-file=${output}`,\n ],\n options: { stdio: \"pipe\" },\n target: catalog.path,\n });\n};\n\nconst mergeCatalog = (catalog: Catalog, template: string, output: string): void => {\n requireFile(catalog.path);\n\n runCliTool({\n tool: \"msgmerge\",\n args: [\"--quiet\", \"--no-wrap\", `--output-file=${output}`, catalog.path, template],\n target: catalog.path,\n });\n\n chmodSync(output, statSync(catalog.path).mode & MODE_MASK);\n};\n\nconst prepareCatalog = (\n catalog: Catalog,\n index: number,\n template: string,\n stagingDir: string,\n): PreparedCatalog => {\n const output = join(stagingDir, `${String(index)}.po`);\n const isExisting = existsSync(catalog.path);\n\n if (isExisting) {\n mergeCatalog(catalog, template, output);\n } else {\n initializeCatalog(catalog, template, output);\n }\n\n return {\n isChanged: !isExisting || !readFileSync(output).equals(readFileSync(catalog.path)),\n output,\n target: catalog.path,\n };\n};\n\nconst synchronizeCatalogs = (project: CatalogProject): void => {\n if (project.catalogs.length === 0) {\n return;\n }\n\n const template = join(project.poDir, `${project.domain}.pot`);\n requireFile(template);\n const stagingDir = mkdtempSync(join(project.poDir, \".gtkx-catalog-\"));\n\n try {\n const merged = project.catalogs.map((catalog, index) =>\n prepareCatalog(catalog, index, template, stagingDir));\n\n for (const catalog of merged) {\n if (catalog.isChanged) {\n renameSync(catalog.output, catalog.target);\n }\n }\n } finally {\n rmSync(stagingDir, { recursive: true, force: true });\n }\n};\n\nconst isCatalogSource = (root: string, path: string): boolean => {\n const projectRoot = resolve(root);\n const sourcePath = isAbsolute(path) ? resolve(path) : resolve(projectRoot, path);\n const poPath = relative(join(projectRoot, PO_DIRNAME), sourcePath);\n\n if (!isPathInside(join(projectRoot, PO_DIRNAME), sourcePath)) {\n return false;\n }\n\n return !poPath.includes(sep) && (poPath === LINGUAS_FILENAME || poPath.endsWith(\".po\"));\n};\n\nexport {\n type CatalogProject,\n LOCALE_DIRNAME,\n compileCatalogs,\n isCatalogSource,\n requiresCatalogInitialization,\n resolveCatalogProject,\n synchronizeCatalogs,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"catalogs.js","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPathInside } from \"@gtkx/utils\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\n\ntype Catalog = {\n locale: string;\n path: string;\n};\n\ntype CatalogProject = {\n catalogs: Catalog[];\n domain: string;\n linguasPath: string;\n locales: string[];\n poDir: string;\n poFiles: string[];\n root: string;\n};\n\ntype PreparedCatalog = {\n content: Buffer;\n isChanged: boolean;\n output: string;\n target: string;\n};\n\ntype WrittenCatalog = {\n content: Buffer;\n path: string;\n};\n\nconst PO_DIRNAME = \"po\";\nconst LOCALE_DIRNAME = \"locale\";\nconst LINGUAS_FILENAME = \"LINGUAS\";\nconst LOCALE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.@+-]*$/;\nconst DOMAIN_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst MODE_MASK = 0o7777;\n\nconst parseLocales = (linguasPath: string): string[] => {\n const source = readFileSync(linguasPath, \"utf8\");\n\n const tokens = source\n .split(/\\r?\\n/)\n .flatMap((line) => line.replace(/#.*/, \"\").trim().split(/\\s+/))\n .filter((token) => token.length > 0);\n\n const seen: Set<string> = new Set();\n\n for (const token of tokens) {\n if (!LOCALE_PATTERN.test(token) || seen.has(token)) {\n throw new Error(`Invalid locale in ${linguasPath}: ${token}`);\n }\n\n seen.add(token);\n }\n\n return tokens;\n};\n\nconst requireFile = (path: string): void => {\n if (!existsSync(path) || !statSync(path).isFile()) {\n throw new Error(`Missing translation catalog: ${path}`);\n }\n};\n\nconst requiresCatalogInitialization = (project: CatalogProject): boolean =>\n project.catalogs.some((catalog) => !existsSync(catalog.path));\n\nconst resolveCatalogProject = (root: string, domain: string): CatalogProject | null => {\n const projectRoot = resolve(root);\n const poDir = join(projectRoot, PO_DIRNAME);\n\n if (!existsSync(poDir)) {\n return null;\n }\n\n if (!statSync(poDir).isDirectory()) {\n throw new Error(`Translation source is not a directory: ${poDir}`);\n }\n\n if (!DOMAIN_PATTERN.test(domain)) {\n throw new Error(`Invalid translation domain: ${domain}`);\n }\n\n const linguasPath = join(poDir, LINGUAS_FILENAME);\n requireFile(linguasPath);\n const locales = parseLocales(linguasPath);\n const catalogs = locales.map((locale) => ({ locale, path: join(poDir, `${locale}.po`) }));\n\n return {\n catalogs,\n domain,\n linguasPath,\n locales,\n poDir,\n poFiles: catalogs.map((catalog) => catalog.path),\n root: projectRoot,\n };\n};\n\nconst compileCatalogs = (project: CatalogProject, outputDir: string): string[] => {\n const localeDir = resolve(outputDir);\n\n for (const catalog of project.catalogs) {\n requireFile(catalog.path);\n }\n\n return project.catalogs.map((catalog) => {\n const output = join(localeDir, catalog.locale, \"LC_MESSAGES\", `${project.domain}.mo`);\n mkdirSync(dirname(output), { recursive: true });\n\n runCliTool({\n tool: \"msgfmt\",\n args: [\"--check\", \"--output-file\", output, catalog.path],\n target: catalog.path,\n });\n\n return output;\n });\n};\n\nconst initializeCatalog = (catalog: Catalog, template: string, output: string): void => {\n runCliTool({\n tool: \"msginit\",\n args: [\n \"--no-translator\",\n \"--no-wrap\",\n `--locale=${catalog.locale}`,\n `--input=${template}`,\n `--output-file=${output}`,\n ],\n options: { stdio: \"pipe\" },\n target: catalog.path,\n });\n};\n\nconst mergeCatalog = (catalog: Catalog, template: string, output: string): void => {\n requireFile(catalog.path);\n\n runCliTool({\n tool: \"msgmerge\",\n args: [\"--quiet\", \"--no-wrap\", `--output-file=${output}`, catalog.path, template],\n target: catalog.path,\n });\n\n chmodSync(output, statSync(catalog.path).mode & MODE_MASK);\n};\n\nconst prepareCatalog = (\n catalog: Catalog,\n index: number,\n template: string,\n stagingDir: string,\n): PreparedCatalog => {\n const output = join(stagingDir, `${String(index)}.po`);\n const isExisting = existsSync(catalog.path);\n\n if (isExisting) {\n mergeCatalog(catalog, template, output);\n } else {\n initializeCatalog(catalog, template, output);\n }\n\n const content = readFileSync(output);\n\n return {\n content,\n isChanged: !isExisting || !content.equals(readFileSync(catalog.path)),\n output,\n target: catalog.path,\n };\n};\n\nconst replaceCatalog = (catalog: PreparedCatalog): WrittenCatalog => {\n renameSync(catalog.output, catalog.target);\n\n return { content: catalog.content, path: catalog.target };\n};\n\nconst synchronizeCatalogs = (project: CatalogProject): WrittenCatalog[] => {\n if (project.catalogs.length === 0) {\n return [];\n }\n\n const template = join(project.poDir, `${project.domain}.pot`);\n requireFile(template);\n const stagingDir = mkdtempSync(join(project.poDir, \".gtkx-catalog-\"));\n\n try {\n const merged = project.catalogs.map((catalog, index) =>\n prepareCatalog(catalog, index, template, stagingDir));\n\n return merged.filter((catalog) => catalog.isChanged).map((catalog) => replaceCatalog(catalog));\n } finally {\n rmSync(stagingDir, { recursive: true, force: true });\n }\n};\n\nconst isCatalogSource = (root: string, path: string): boolean => {\n const projectRoot = resolve(root);\n const sourcePath = isAbsolute(path) ? resolve(path) : resolve(projectRoot, path);\n const poPath = relative(join(projectRoot, PO_DIRNAME), sourcePath);\n\n if (!isPathInside(join(projectRoot, PO_DIRNAME), sourcePath)) {\n return false;\n }\n\n return !poPath.includes(sep) && (poPath === LINGUAS_FILENAME || poPath.endsWith(\".po\"));\n};\n\nexport {\n type CatalogProject,\n LOCALE_DIRNAME,\n compileCatalogs,\n isCatalogSource,\n requiresCatalogInitialization,\n resolveCatalogProject,\n synchronizeCatalogs,\n type WrittenCatalog,\n};\n"]}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import type { ConfigLoader } from "@gtkx/config";
|
|
2
2
|
import type { Plugin } from "vite";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { type WrittenCatalog } from "../i18n/catalogs.js";
|
|
4
|
+
type CatalogWriteListener = (catalogs: WrittenCatalog[]) => void;
|
|
5
|
+
type I18nPluginOptions = {
|
|
6
|
+
entryPath: string;
|
|
7
|
+
loadConfig?: ConfigLoader | undefined;
|
|
8
|
+
onCatalogsWritten?: CatalogWriteListener | undefined;
|
|
9
|
+
shouldPreserveMetadataMessages?: boolean | undefined;
|
|
10
|
+
shouldRecoverExtractionErrors?: boolean | undefined;
|
|
11
|
+
};
|
|
12
|
+
declare const gtkxI18n: ({ entryPath, loadConfig, onCatalogsWritten, shouldPreserveMetadataMessages, shouldRecoverExtractionErrors, }: I18nPluginOptions) => Plugin;
|
|
13
|
+
export { type CatalogWriteListener, gtkxI18n };
|
|
5
14
|
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AAMnD,OAAO,EAMH,KAAK,cAAc,EACtB,MAAM,qBAAqB,CAAC;AAM7B,KAAK,oBAAoB,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;AAEjE,KAAK,iBAAiB,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACtC,iBAAiB,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACrD,8BAA8B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrD,6BAA6B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACvD,CAAC;AA0KF,QAAA,MAAM,QAAQ,GAAI,8GAMf,iBAAiB,KAAG,MAmDtB,CAAC;AAEF,OAAO,EAAE,KAAK,oBAAoB,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -61,7 +61,7 @@ const extractProjectMessages = async (state, shouldPreserveMetadataMessages, sho
|
|
|
61
61
|
const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);
|
|
62
62
|
await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);
|
|
63
63
|
if (shouldSynchronizeCatalogs) {
|
|
64
|
-
synchronizeCatalogs(project);
|
|
64
|
+
state.onCatalogsWritten(synchronizeCatalogs(project));
|
|
65
65
|
}
|
|
66
66
|
await emitI18nTypes(project.root);
|
|
67
67
|
};
|
|
@@ -110,7 +110,7 @@ const recoverInitialSourceExtraction = async (state, shouldPreserveMetadataMessa
|
|
|
110
110
|
logger.error(error.message);
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
|
-
const gtkxI18n = (entryPath, loadConfig = createConfigLoader(), shouldPreserveMetadataMessages = true, shouldRecoverExtractionErrors = false) => {
|
|
113
|
+
const gtkxI18n = ({ entryPath, loadConfig = createConfigLoader(), onCatalogsWritten = () => undefined, shouldPreserveMetadataMessages = true, shouldRecoverExtractionErrors = false, }) => {
|
|
114
114
|
const state = {
|
|
115
115
|
entryPath,
|
|
116
116
|
extraction: Promise.resolve(),
|
|
@@ -118,6 +118,7 @@ const gtkxI18n = (entryPath, loadConfig = createConfigLoader(), shouldPreserveMe
|
|
|
118
118
|
i18nRoot: "",
|
|
119
119
|
outDir: "",
|
|
120
120
|
project: null,
|
|
121
|
+
onCatalogsWritten,
|
|
121
122
|
};
|
|
122
123
|
return {
|
|
123
124
|
name: "gtkx:i18n",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { isPathWithin, logger, toPosixPath } from \"@gtkx/utils\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, posix, relative, resolve } from \"node:path\";\nimport {\n type CatalogProject,\n compileCatalogs,\n LOCALE_DIRNAME,\n resolveCatalogProject,\n synchronizeCatalogs,\n} from \"../i18n/catalogs.js\";\nimport { extractSourceCatalog, SourceExtractionError } from \"../i18n/source-messages.js\";\nimport { emitI18nTypes } from \"../i18n/types.js\";\nimport { discoverSourceFiles, sourceLanguage } from \"../internal/source-imports.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype I18nState = {\n entryPath: string;\n i18nRoot: string;\n outDir: string;\n project: CatalogProject | null;\n extraction: Promise<void>;\n hotUpdateTimestamp: number | null;\n};\n\nconst BOOTSTRAP_SPECIFIER = \"@gtkx/i18n/bootstrap\";\nconst LOCALE_URL_PLACEHOLDER = \"__GTKX_BUNDLE_LOCALE_DIR__\";\nconst LOCALE_MODULE_PATHS = new Set([\"dist/locale.js\", \"src/locale.ts\"]);\nconst LOCALE_URL_PATTERN = /new URL\\(([\"'])locale\\1,\\s*import\\.meta\\.url\\)/;\n\nconst isI18nLocaleModule = (state: I18nState, id: string): boolean => {\n if (state.i18nRoot.length === 0) {\n return false;\n }\n\n const path = toPosixPath(relative(state.i18nRoot, stripQuery(id)));\n\n return LOCALE_MODULE_PATHS.has(path);\n};\n\nconst markLocaleUrl = (code: string): string =>\n code.replace(\n LOCALE_URL_PATTERN,\n () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`,\n );\n\nconst localeUrlForChunk = (fileName: string): string => {\n const path = posix.relative(posix.dirname(fileName), LOCALE_DIRNAME);\n\n return path.length === 0 ? \".\" : path;\n};\n\nconst rebaseLocaleUrl = (state: I18nState, code: string, fileName: string, moduleIds: string[]): string | null => {\n if (moduleIds.every((id) => !isI18nLocaleModule(state, id))) {\n return null;\n }\n\n const placeholder = JSON.stringify(LOCALE_URL_PLACEHOLDER);\n\n if (!code.includes(placeholder)) {\n throw new Error(`Unable to locate the @gtkx/i18n locale fallback in ${fileName}`);\n }\n\n return code.replace(placeholder, () => JSON.stringify(localeUrlForChunk(fileName)));\n};\n\nconst applyResolvedConfig = async (\n state: I18nState,\n config: ResolvedConfig,\n loadConfig: ConfigLoader,\n): Promise<void> => {\n state.entryPath = resolve(config.root, state.entryPath);\n state.outDir = resolve(config.root, config.build.outDir);\n const application = await loadConfig.resolve(config.root);\n state.project = resolveCatalogProject(config.root, application.applicationId);\n\n if (state.project !== null) {\n const projectRequire = createRequire(resolve(config.root, \"package.json\"));\n state.i18nRoot = dirname(projectRequire.resolve(\"@gtkx/i18n/package.json\"));\n }\n};\n\nconst buildCatalogs = (state: I18nState): void => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n mkdirSync(state.outDir, { recursive: true });\n compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));\n};\n\nconst extractProjectMessages = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n shouldSynchronizeCatalogs: boolean,\n): Promise<void> => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n const srcDir = join(project.root, \"src\");\n const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);\n await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);\n\n if (shouldSynchronizeCatalogs) {\n synchronizeCatalogs(project);\n }\n\n await emitI18nTypes(project.root);\n};\n\nconst settleExtraction = async (pending: Promise<void>): Promise<void> => {\n try {\n await pending;\n } catch {\n return;\n }\n};\n\nconst queueExtraction = (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n shouldSynchronizeCatalogs: boolean,\n): Promise<void> => {\n const prior = state.extraction;\n const pending = (async (): Promise<void> => {\n await settleExtraction(prior);\n await extractProjectMessages(\n state,\n shouldPreserveMetadataMessages,\n shouldSynchronizeCatalogs,\n );\n })();\n\n state.extraction = pending;\n\n return pending;\n};\n\nconst isProjectSource = (state: I18nState, path: string): boolean => {\n const project = state.project;\n\n if (project === null || sourceLanguage(path) === undefined) {\n return false;\n }\n\n const srcDir = join(project.root, \"src\");\n const sourceRoot = existsSync(srcDir) ? srcDir : project.root;\n\n return isPathWithin(sourceRoot, path);\n};\n\nconst refreshProjectMessages = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n shouldSynchronizeCatalogs = false,\n): Promise<void> => {\n try {\n await queueExtraction(state, shouldPreserveMetadataMessages, shouldSynchronizeCatalogs);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n }\n};\n\nconst recoverInitialSourceExtraction = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n): Promise<void> => {\n try {\n await queueExtraction(state, shouldPreserveMetadataMessages, true);\n } catch (error) {\n if (!(error instanceof SourceExtractionError)) {\n throw error;\n }\n\n logger.error(error.message);\n }\n};\n\nconst gtkxI18n = (\n entryPath: string,\n loadConfig: ConfigLoader = createConfigLoader(),\n shouldPreserveMetadataMessages = true,\n shouldRecoverExtractionErrors = false,\n): Plugin => {\n const state: I18nState = {\n entryPath,\n extraction: Promise.resolve(),\n hotUpdateTimestamp: null,\n i18nRoot: \"\",\n outDir: \"\",\n project: null,\n };\n\n return {\n name: \"gtkx:i18n\",\n enforce: \"pre\",\n\n configResolved: (config) => applyResolvedConfig(state, config, loadConfig),\n\n buildStart: () => shouldRecoverExtractionErrors\n ? recoverInitialSourceExtraction(state, shouldPreserveMetadataMessages)\n : queueExtraction(state, shouldPreserveMetadataMessages, true),\n\n hotUpdate(options) {\n if (!isProjectSource(state, options.file) || state.hotUpdateTimestamp === options.timestamp) {\n return;\n }\n\n state.hotUpdateTimestamp = options.timestamp;\n\n return refreshProjectMessages(state, shouldPreserveMetadataMessages);\n },\n\n transform(code, id) {\n if (isI18nLocaleModule(state, id)) {\n return markLocaleUrl(code);\n }\n\n if (state.project === null || resolve(stripQuery(id)) !== state.entryPath) {\n return;\n }\n\n return `import ${JSON.stringify(BOOTSTRAP_SPECIFIER)};\\n${code}`;\n },\n\n renderChunk(code, chunk) {\n return rebaseLocaleUrl(state, code, chunk.fileName, chunk.moduleIds);\n },\n\n generateBundle() {\n buildCatalogs(state);\n },\n };\n};\n\nexport { gtkxI18n };\n"]}
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAEH,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GAEtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAsB9C,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AACnD,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAC5D,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC;AACzE,MAAM,kBAAkB,GAAG,gDAAgD,CAAC;AAE5E,MAAM,kBAAkB,GAAG,CAAC,KAAgB,EAAE,EAAU,EAAW,EAAE;IACjE,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnE,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE,CAC3C,IAAI,CAAC,OAAO,CACR,kBAAkB,EAClB,GAAG,EAAE,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,oBAAoB,CAC9E,CAAC;AAEN,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IAErE,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAgB,EAAE,IAAY,EAAE,QAAgB,EAAE,SAAmB,EAAiB,EAAE;IAC7G,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAE3D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,sDAAsD,QAAQ,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAC7B,KAAgB,EAChB,MAAsB,EACtB,UAAwB,EACX,EAAE;IACf,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACxD,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1D,KAAK,CAAC,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IAE9E,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3E,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAChF,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAgB,EAAQ,EAAE;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE9B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO;IACX,CAAC;IAED,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,KAAK,EAChC,KAAgB,EAChB,8BAAuC,EACvC,yBAAkC,EACrB,EAAE;IACf,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE9B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,mBAAmB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,MAAM,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,8BAA8B,CAAC,CAAC;IAEjF,IAAI,yBAAyB,EAAE,CAAC;QAC5B,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAsB,EAAiB,EAAE;IACrE,IAAI,CAAC;QACD,MAAM,OAAO,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO;IACX,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,KAAgB,EAChB,8BAAuC,EACvC,yBAAkC,EACrB,EAAE;IACf,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;IAC/B,MAAM,OAAO,GAAG,CAAC,KAAK,IAAmB,EAAE;QACvC,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,sBAAsB,CACxB,KAAK,EACL,8BAA8B,EAC9B,yBAAyB,CAC5B,CAAC;IACN,CAAC,CAAC,EAAE,CAAC;IAEL,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC;IAE3B,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAgB,EAAE,IAAY,EAAW,EAAE;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE9B,IAAI,OAAO,KAAK,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAE9D,OAAO,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,KAAK,EAChC,KAAgB,EAChB,8BAAuC,EACvC,yBAAyB,GAAG,KAAK,EACpB,EAAE;IACf,IAAI,CAAC;QACD,MAAM,eAAe,CAAC,KAAK,EAAE,8BAA8B,EAAE,yBAAyB,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,KAAK,EACxC,KAAgB,EAChB,8BAAuC,EAC1B,EAAE;IACf,IAAI,CAAC;QACD,MAAM,eAAe,CAAC,KAAK,EAAE,8BAA8B,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,KAAK,YAAY,qBAAqB,CAAC,EAAE,CAAC;YAC5C,MAAM,KAAK,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,EACd,SAAS,EACT,UAAU,GAAG,kBAAkB,EAAE,EACjC,iBAAiB,GAAG,GAAS,EAAE,CAAC,SAAS,EACzC,8BAA8B,GAAG,IAAI,EACrC,6BAA6B,GAAG,KAAK,GACrB,EAAU,EAAE;IAC5B,MAAM,KAAK,GAAc;QACrB,SAAS;QACT,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE;QAC7B,kBAAkB,EAAE,IAAI;QACxB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,IAAI;QACb,iBAAiB;KACpB,CAAC;IAEF,OAAO;QACH,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,KAAK;QAEd,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC;QAE1E,UAAU,EAAE,GAAG,EAAE,CAAC,6BAA6B;YAC3C,CAAC,CAAC,8BAA8B,CAAC,KAAK,EAAE,8BAA8B,CAAC;YACvE,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,8BAA8B,EAAE,IAAI,CAAC;QAElE,SAAS,CAAC,OAAO;YACb,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,kBAAkB,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC1F,OAAO;YACX,CAAC;YAED,KAAK,CAAC,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;YAE7C,OAAO,sBAAsB,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;QACzE,CAAC;QAED,SAAS,CAAC,IAAI,EAAE,EAAE;YACd,IAAI,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;gBAChC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;gBACxE,OAAO;YACX,CAAC;YAED,OAAO,UAAU,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,IAAI,EAAE,CAAC;QACrE,CAAC;QAED,WAAW,CAAC,IAAI,EAAE,KAAK;YACnB,OAAO,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;QAED,cAAc;YACV,aAAa,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAA6B,QAAQ,EAAE,CAAC","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { isPathWithin, logger, toPosixPath } from \"@gtkx/utils\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, posix, relative, resolve } from \"node:path\";\nimport {\n type CatalogProject,\n compileCatalogs,\n LOCALE_DIRNAME,\n resolveCatalogProject,\n synchronizeCatalogs,\n type WrittenCatalog,\n} from \"../i18n/catalogs.js\";\nimport { extractSourceCatalog, SourceExtractionError } from \"../i18n/source-messages.js\";\nimport { emitI18nTypes } from \"../i18n/types.js\";\nimport { discoverSourceFiles, sourceLanguage } from \"../internal/source-imports.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype CatalogWriteListener = (catalogs: WrittenCatalog[]) => void;\n\ntype I18nPluginOptions = {\n entryPath: string;\n loadConfig?: ConfigLoader | undefined;\n onCatalogsWritten?: CatalogWriteListener | undefined;\n shouldPreserveMetadataMessages?: boolean | undefined;\n shouldRecoverExtractionErrors?: boolean | undefined;\n};\n\ntype I18nState = {\n entryPath: string;\n i18nRoot: string;\n outDir: string;\n project: CatalogProject | null;\n extraction: Promise<void>;\n hotUpdateTimestamp: number | null;\n onCatalogsWritten: CatalogWriteListener;\n};\n\nconst BOOTSTRAP_SPECIFIER = \"@gtkx/i18n/bootstrap\";\nconst LOCALE_URL_PLACEHOLDER = \"__GTKX_BUNDLE_LOCALE_DIR__\";\nconst LOCALE_MODULE_PATHS = new Set([\"dist/locale.js\", \"src/locale.ts\"]);\nconst LOCALE_URL_PATTERN = /new URL\\(([\"'])locale\\1,\\s*import\\.meta\\.url\\)/;\n\nconst isI18nLocaleModule = (state: I18nState, id: string): boolean => {\n if (state.i18nRoot.length === 0) {\n return false;\n }\n\n const path = toPosixPath(relative(state.i18nRoot, stripQuery(id)));\n\n return LOCALE_MODULE_PATHS.has(path);\n};\n\nconst markLocaleUrl = (code: string): string =>\n code.replace(\n LOCALE_URL_PATTERN,\n () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`,\n );\n\nconst localeUrlForChunk = (fileName: string): string => {\n const path = posix.relative(posix.dirname(fileName), LOCALE_DIRNAME);\n\n return path.length === 0 ? \".\" : path;\n};\n\nconst rebaseLocaleUrl = (state: I18nState, code: string, fileName: string, moduleIds: string[]): string | null => {\n if (moduleIds.every((id) => !isI18nLocaleModule(state, id))) {\n return null;\n }\n\n const placeholder = JSON.stringify(LOCALE_URL_PLACEHOLDER);\n\n if (!code.includes(placeholder)) {\n throw new Error(`Unable to locate the @gtkx/i18n locale fallback in ${fileName}`);\n }\n\n return code.replace(placeholder, () => JSON.stringify(localeUrlForChunk(fileName)));\n};\n\nconst applyResolvedConfig = async (\n state: I18nState,\n config: ResolvedConfig,\n loadConfig: ConfigLoader,\n): Promise<void> => {\n state.entryPath = resolve(config.root, state.entryPath);\n state.outDir = resolve(config.root, config.build.outDir);\n const application = await loadConfig.resolve(config.root);\n state.project = resolveCatalogProject(config.root, application.applicationId);\n\n if (state.project !== null) {\n const projectRequire = createRequire(resolve(config.root, \"package.json\"));\n state.i18nRoot = dirname(projectRequire.resolve(\"@gtkx/i18n/package.json\"));\n }\n};\n\nconst buildCatalogs = (state: I18nState): void => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n mkdirSync(state.outDir, { recursive: true });\n compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));\n};\n\nconst extractProjectMessages = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n shouldSynchronizeCatalogs: boolean,\n): Promise<void> => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n const srcDir = join(project.root, \"src\");\n const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);\n await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);\n\n if (shouldSynchronizeCatalogs) {\n state.onCatalogsWritten(synchronizeCatalogs(project));\n }\n\n await emitI18nTypes(project.root);\n};\n\nconst settleExtraction = async (pending: Promise<void>): Promise<void> => {\n try {\n await pending;\n } catch {\n return;\n }\n};\n\nconst queueExtraction = (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n shouldSynchronizeCatalogs: boolean,\n): Promise<void> => {\n const prior = state.extraction;\n const pending = (async (): Promise<void> => {\n await settleExtraction(prior);\n await extractProjectMessages(\n state,\n shouldPreserveMetadataMessages,\n shouldSynchronizeCatalogs,\n );\n })();\n\n state.extraction = pending;\n\n return pending;\n};\n\nconst isProjectSource = (state: I18nState, path: string): boolean => {\n const project = state.project;\n\n if (project === null || sourceLanguage(path) === undefined) {\n return false;\n }\n\n const srcDir = join(project.root, \"src\");\n const sourceRoot = existsSync(srcDir) ? srcDir : project.root;\n\n return isPathWithin(sourceRoot, path);\n};\n\nconst refreshProjectMessages = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n shouldSynchronizeCatalogs = false,\n): Promise<void> => {\n try {\n await queueExtraction(state, shouldPreserveMetadataMessages, shouldSynchronizeCatalogs);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n }\n};\n\nconst recoverInitialSourceExtraction = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n): Promise<void> => {\n try {\n await queueExtraction(state, shouldPreserveMetadataMessages, true);\n } catch (error) {\n if (!(error instanceof SourceExtractionError)) {\n throw error;\n }\n\n logger.error(error.message);\n }\n};\n\nconst gtkxI18n = ({\n entryPath,\n loadConfig = createConfigLoader(),\n onCatalogsWritten = (): void => undefined,\n shouldPreserveMetadataMessages = true,\n shouldRecoverExtractionErrors = false,\n}: I18nPluginOptions): Plugin => {\n const state: I18nState = {\n entryPath,\n extraction: Promise.resolve(),\n hotUpdateTimestamp: null,\n i18nRoot: \"\",\n outDir: \"\",\n project: null,\n onCatalogsWritten,\n };\n\n return {\n name: \"gtkx:i18n\",\n enforce: \"pre\",\n\n configResolved: (config) => applyResolvedConfig(state, config, loadConfig),\n\n buildStart: () => shouldRecoverExtractionErrors\n ? recoverInitialSourceExtraction(state, shouldPreserveMetadataMessages)\n : queueExtraction(state, shouldPreserveMetadataMessages, true),\n\n hotUpdate(options) {\n if (!isProjectSource(state, options.file) || state.hotUpdateTimestamp === options.timestamp) {\n return;\n }\n\n state.hotUpdateTimestamp = options.timestamp;\n\n return refreshProjectMessages(state, shouldPreserveMetadataMessages);\n },\n\n transform(code, id) {\n if (isI18nLocaleModule(state, id)) {\n return markLocaleUrl(code);\n }\n\n if (state.project === null || resolve(stripQuery(id)) !== state.entryPath) {\n return;\n }\n\n return `import ${JSON.stringify(BOOTSTRAP_SPECIFIER)};\\n${code}`;\n },\n\n renderChunk(code, chunk) {\n return rebaseLocaleUrl(state, code, chunk.fileName, chunk.moduleIds);\n },\n\n generateBundle() {\n buildCatalogs(state);\n },\n };\n};\n\nexport { type CatalogWriteListener, gtkxI18n };\n"]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
2
|
import type { BuildManifestCollector } from "../internal/build-manifest.js";
|
|
3
|
+
import { type CatalogWriteListener } from "./i18n.js";
|
|
3
4
|
type GtkxVitePluginOptions = {
|
|
4
5
|
buildManifest?: BuildManifestCollector | undefined;
|
|
5
6
|
configFile?: string | undefined;
|
|
6
7
|
entryPath?: string | undefined;
|
|
7
8
|
mode?: string | undefined;
|
|
9
|
+
onCatalogsWritten?: CatalogWriteListener | undefined;
|
|
8
10
|
shouldPreserveI18nMetadata?: boolean | undefined;
|
|
9
11
|
};
|
|
10
12
|
declare const gtkxVitePlugins: (options?: GtkxVitePluginOptions) => Plugin[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAI5E,OAAO,EAAE,KAAK,oBAAoB,EAAY,MAAM,WAAW,CAAC;AAQhE,KAAK,qBAAqB,GAAG;IACzB,aAAa,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACnD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,iBAAiB,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACrD,0BAA0B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpD,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,UAAS,qBAA0B,KAAG,MAAM,EAmCpE,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -11,7 +11,7 @@ import { gtkxSettings } from "./settings.js";
|
|
|
11
11
|
import { gtkxStoreLinks } from "./store-links.js";
|
|
12
12
|
import { gtkxUndeclaredLibrary } from "./undeclared-library.js";
|
|
13
13
|
const gtkxVitePlugins = (options = {}) => {
|
|
14
|
-
const { buildManifest, configFile, entryPath, mode, shouldPreserveI18nMetadata = true } = options;
|
|
14
|
+
const { buildManifest, configFile, entryPath, mode, onCatalogsWritten, shouldPreserveI18nMetadata = true, } = options;
|
|
15
15
|
const loadConfig = createConfigLoader({
|
|
16
16
|
...(mode !== undefined && { mode }),
|
|
17
17
|
...(configFile !== undefined && { configFile }),
|
|
@@ -20,7 +20,13 @@ const gtkxVitePlugins = (options = {}) => {
|
|
|
20
20
|
createConfigPlugin({ name: "gtkx:config", loadConfig }),
|
|
21
21
|
...(entryPath === undefined
|
|
22
22
|
? []
|
|
23
|
-
: [gtkxI18n(
|
|
23
|
+
: [gtkxI18n({
|
|
24
|
+
entryPath,
|
|
25
|
+
loadConfig,
|
|
26
|
+
onCatalogsWritten,
|
|
27
|
+
shouldPreserveMetadataMessages: shouldPreserveI18nMetadata,
|
|
28
|
+
shouldRecoverExtractionErrors: mode === "development",
|
|
29
|
+
})]),
|
|
24
30
|
gtkxStoreLinks(),
|
|
25
31
|
gtkxUndeclaredLibrary(loadConfig),
|
|
26
32
|
gtkxSettings(buildManifest),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAA6B,QAAQ,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAWhE,MAAM,eAAe,GAAG,CAAC,UAAiC,EAAE,EAAY,EAAE;IACtE,MAAM,EACF,aAAa,EACb,UAAU,EACV,SAAS,EACT,IAAI,EACJ,iBAAiB,EACjB,0BAA0B,GAAG,IAAI,GACpC,GAAG,OAAO,CAAC;IACZ,MAAM,UAAU,GAAG,kBAAkB,CAAC;QAClC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC;KAClD,CAAC,CAAC;IAEH,OAAO;QACH,kBAAkB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;QACvD,GAAG,CAAC,SAAS,KAAK,SAAS;YACvB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACJ,SAAS;oBACT,UAAU;oBACV,iBAAiB;oBACjB,8BAA8B,EAAE,0BAA0B;oBAC1D,6BAA6B,EAAE,IAAI,KAAK,aAAa;iBACxD,CAAC,CAAC,CAAC;QACZ,cAAc,EAAE;QAChB,qBAAqB,CAAC,UAAU,CAAC;QACjC,YAAY,CAAC,aAAa,CAAC;QAC3B,SAAS,CAAC,UAAU,CAAC;QACrB,gBAAgB,EAAE;QAClB,YAAY,EAAE;QACd,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC;QACpC,OAAO,EAAE;QACT,iBAAiB,CAAC,UAAU,CAAC;KAChC,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport createConfigPlugin from \"@gtkx/config/vite-plugin\";\nimport type { BuildManifestCollector } from \"../internal/build-manifest.js\";\nimport { gtkxAssetImports } from \"./asset-imports.js\";\nimport { gtkxBuiltUrl } from \"./built-url.js\";\nimport { gtkxCss } from \"./css.js\";\nimport { type CatalogWriteListener, gtkxI18n } from \"./i18n.js\";\nimport { gtkxIcons } from \"./icons.js\";\nimport { gtkxReactCompiler } from \"./react-compiler.js\";\nimport { gtkxResources } from \"./resources.js\";\nimport { gtkxSettings } from \"./settings.js\";\nimport { gtkxStoreLinks } from \"./store-links.js\";\nimport { gtkxUndeclaredLibrary } from \"./undeclared-library.js\";\n\ntype GtkxVitePluginOptions = {\n buildManifest?: BuildManifestCollector | undefined;\n configFile?: string | undefined;\n entryPath?: string | undefined;\n mode?: string | undefined;\n onCatalogsWritten?: CatalogWriteListener | undefined;\n shouldPreserveI18nMetadata?: boolean | undefined;\n};\n\nconst gtkxVitePlugins = (options: GtkxVitePluginOptions = {}): Plugin[] => {\n const {\n buildManifest,\n configFile,\n entryPath,\n mode,\n onCatalogsWritten,\n shouldPreserveI18nMetadata = true,\n } = options;\n const loadConfig = createConfigLoader({\n ...(mode !== undefined && { mode }),\n ...(configFile !== undefined && { configFile }),\n });\n\n return [\n createConfigPlugin({ name: \"gtkx:config\", loadConfig }),\n ...(entryPath === undefined\n ? []\n : [gtkxI18n({\n entryPath,\n loadConfig,\n onCatalogsWritten,\n shouldPreserveMetadataMessages: shouldPreserveI18nMetadata,\n shouldRecoverExtractionErrors: mode === \"development\",\n })]),\n gtkxStoreLinks(),\n gtkxUndeclaredLibrary(loadConfig),\n gtkxSettings(buildManifest),\n gtkxIcons(loadConfig),\n gtkxAssetImports(),\n gtkxBuiltUrl(),\n gtkxResources(loadConfig, entryPath),\n gtkxCss(),\n gtkxReactCompiler(loadConfig),\n ];\n};\n\nexport { gtkxVitePlugins };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/cli",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.5",
|
|
4
4
|
"description": "GTK app toolchain for React: scaffold, dev server, build, docs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
@@ -70,18 +70,18 @@
|
|
|
70
70
|
"dependencies": {
|
|
71
71
|
"@babel/core": "^8.0.1",
|
|
72
72
|
"@babel/preset-typescript": "^8.0.1",
|
|
73
|
-
"@gtkx/codegen": "2.0.0-beta.
|
|
74
|
-
"@gtkx/config": "2.0.0-beta.
|
|
75
|
-
"@gtkx/mcp": "2.0.0-beta.
|
|
76
|
-
"@gtkx/native": "2.0.0-beta.
|
|
77
|
-
"@gtkx/runtime": "2.0.0-beta.
|
|
78
|
-
"@gtkx/utils": "2.0.0-beta.
|
|
79
|
-
"@gtkx/vitest": "2.0.0-beta.
|
|
73
|
+
"@gtkx/codegen": "2.0.0-beta.5",
|
|
74
|
+
"@gtkx/config": "2.0.0-beta.5",
|
|
75
|
+
"@gtkx/mcp": "2.0.0-beta.5",
|
|
76
|
+
"@gtkx/native": "2.0.0-beta.5",
|
|
77
|
+
"@gtkx/runtime": "2.0.0-beta.5",
|
|
78
|
+
"@gtkx/utils": "2.0.0-beta.5",
|
|
79
|
+
"@gtkx/vitest": "2.0.0-beta.5",
|
|
80
80
|
"@swc/core": "^1.16.1",
|
|
81
81
|
"babel-plugin-react-compiler": "^1.0.0",
|
|
82
82
|
"citty": "^0.2.2",
|
|
83
83
|
"confbox": "^0.2.4",
|
|
84
|
-
"create-gtkx": "2.0.0-beta.
|
|
84
|
+
"create-gtkx": "2.0.0-beta.5",
|
|
85
85
|
"fast-xml-builder": "^1.3.1",
|
|
86
86
|
"fast-xml-parser": "^5.11.1",
|
|
87
87
|
"hosted-git-info": "^10.1.1",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"yaml": "^2.9.0"
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
|
-
"@gtkx/testing": "2.0.0-beta.
|
|
95
|
+
"@gtkx/testing": "2.0.0-beta.5",
|
|
96
96
|
"@types/babel__core": "^7.20.5",
|
|
97
97
|
"@types/hosted-git-info": "^3.0.5",
|
|
98
98
|
"@types/react-refresh": "^0.14.7",
|
package/src/commands/dev.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { armParentDeath } from "@gtkx/native/internal";
|
|
2
|
-
import {
|
|
2
|
+
import { reapStaleHeadlessDisplaysAtStartup } from "@gtkx/vitest/headless";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import { resolveConfigWatch } from "../codegen/run-codegen.js";
|
|
5
5
|
import { startHeadlessDevDisplay } from "../dev/headless.js";
|
|
@@ -29,7 +29,7 @@ const dev = defineCommand({
|
|
|
29
29
|
},
|
|
30
30
|
},
|
|
31
31
|
async run({ args }) {
|
|
32
|
-
|
|
32
|
+
reapStaleHeadlessDisplaysAtStartup();
|
|
33
33
|
const initialProcessGroupOwner = getInitialProcessGroupOwner();
|
|
34
34
|
|
|
35
35
|
if (
|