@gtkx/cli 2.0.0-beta.1 → 2.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder.d.ts +1 -0
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +17 -5
- package/dist/builder.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +4 -2
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +13 -8
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/codegen/store-resolver.d.ts +1 -1
- package/dist/codegen/store-resolver.d.ts.map +1 -1
- package/dist/codegen/store-resolver.js +2 -2
- package/dist/codegen/store-resolver.js.map +1 -1
- package/dist/commands/build.d.ts +5 -0
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +83 -10
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/codegen.d.ts +1 -0
- package/dist/commands/codegen.d.ts.map +1 -1
- package/dist/commands/codegen.js +6 -5
- package/dist/commands/codegen.js.map +1 -1
- package/dist/commands/deploy.d.ts +1 -0
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +4 -2
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +8 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +19 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -1
- package/dist/deploy/freedesktop/metainfo.js +41 -2
- package/dist/deploy/freedesktop/metainfo.js.map +1 -1
- package/dist/deploy/nfpm/config.d.ts.map +1 -1
- package/dist/deploy/nfpm/config.js +5 -2
- package/dist/deploy/nfpm/config.js.map +1 -1
- package/dist/deploy/nfpm/contents.d.ts.map +1 -1
- package/dist/deploy/nfpm/contents.js +8 -0
- package/dist/deploy/nfpm/contents.js.map +1 -1
- package/dist/deploy/node-runtime/elf.d.ts +2 -1
- package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
- package/dist/deploy/node-runtime/elf.js +32 -5
- package/dist/deploy/node-runtime/elf.js.map +1 -1
- package/dist/deploy/node-runtime/index.d.ts +2 -1
- package/dist/deploy/node-runtime/index.d.ts.map +1 -1
- package/dist/deploy/node-runtime/index.js +73 -4
- package/dist/deploy/node-runtime/index.js.map +1 -1
- package/dist/deploy/notices/node-runtime.js +2 -2
- package/dist/deploy/notices/node-runtime.js.map +1 -1
- package/dist/deploy/payload/launcher.d.ts.map +1 -1
- package/dist/deploy/payload/launcher.js +14 -1
- package/dist/deploy/payload/launcher.js.map +1 -1
- package/dist/deploy/payload/stage.js +1 -1
- package/dist/deploy/payload/stage.js.map +1 -1
- package/dist/deploy/run-deploy.d.ts +1 -0
- package/dist/deploy/run-deploy.d.ts.map +1 -1
- package/dist/deploy/run-deploy.js +100 -14
- package/dist/deploy/run-deploy.js.map +1 -1
- package/dist/deploy/settings/build-manifest.d.ts +6 -1
- package/dist/deploy/settings/build-manifest.d.ts.map +1 -1
- package/dist/deploy/settings/build-manifest.js +15 -4
- package/dist/deploy/settings/build-manifest.js.map +1 -1
- package/dist/deploy/settings/extra-files.d.ts +1 -1
- package/dist/deploy/settings/extra-files.d.ts.map +1 -1
- package/dist/deploy/settings/extra-files.js +22 -1
- package/dist/deploy/settings/extra-files.js.map +1 -1
- package/dist/deploy/settings/index.d.ts +1 -0
- package/dist/deploy/settings/index.d.ts.map +1 -1
- package/dist/deploy/settings/index.js +2 -1
- package/dist/deploy/settings/index.js.map +1 -1
- package/dist/deploy/settings/paths.d.ts +2 -1
- package/dist/deploy/settings/paths.d.ts.map +1 -1
- package/dist/deploy/settings/paths.js +113 -5
- package/dist/deploy/settings/paths.js.map +1 -1
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-source.js +11 -2
- package/dist/deploy/targets/flatpak-source.js.map +1 -1
- package/dist/deploy/types.d.ts +1 -0
- package/dist/deploy/types.d.ts.map +1 -1
- package/dist/deploy/types.js.map +1 -1
- package/dist/dev/headless.d.ts +3 -0
- package/dist/dev/headless.d.ts.map +1 -0
- package/dist/dev/headless.js +35 -0
- package/dist/dev/headless.js.map +1 -0
- package/dist/dev/runner-deps.js +1 -1
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/i18n/source-messages.d.ts.map +1 -1
- package/dist/i18n/source-messages.js +835 -1
- package/dist/i18n/source-messages.js.map +1 -1
- package/dist/internal/build-manifest.d.ts +5 -2
- package/dist/internal/build-manifest.d.ts.map +1 -1
- package/dist/internal/build-manifest.js +15 -2
- package/dist/internal/build-manifest.js.map +1 -1
- package/dist/internal/build-output.d.ts +8 -0
- package/dist/internal/build-output.d.ts.map +1 -0
- package/dist/internal/build-output.js +69 -0
- package/dist/internal/build-output.js.map +1 -0
- package/dist/internal/entry-arg.d.ts +4 -1
- package/dist/internal/entry-arg.d.ts.map +1 -1
- package/dist/internal/entry-arg.js +7 -1
- package/dist/internal/entry-arg.js.map +1 -1
- package/dist/internal/output-directory.d.ts +15 -0
- package/dist/internal/output-directory.d.ts.map +1 -0
- package/dist/internal/output-directory.js +490 -0
- package/dist/internal/output-directory.js.map +1 -0
- package/dist/internal/prepare-project.d.ts +2 -0
- package/dist/internal/prepare-project.d.ts.map +1 -1
- package/dist/internal/prepare-project.js +3 -3
- package/dist/internal/prepare-project.js.map +1 -1
- package/dist/internal/source-imports.js +1 -1
- package/dist/internal/source-imports.js.map +1 -1
- package/dist/mcp/client.js +2 -2
- package/dist/mcp/client.js.map +1 -1
- package/dist/vite-plugins/build-manifest.d.ts +5 -1
- package/dist/vite-plugins/build-manifest.d.ts.map +1 -1
- package/dist/vite-plugins/build-manifest.js +2 -1
- package/dist/vite-plugins/build-manifest.js.map +1 -1
- package/dist/vite-plugins/i18n.d.ts.map +1 -1
- package/dist/vite-plugins/i18n.js +58 -6
- package/dist/vite-plugins/i18n.js.map +1 -1
- package/dist/vite-plugins/index.d.ts +8 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +6 -2
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/self-contained.d.ts.map +1 -1
- package/dist/vite-plugins/self-contained.js +159 -158
- package/dist/vite-plugins/self-contained.js.map +1 -1
- package/package.json +9 -9
- package/src/builder.ts +18 -5
- package/src/cli.ts +3 -0
- package/src/codegen/run-codegen.ts +15 -7
- package/src/codegen/store-resolver.ts +2 -2
- package/src/commands/build.ts +13 -2
- package/src/commands/codegen.ts +6 -5
- package/src/commands/deploy.ts +4 -2
- package/src/commands/dev.ts +20 -1
- package/src/deploy/freedesktop/metainfo.ts +73 -21
- package/src/deploy/nfpm/config.ts +5 -2
- package/src/deploy/nfpm/contents.ts +8 -0
- package/src/deploy/node-runtime/elf.ts +43 -5
- package/src/deploy/node-runtime/index.ts +105 -5
- package/src/deploy/notices/node-runtime.ts +2 -2
- package/src/deploy/payload/launcher.ts +20 -1
- package/src/deploy/payload/stage.ts +1 -1
- package/src/deploy/run-deploy.ts +56 -16
- package/src/deploy/settings/build-manifest.ts +28 -3
- package/src/deploy/settings/extra-files.ts +26 -2
- package/src/deploy/settings/index.ts +3 -1
- package/src/deploy/settings/paths.ts +70 -5
- package/src/deploy/targets/flatpak-source.ts +13 -2
- package/src/deploy/types.ts +1 -0
- package/src/dev/headless.ts +40 -0
- package/src/dev/runner-deps.ts +1 -1
- package/src/i18n/source-messages.ts +1220 -2
- package/src/internal/build-manifest.ts +25 -1
- package/src/internal/build-output.ts +99 -0
- package/src/internal/entry-arg.ts +8 -1
- package/src/internal/output-directory.ts +699 -0
- package/src/internal/prepare-project.ts +5 -5
- package/src/internal/source-imports.ts +1 -1
- package/src/mcp/client.ts +2 -2
- package/src/vite-plugins/build-manifest.ts +7 -1
- package/src/vite-plugins/i18n.ts +86 -5
- package/src/vite-plugins/index.ts +14 -7
- package/src/vite-plugins/self-contained.ts +184 -185
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { closeSync, constants, fstatSync, lstatSync, mkdirSync, mkdtempSync, openSync, readdirSync, readFileSync, realpathSync, renameSync, rmdirSync, rmSync, } from "node:fs";
|
|
2
|
+
import { basename, dirname, isAbsolute, join, relative, sep } from "node:path";
|
|
3
|
+
const hasErrorCode = (value, code) => typeof value === "object" && value !== null && "code" in value && value.code === code;
|
|
4
|
+
const readRegularFile = (path) => {
|
|
5
|
+
let descriptor = null;
|
|
6
|
+
try {
|
|
7
|
+
descriptor = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
8
|
+
if (!fstatSync(descriptor).isFile()) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return readFileSync(descriptor, "utf8");
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
if (descriptor !== null) {
|
|
18
|
+
closeSync(descriptor);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const openDirectoryLease = (path) => {
|
|
23
|
+
let descriptor = null;
|
|
24
|
+
try {
|
|
25
|
+
descriptor = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
26
|
+
const stats = fstatSync(descriptor, { bigint: true });
|
|
27
|
+
let retainedDescriptor = descriptor;
|
|
28
|
+
return {
|
|
29
|
+
identity: { device: stats.dev, inode: stats.ino },
|
|
30
|
+
path: join("/proc/self/fd", String(descriptor)),
|
|
31
|
+
release: () => {
|
|
32
|
+
if (retainedDescriptor === null) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const releasedDescriptor = retainedDescriptor;
|
|
36
|
+
retainedDescriptor = null;
|
|
37
|
+
closeSync(releasedDescriptor);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
if (descriptor !== null) {
|
|
43
|
+
closeSync(descriptor);
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const readDirectoryIdentity = (path) => {
|
|
49
|
+
const lease = openDirectoryLease(path);
|
|
50
|
+
if (lease === null) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
lease.release();
|
|
54
|
+
return lease.identity;
|
|
55
|
+
};
|
|
56
|
+
const hasDirectoryIdentity = (path, expected) => {
|
|
57
|
+
const actual = readDirectoryIdentity(path);
|
|
58
|
+
return actual !== null && actual.device === expected.device && actual.inode === expected.inode;
|
|
59
|
+
};
|
|
60
|
+
const hasResolvedDirectoryIdentity = (path, expected) => {
|
|
61
|
+
try {
|
|
62
|
+
return hasDirectoryIdentity(realpathSync(path), expected);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const capturePath = (source, destination) => {
|
|
69
|
+
try {
|
|
70
|
+
renameSync(source, destination);
|
|
71
|
+
return "captured";
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (hasErrorCode(error, "ENOENT")) {
|
|
75
|
+
return "missing";
|
|
76
|
+
}
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const createQuarantineDirectory = (parent, displayParent) => {
|
|
81
|
+
const created = mkdtempSync(join(parent.path, ".gtkx-output-"));
|
|
82
|
+
const name = basename(created);
|
|
83
|
+
const entry = join(parent.path, name);
|
|
84
|
+
const lease = openDirectoryLease(entry);
|
|
85
|
+
if (lease === null) {
|
|
86
|
+
rmdirSync(entry);
|
|
87
|
+
throw new Error("Could not secure the output quarantine directory");
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
displayPath: join(displayParent, name),
|
|
91
|
+
path: lease.path,
|
|
92
|
+
release: lease.release,
|
|
93
|
+
remove: () => {
|
|
94
|
+
if (!hasDirectoryIdentity(entry, lease.identity)) {
|
|
95
|
+
throw new Error(`The output quarantine changed; retained files are in ${join(displayParent, name)}`);
|
|
96
|
+
}
|
|
97
|
+
rmdirSync(entry);
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
const releaseTransactionLeases = (fresh, quarantine, parent, root) => {
|
|
102
|
+
try {
|
|
103
|
+
fresh.release();
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
try {
|
|
107
|
+
quarantine.release();
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
try {
|
|
111
|
+
parent.release();
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
root.release();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const releasePreparationLeases = (quarantine, parent, root) => {
|
|
120
|
+
try {
|
|
121
|
+
quarantine.release();
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
try {
|
|
125
|
+
parent.release();
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
root.release();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const movePath = (source, destination, operations) => {
|
|
133
|
+
renameSync(source, destination);
|
|
134
|
+
operations.push({ source, destination });
|
|
135
|
+
};
|
|
136
|
+
const moveNames = (source, destination, names, operations) => {
|
|
137
|
+
for (const name of names) {
|
|
138
|
+
movePath(join(source, name), join(destination, name), operations);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
const reverseOperations = (operations) => {
|
|
142
|
+
for (const operation of operations.toReversed()) {
|
|
143
|
+
renameSync(operation.destination, operation.source);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
const overlayDirectory = (source, destination, backup, operations) => {
|
|
147
|
+
for (const name of readdirSync(source)) {
|
|
148
|
+
overlayEntry({
|
|
149
|
+
source: join(source, name),
|
|
150
|
+
destination: join(destination, name),
|
|
151
|
+
backup: join(backup, name),
|
|
152
|
+
operations,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
const overlayEntry = (request) => {
|
|
157
|
+
const destinationStats = lstatSync(request.destination, { throwIfNoEntry: false });
|
|
158
|
+
if (destinationStats === undefined) {
|
|
159
|
+
movePath(request.source, request.destination, request.operations);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const sourceStats = lstatSync(request.source);
|
|
163
|
+
if (sourceStats.isDirectory() && destinationStats.isDirectory()) {
|
|
164
|
+
overlayDirectory(request.source, request.destination, request.backup, request.operations);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (!sourceStats.isFile() || !destinationStats.isFile()) {
|
|
168
|
+
throw new Error("Cannot merge conflicting preserved output entries");
|
|
169
|
+
}
|
|
170
|
+
mkdirSync(dirname(request.backup), { recursive: true });
|
|
171
|
+
movePath(request.destination, request.backup, request.operations);
|
|
172
|
+
movePath(request.source, request.destination, request.operations);
|
|
173
|
+
};
|
|
174
|
+
const restoreUnexpectedOutput = (unexpected, target, quarantine, previous) => {
|
|
175
|
+
try {
|
|
176
|
+
renameSync(unexpected, target);
|
|
177
|
+
if (previous === null) {
|
|
178
|
+
quarantine.remove();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
throw new Error(`Output recovery failed; retained files are in ${quarantine.displayPath}`, { cause: error });
|
|
183
|
+
}
|
|
184
|
+
throw new Error(`Output changed during the operation; the previous output is retained in ${quarantine.displayPath}`);
|
|
185
|
+
};
|
|
186
|
+
const recoverUnsecuredPublicPath = (target, quarantine, previous, error) => {
|
|
187
|
+
const unsecured = join(quarantine.path, "unsecured");
|
|
188
|
+
const publicCapture = capturePath(target, unsecured);
|
|
189
|
+
try {
|
|
190
|
+
if (previous !== null) {
|
|
191
|
+
renameSync(previous, target);
|
|
192
|
+
}
|
|
193
|
+
else if (publicCapture === "captured") {
|
|
194
|
+
renameSync(unsecured, target);
|
|
195
|
+
}
|
|
196
|
+
if (previous === null || publicCapture === "missing") {
|
|
197
|
+
quarantine.remove();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (recoveryError) {
|
|
201
|
+
throw new AggregateError([error, recoveryError], `Could not recover the output directory; retained files are in ${quarantine.displayPath}`, { cause: recoveryError });
|
|
202
|
+
}
|
|
203
|
+
throw new Error(`Could not secure the output directory; retained files are in ${quarantine.displayPath}`, {
|
|
204
|
+
cause: error,
|
|
205
|
+
});
|
|
206
|
+
};
|
|
207
|
+
const recoverFailedCapture = (quarantine, error) => {
|
|
208
|
+
try {
|
|
209
|
+
quarantine.remove();
|
|
210
|
+
}
|
|
211
|
+
catch (recoveryError) {
|
|
212
|
+
throw new AggregateError([error, recoveryError], `Could not clean the output quarantine; retained files are in ${quarantine.displayPath}`, { cause: recoveryError });
|
|
213
|
+
}
|
|
214
|
+
throw error;
|
|
215
|
+
};
|
|
216
|
+
const rollbackOutputDirectory = (target, quarantine, previous, freshIdentity) => {
|
|
217
|
+
const failed = join(quarantine.path, "failed");
|
|
218
|
+
const freshCapture = capturePath(target, failed);
|
|
219
|
+
if (freshCapture === "captured" && !hasDirectoryIdentity(failed, freshIdentity)) {
|
|
220
|
+
restoreUnexpectedOutput(failed, target, quarantine, previous);
|
|
221
|
+
}
|
|
222
|
+
if (previous !== null) {
|
|
223
|
+
renameSync(previous, target);
|
|
224
|
+
}
|
|
225
|
+
if (freshCapture === "captured") {
|
|
226
|
+
rmSync(failed, { recursive: true, force: true, maxRetries: 5 });
|
|
227
|
+
}
|
|
228
|
+
quarantine.remove();
|
|
229
|
+
};
|
|
230
|
+
const restoreMissingFreshOutput = (target, quarantine, previous) => {
|
|
231
|
+
try {
|
|
232
|
+
if (previous !== null) {
|
|
233
|
+
renameSync(previous, target);
|
|
234
|
+
}
|
|
235
|
+
quarantine.remove();
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
throw new Error(`The fresh output disappeared; retained files are in ${quarantine.displayPath}`, {
|
|
239
|
+
cause: error,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
throw new Error("The fresh output directory disappeared before it could be committed");
|
|
243
|
+
};
|
|
244
|
+
const captureVerifiedFreshOutput = (target, quarantine, previous, freshIdentity) => {
|
|
245
|
+
const fresh = join(quarantine.path, "fresh");
|
|
246
|
+
if (capturePath(target, fresh) === "missing") {
|
|
247
|
+
restoreMissingFreshOutput(target, quarantine, previous);
|
|
248
|
+
}
|
|
249
|
+
if (!hasDirectoryIdentity(fresh, freshIdentity)) {
|
|
250
|
+
restoreUnexpectedOutput(fresh, target, quarantine, previous);
|
|
251
|
+
}
|
|
252
|
+
return fresh;
|
|
253
|
+
};
|
|
254
|
+
const recoverCommit = (request) => {
|
|
255
|
+
const { backup, error, fresh, operations, previous, quarantine, target } = request;
|
|
256
|
+
try {
|
|
257
|
+
reverseOperations(operations);
|
|
258
|
+
renameSync(previous, target);
|
|
259
|
+
rmSync(fresh, { recursive: true, force: true, maxRetries: 5 });
|
|
260
|
+
rmSync(backup, { recursive: true, force: true, maxRetries: 5 });
|
|
261
|
+
quarantine.remove();
|
|
262
|
+
}
|
|
263
|
+
catch (recoveryError) {
|
|
264
|
+
throw new AggregateError([error, recoveryError], `Could not restore the previous output; retained files are in ${quarantine.displayPath}`, { cause: recoveryError });
|
|
265
|
+
}
|
|
266
|
+
throw error;
|
|
267
|
+
};
|
|
268
|
+
const installFreshOutput = (request) => {
|
|
269
|
+
const { fresh, preservedNames, previous, quarantine, target } = request;
|
|
270
|
+
const backup = join(quarantine.path, "backup");
|
|
271
|
+
const operations = [];
|
|
272
|
+
try {
|
|
273
|
+
const oldNames = readdirSync(previous).filter((name) => !preservedNames.has(name));
|
|
274
|
+
const freshNames = readdirSync(fresh);
|
|
275
|
+
const ordinaryFreshNames = freshNames.filter((name) => !preservedNames.has(name));
|
|
276
|
+
const preservedFreshNames = freshNames.filter((name) => preservedNames.has(name));
|
|
277
|
+
mkdirSync(backup);
|
|
278
|
+
moveNames(previous, backup, oldNames, operations);
|
|
279
|
+
moveNames(fresh, previous, ordinaryFreshNames, operations);
|
|
280
|
+
for (const name of preservedFreshNames) {
|
|
281
|
+
overlayEntry({
|
|
282
|
+
source: join(fresh, name),
|
|
283
|
+
destination: join(previous, name),
|
|
284
|
+
backup: join(backup, name),
|
|
285
|
+
operations,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
renameSync(previous, target);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
recoverCommit({ ...request, backup, operations, error });
|
|
292
|
+
}
|
|
293
|
+
rmSync(fresh, { recursive: true, force: true, maxRetries: 5 });
|
|
294
|
+
rmSync(backup, { recursive: true, force: true, maxRetries: 5 });
|
|
295
|
+
quarantine.remove();
|
|
296
|
+
};
|
|
297
|
+
const commitOutputDirectory = (request) => {
|
|
298
|
+
const { freshIdentity, preservedNames, previous, quarantine, target } = request;
|
|
299
|
+
const fresh = captureVerifiedFreshOutput(target, quarantine, previous, freshIdentity);
|
|
300
|
+
if (previous === null) {
|
|
301
|
+
renameSync(fresh, target);
|
|
302
|
+
quarantine.remove();
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
installFreshOutput({ target, quarantine, previous, fresh, preservedNames });
|
|
306
|
+
};
|
|
307
|
+
const assertFreshOutput = (path, isFresh) => {
|
|
308
|
+
if (isFresh !== undefined && !isFresh(path)) {
|
|
309
|
+
throw new Error("The build did not write to the secured output directory");
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
const createOutputDirectoryTransaction = (request) => {
|
|
313
|
+
const { fresh, parent, previous, publicParent, publicPath, publicRoot, quarantine, root, target } = request;
|
|
314
|
+
let state = "prepared";
|
|
315
|
+
const commit = (preservedNames = new Set(), isFresh) => {
|
|
316
|
+
if (state !== "prepared") {
|
|
317
|
+
throw new Error("The output directory transaction has already finished");
|
|
318
|
+
}
|
|
319
|
+
if (!hasResolvedDirectoryIdentity(publicRoot, root.identity) ||
|
|
320
|
+
!hasResolvedDirectoryIdentity(publicParent, parent.identity)) {
|
|
321
|
+
throw new Error(`The output parent changed; previous output is retained in ${quarantine.displayPath}`);
|
|
322
|
+
}
|
|
323
|
+
assertFreshOutput(target, isFresh);
|
|
324
|
+
state = "retained";
|
|
325
|
+
try {
|
|
326
|
+
commitOutputDirectory({
|
|
327
|
+
target,
|
|
328
|
+
quarantine,
|
|
329
|
+
previous,
|
|
330
|
+
freshIdentity: fresh.identity,
|
|
331
|
+
preservedNames,
|
|
332
|
+
});
|
|
333
|
+
state = "committed";
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
releaseTransactionLeases(fresh, quarantine, parent, root);
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
const rollback = () => {
|
|
340
|
+
if (state !== "prepared") {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
state = "retained";
|
|
344
|
+
try {
|
|
345
|
+
rollbackOutputDirectory(target, quarantine, previous, fresh.identity);
|
|
346
|
+
state = "rolled-back";
|
|
347
|
+
}
|
|
348
|
+
finally {
|
|
349
|
+
releaseTransactionLeases(fresh, quarantine, parent, root);
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
return { path: publicPath, commit, [Symbol.dispose]: rollback };
|
|
353
|
+
};
|
|
354
|
+
const rollbackAfterError = (transaction, error) => {
|
|
355
|
+
try {
|
|
356
|
+
transaction[Symbol.dispose]();
|
|
357
|
+
}
|
|
358
|
+
catch (rollbackError) {
|
|
359
|
+
throw new AggregateError([error, rollbackError], "Could not roll back the output directory transaction", { cause: rollbackError });
|
|
360
|
+
}
|
|
361
|
+
throw error;
|
|
362
|
+
};
|
|
363
|
+
const requireFreshDirectoryLease = (resources) => {
|
|
364
|
+
const { parent, previous, quarantine, root, target } = resources;
|
|
365
|
+
const lease = openDirectoryLease(target);
|
|
366
|
+
if (lease !== null) {
|
|
367
|
+
return lease;
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
return recoverUnsecuredPublicPath(target, quarantine, previous, new Error("Could not record the fresh output directory identity"));
|
|
371
|
+
}
|
|
372
|
+
finally {
|
|
373
|
+
releasePreparationLeases(quarantine, parent, root);
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
const requireDirectoryLease = (path, message) => {
|
|
377
|
+
const lease = openDirectoryLease(path);
|
|
378
|
+
if (lease === null) {
|
|
379
|
+
throw new Error(message);
|
|
380
|
+
}
|
|
381
|
+
return lease;
|
|
382
|
+
};
|
|
383
|
+
const createChildDirectoryLease = (parent, name) => {
|
|
384
|
+
const path = join(parent.path, name);
|
|
385
|
+
try {
|
|
386
|
+
mkdirSync(path);
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
if (!hasErrorCode(error, "EEXIST")) {
|
|
390
|
+
throw error;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return requireDirectoryLease(path, "Could not secure the output parent directory");
|
|
394
|
+
};
|
|
395
|
+
const openOutputParent = (root, rootPath, outputPath) => {
|
|
396
|
+
const relativeParent = relative(rootPath, dirname(outputPath));
|
|
397
|
+
if (relativeParent === ".." || isAbsolute(relativeParent) || relativeParent.startsWith(`..${sep}`)) {
|
|
398
|
+
throw new Error("The output directory must be below the project root");
|
|
399
|
+
}
|
|
400
|
+
let parent = requireDirectoryLease(`${root.path}/.`, "Could not secure the project root directory");
|
|
401
|
+
const segments = relativeParent.split(sep);
|
|
402
|
+
try {
|
|
403
|
+
for (const segment of segments) {
|
|
404
|
+
if (segment.length === 0) {
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
const child = createChildDirectoryLease(parent, segment);
|
|
408
|
+
parent.release();
|
|
409
|
+
parent = child;
|
|
410
|
+
}
|
|
411
|
+
return parent;
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
parent.release();
|
|
415
|
+
throw error;
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
const createPreparationResources = (rootPath, path) => {
|
|
419
|
+
const canonicalRoot = realpathSync(rootPath);
|
|
420
|
+
const root = requireDirectoryLease(canonicalRoot, "Could not secure the project root directory");
|
|
421
|
+
let parent;
|
|
422
|
+
try {
|
|
423
|
+
parent = openOutputParent(root, rootPath, path);
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
root.release();
|
|
427
|
+
throw error;
|
|
428
|
+
}
|
|
429
|
+
let quarantine;
|
|
430
|
+
try {
|
|
431
|
+
quarantine = createQuarantineDirectory(root, canonicalRoot);
|
|
432
|
+
}
|
|
433
|
+
catch (error) {
|
|
434
|
+
parent.release();
|
|
435
|
+
root.release();
|
|
436
|
+
throw error;
|
|
437
|
+
}
|
|
438
|
+
const target = join(parent.path, basename(path));
|
|
439
|
+
const captured = join(quarantine.path, "previous");
|
|
440
|
+
let previous = null;
|
|
441
|
+
try {
|
|
442
|
+
previous = capturePath(target, captured) === "captured" ? captured : null;
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
try {
|
|
446
|
+
recoverFailedCapture(quarantine, error);
|
|
447
|
+
}
|
|
448
|
+
finally {
|
|
449
|
+
releasePreparationLeases(quarantine, parent, root);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
try {
|
|
453
|
+
mkdirSync(target);
|
|
454
|
+
}
|
|
455
|
+
catch (error) {
|
|
456
|
+
try {
|
|
457
|
+
recoverUnsecuredPublicPath(target, quarantine, previous, error);
|
|
458
|
+
}
|
|
459
|
+
finally {
|
|
460
|
+
releasePreparationLeases(quarantine, parent, root);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return {
|
|
464
|
+
target,
|
|
465
|
+
publicPath: path,
|
|
466
|
+
publicRoot: rootPath,
|
|
467
|
+
publicParent: dirname(path),
|
|
468
|
+
parent,
|
|
469
|
+
quarantine,
|
|
470
|
+
previous,
|
|
471
|
+
root,
|
|
472
|
+
};
|
|
473
|
+
};
|
|
474
|
+
const prepareOutputDirectory = (rootPath, path, isReusable) => {
|
|
475
|
+
const resources = createPreparationResources(rootPath, path);
|
|
476
|
+
const fresh = requireFreshDirectoryLease(resources);
|
|
477
|
+
const transaction = createOutputDirectoryTransaction({ ...resources, fresh });
|
|
478
|
+
try {
|
|
479
|
+
if (resources.previous === null || isReusable(resources.previous)) {
|
|
480
|
+
return { status: "prepared", transaction };
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
rollbackAfterError(transaction, error);
|
|
485
|
+
}
|
|
486
|
+
transaction[Symbol.dispose]();
|
|
487
|
+
return { status: "unsafe" };
|
|
488
|
+
};
|
|
489
|
+
export { prepareOutputDirectory, readRegularFile, };
|
|
490
|
+
//# sourceMappingURL=output-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-directory.js","sourceRoot":"","sources":["../../src/internal/output-directory.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n closeSync,\n constants,\n fstatSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readdirSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmdirSync,\n rmSync,\n} from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, relative, sep } from \"node:path\";\n\ntype DirectoryIdentity = { device: bigint; inode: bigint };\ntype DirectoryLease = { identity: DirectoryIdentity; path: string; release: () => void };\ntype DirectoryValidator = (path: string) => boolean;\ntype QuarantineDirectory = { displayPath: string; path: string; remove: () => void; release: () => void };\ntype CommitOutputRequest = {\n freshIdentity: DirectoryIdentity;\n preservedNames: ReadonlySet<string>;\n previous: string | null;\n quarantine: QuarantineDirectory;\n target: string;\n};\ntype InstallFreshOutputRequest = Omit<CommitOutputRequest, \"freshIdentity\" | \"previous\"> & {\n fresh: string;\n previous: string;\n};\ntype RenameOperation = { destination: string; source: string };\ntype RecoverCommitRequest = InstallFreshOutputRequest & {\n backup: string;\n error: unknown;\n operations: RenameOperation[];\n};\ntype OverlayEntryRequest = RenameOperation & { backup: string; operations: RenameOperation[] };\ntype OutputDirectoryTransaction = Disposable & {\n commit: (preservedNames?: ReadonlySet<string>, isFresh?: DirectoryValidator) => void;\n path: string;\n};\ntype PreparedOutputDirectory = { status: \"prepared\"; transaction: OutputDirectoryTransaction } | { status: \"unsafe\" };\ntype PreparationResources = {\n parent: DirectoryLease;\n previous: string | null;\n publicParent: string;\n publicPath: string;\n publicRoot: string;\n quarantine: QuarantineDirectory;\n root: DirectoryLease;\n target: string;\n};\ntype TransactionRequest = PreparationResources & { fresh: DirectoryLease };\ntype TransactionState = \"committed\" | \"prepared\" | \"retained\" | \"rolled-back\";\n\nconst hasErrorCode = (value: unknown, code: string): boolean =>\n typeof value === \"object\" && value !== null && \"code\" in value && value.code === code;\n\nconst readRegularFile = (path: string): string | null => {\n let descriptor: number | null = null;\n\n try {\n descriptor = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);\n\n if (!fstatSync(descriptor).isFile()) {\n return null;\n }\n\n return readFileSync(descriptor, \"utf8\");\n } catch {\n return null;\n } finally {\n if (descriptor !== null) {\n closeSync(descriptor);\n }\n }\n};\n\nconst openDirectoryLease = (path: string): DirectoryLease | null => {\n let descriptor: number | null = null;\n\n try {\n descriptor = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);\n const stats = fstatSync(descriptor, { bigint: true });\n let retainedDescriptor: number | null = descriptor;\n\n return {\n identity: { device: stats.dev, inode: stats.ino },\n path: join(\"/proc/self/fd\", String(descriptor)),\n release: () => {\n if (retainedDescriptor === null) {\n return;\n }\n\n const releasedDescriptor = retainedDescriptor;\n retainedDescriptor = null;\n closeSync(releasedDescriptor);\n },\n };\n } catch {\n if (descriptor !== null) {\n closeSync(descriptor);\n }\n\n return null;\n }\n};\n\nconst readDirectoryIdentity = (path: string): DirectoryIdentity | null => {\n const lease = openDirectoryLease(path);\n\n if (lease === null) {\n return null;\n }\n\n lease.release();\n\n return lease.identity;\n};\n\nconst hasDirectoryIdentity = (path: string, expected: DirectoryIdentity): boolean => {\n const actual = readDirectoryIdentity(path);\n\n return actual !== null && actual.device === expected.device && actual.inode === expected.inode;\n};\n\nconst hasResolvedDirectoryIdentity = (path: string, expected: DirectoryIdentity): boolean => {\n try {\n return hasDirectoryIdentity(realpathSync(path), expected);\n } catch {\n return false;\n }\n};\n\nconst capturePath = (source: string, destination: string): \"captured\" | \"missing\" => {\n try {\n renameSync(source, destination);\n\n return \"captured\";\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return \"missing\";\n }\n\n throw error;\n }\n};\n\nconst createQuarantineDirectory = (parent: DirectoryLease, displayParent: string): QuarantineDirectory => {\n const created = mkdtempSync(join(parent.path, \".gtkx-output-\"));\n const name = basename(created);\n const entry = join(parent.path, name);\n const lease = openDirectoryLease(entry);\n\n if (lease === null) {\n rmdirSync(entry);\n throw new Error(\"Could not secure the output quarantine directory\");\n }\n\n return {\n displayPath: join(displayParent, name),\n path: lease.path,\n release: lease.release,\n remove: () => {\n if (!hasDirectoryIdentity(entry, lease.identity)) {\n throw new Error(`The output quarantine changed; retained files are in ${join(displayParent, name)}`);\n }\n\n rmdirSync(entry);\n },\n };\n};\n\nconst releaseTransactionLeases = (\n fresh: DirectoryLease,\n quarantine: QuarantineDirectory,\n parent: DirectoryLease,\n root: DirectoryLease,\n): void => {\n try {\n fresh.release();\n } finally {\n try {\n quarantine.release();\n } finally {\n try {\n parent.release();\n } finally {\n root.release();\n }\n }\n }\n};\n\nconst releasePreparationLeases = (\n quarantine: QuarantineDirectory,\n parent: DirectoryLease,\n root: DirectoryLease,\n): void => {\n try {\n quarantine.release();\n } finally {\n try {\n parent.release();\n } finally {\n root.release();\n }\n }\n};\n\nconst movePath = (source: string, destination: string, operations: RenameOperation[]): void => {\n renameSync(source, destination);\n operations.push({ source, destination });\n};\n\nconst moveNames = (source: string, destination: string, names: string[], operations: RenameOperation[]): void => {\n for (const name of names) {\n movePath(join(source, name), join(destination, name), operations);\n }\n};\n\nconst reverseOperations = (operations: RenameOperation[]): void => {\n for (const operation of operations.toReversed()) {\n renameSync(operation.destination, operation.source);\n }\n};\n\nconst overlayDirectory = (\n source: string,\n destination: string,\n backup: string,\n operations: RenameOperation[],\n): void => {\n for (const name of readdirSync(source)) {\n overlayEntry({\n source: join(source, name),\n destination: join(destination, name),\n backup: join(backup, name),\n operations,\n });\n }\n};\n\nconst overlayEntry = (request: OverlayEntryRequest): void => {\n const destinationStats = lstatSync(request.destination, { throwIfNoEntry: false });\n\n if (destinationStats === undefined) {\n movePath(request.source, request.destination, request.operations);\n\n return;\n }\n\n const sourceStats = lstatSync(request.source);\n\n if (sourceStats.isDirectory() && destinationStats.isDirectory()) {\n overlayDirectory(request.source, request.destination, request.backup, request.operations);\n\n return;\n }\n\n if (!sourceStats.isFile() || !destinationStats.isFile()) {\n throw new Error(\"Cannot merge conflicting preserved output entries\");\n }\n\n mkdirSync(dirname(request.backup), { recursive: true });\n movePath(request.destination, request.backup, request.operations);\n movePath(request.source, request.destination, request.operations);\n};\n\nconst restoreUnexpectedOutput = (\n unexpected: string,\n target: string,\n quarantine: QuarantineDirectory,\n previous: string | null,\n): never => {\n try {\n renameSync(unexpected, target);\n\n if (previous === null) {\n quarantine.remove();\n }\n } catch (error) {\n throw new Error(`Output recovery failed; retained files are in ${quarantine.displayPath}`, { cause: error });\n }\n\n throw new Error(\n `Output changed during the operation; the previous output is retained in ${quarantine.displayPath}`,\n );\n};\n\nconst recoverUnsecuredPublicPath = (\n target: string,\n quarantine: QuarantineDirectory,\n previous: string | null,\n error: unknown,\n): never => {\n const unsecured = join(quarantine.path, \"unsecured\");\n const publicCapture = capturePath(target, unsecured);\n\n try {\n if (previous !== null) {\n renameSync(previous, target);\n } else if (publicCapture === \"captured\") {\n renameSync(unsecured, target);\n }\n\n if (previous === null || publicCapture === \"missing\") {\n quarantine.remove();\n }\n } catch (recoveryError) {\n throw new AggregateError(\n [error, recoveryError],\n `Could not recover the output directory; retained files are in ${quarantine.displayPath}`,\n { cause: recoveryError },\n );\n }\n\n throw new Error(`Could not secure the output directory; retained files are in ${quarantine.displayPath}`, {\n cause: error,\n });\n};\n\nconst recoverFailedCapture = (quarantine: QuarantineDirectory, error: unknown): never => {\n try {\n quarantine.remove();\n } catch (recoveryError) {\n throw new AggregateError(\n [error, recoveryError],\n `Could not clean the output quarantine; retained files are in ${quarantine.displayPath}`,\n { cause: recoveryError },\n );\n }\n\n throw error;\n};\n\nconst rollbackOutputDirectory = (\n target: string,\n quarantine: QuarantineDirectory,\n previous: string | null,\n freshIdentity: DirectoryIdentity,\n): void => {\n const failed = join(quarantine.path, \"failed\");\n const freshCapture = capturePath(target, failed);\n\n if (freshCapture === \"captured\" && !hasDirectoryIdentity(failed, freshIdentity)) {\n restoreUnexpectedOutput(failed, target, quarantine, previous);\n }\n\n if (previous !== null) {\n renameSync(previous, target);\n }\n\n if (freshCapture === \"captured\") {\n rmSync(failed, { recursive: true, force: true, maxRetries: 5 });\n }\n\n quarantine.remove();\n};\n\nconst restoreMissingFreshOutput = (\n target: string,\n quarantine: QuarantineDirectory,\n previous: string | null,\n): never => {\n try {\n if (previous !== null) {\n renameSync(previous, target);\n }\n\n quarantine.remove();\n } catch (error) {\n throw new Error(`The fresh output disappeared; retained files are in ${quarantine.displayPath}`, {\n cause: error,\n });\n }\n\n throw new Error(\"The fresh output directory disappeared before it could be committed\");\n};\n\nconst captureVerifiedFreshOutput = (\n target: string,\n quarantine: QuarantineDirectory,\n previous: string | null,\n freshIdentity: DirectoryIdentity,\n): string => {\n const fresh = join(quarantine.path, \"fresh\");\n\n if (capturePath(target, fresh) === \"missing\") {\n restoreMissingFreshOutput(target, quarantine, previous);\n }\n\n if (!hasDirectoryIdentity(fresh, freshIdentity)) {\n restoreUnexpectedOutput(fresh, target, quarantine, previous);\n }\n\n return fresh;\n};\n\nconst recoverCommit = (request: RecoverCommitRequest): never => {\n const { backup, error, fresh, operations, previous, quarantine, target } = request;\n\n try {\n reverseOperations(operations);\n renameSync(previous, target);\n rmSync(fresh, { recursive: true, force: true, maxRetries: 5 });\n rmSync(backup, { recursive: true, force: true, maxRetries: 5 });\n quarantine.remove();\n } catch (recoveryError) {\n throw new AggregateError(\n [error, recoveryError],\n `Could not restore the previous output; retained files are in ${quarantine.displayPath}`,\n { cause: recoveryError },\n );\n }\n\n throw error;\n};\n\nconst installFreshOutput = (request: InstallFreshOutputRequest): void => {\n const { fresh, preservedNames, previous, quarantine, target } = request;\n const backup = join(quarantine.path, \"backup\");\n const operations: RenameOperation[] = [];\n\n try {\n const oldNames = readdirSync(previous).filter((name) => !preservedNames.has(name));\n const freshNames = readdirSync(fresh);\n const ordinaryFreshNames = freshNames.filter((name) => !preservedNames.has(name));\n const preservedFreshNames = freshNames.filter((name) => preservedNames.has(name));\n mkdirSync(backup);\n moveNames(previous, backup, oldNames, operations);\n moveNames(fresh, previous, ordinaryFreshNames, operations);\n\n for (const name of preservedFreshNames) {\n overlayEntry({\n source: join(fresh, name),\n destination: join(previous, name),\n backup: join(backup, name),\n operations,\n });\n }\n\n renameSync(previous, target);\n } catch (error) {\n recoverCommit({ ...request, backup, operations, error });\n }\n\n rmSync(fresh, { recursive: true, force: true, maxRetries: 5 });\n rmSync(backup, { recursive: true, force: true, maxRetries: 5 });\n quarantine.remove();\n};\n\nconst commitOutputDirectory = (request: CommitOutputRequest): void => {\n const { freshIdentity, preservedNames, previous, quarantine, target } = request;\n const fresh = captureVerifiedFreshOutput(target, quarantine, previous, freshIdentity);\n\n if (previous === null) {\n renameSync(fresh, target);\n quarantine.remove();\n\n return;\n }\n\n installFreshOutput({ target, quarantine, previous, fresh, preservedNames });\n};\n\nconst assertFreshOutput = (path: string, isFresh: DirectoryValidator | undefined): void => {\n if (isFresh !== undefined && !isFresh(path)) {\n throw new Error(\"The build did not write to the secured output directory\");\n }\n};\n\nconst createOutputDirectoryTransaction = (request: TransactionRequest): OutputDirectoryTransaction => {\n const { fresh, parent, previous, publicParent, publicPath, publicRoot, quarantine, root, target } = request;\n let state: TransactionState = \"prepared\";\n\n const commit = (\n preservedNames: ReadonlySet<string> = new Set(),\n isFresh?: DirectoryValidator,\n ): void => {\n if (state !== \"prepared\") {\n throw new Error(\"The output directory transaction has already finished\");\n }\n\n if (\n !hasResolvedDirectoryIdentity(publicRoot, root.identity) ||\n !hasResolvedDirectoryIdentity(publicParent, parent.identity)\n ) {\n throw new Error(`The output parent changed; previous output is retained in ${quarantine.displayPath}`);\n }\n\n assertFreshOutput(target, isFresh);\n state = \"retained\";\n\n try {\n commitOutputDirectory({\n target,\n quarantine,\n previous,\n freshIdentity: fresh.identity,\n preservedNames,\n });\n state = \"committed\";\n } finally {\n releaseTransactionLeases(fresh, quarantine, parent, root);\n }\n };\n\n const rollback = (): void => {\n if (state !== \"prepared\") {\n return;\n }\n\n state = \"retained\";\n\n try {\n rollbackOutputDirectory(target, quarantine, previous, fresh.identity);\n state = \"rolled-back\";\n } finally {\n releaseTransactionLeases(fresh, quarantine, parent, root);\n }\n };\n\n return { path: publicPath, commit, [Symbol.dispose]: rollback };\n};\n\nconst rollbackAfterError = (transaction: OutputDirectoryTransaction, error: unknown): never => {\n try {\n transaction[Symbol.dispose]();\n } catch (rollbackError) {\n throw new AggregateError(\n [error, rollbackError],\n \"Could not roll back the output directory transaction\",\n { cause: rollbackError },\n );\n }\n\n throw error;\n};\n\nconst requireFreshDirectoryLease = (resources: PreparationResources): DirectoryLease => {\n const { parent, previous, quarantine, root, target } = resources;\n const lease = openDirectoryLease(target);\n\n if (lease !== null) {\n return lease;\n }\n\n try {\n return recoverUnsecuredPublicPath(\n target,\n quarantine,\n previous,\n new Error(\"Could not record the fresh output directory identity\"),\n );\n } finally {\n releasePreparationLeases(quarantine, parent, root);\n }\n};\n\nconst requireDirectoryLease = (path: string, message: string): DirectoryLease => {\n const lease = openDirectoryLease(path);\n\n if (lease === null) {\n throw new Error(message);\n }\n\n return lease;\n};\n\nconst createChildDirectoryLease = (parent: DirectoryLease, name: string): DirectoryLease => {\n const path = join(parent.path, name);\n\n try {\n mkdirSync(path);\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n\n return requireDirectoryLease(path, \"Could not secure the output parent directory\");\n};\n\nconst openOutputParent = (root: DirectoryLease, rootPath: string, outputPath: string): DirectoryLease => {\n const relativeParent = relative(rootPath, dirname(outputPath));\n\n if (relativeParent === \"..\" || isAbsolute(relativeParent) || relativeParent.startsWith(`..${sep}`)) {\n throw new Error(\"The output directory must be below the project root\");\n }\n\n let parent = requireDirectoryLease(`${root.path}/.`, \"Could not secure the project root directory\");\n const segments = relativeParent.split(sep);\n\n try {\n for (const segment of segments) {\n if (segment.length === 0) {\n continue;\n }\n\n const child = createChildDirectoryLease(parent, segment);\n parent.release();\n parent = child;\n }\n\n return parent;\n } catch (error) {\n parent.release();\n throw error;\n }\n};\n\nconst createPreparationResources = (rootPath: string, path: string): PreparationResources => {\n const canonicalRoot = realpathSync(rootPath);\n const root = requireDirectoryLease(canonicalRoot, \"Could not secure the project root directory\");\n let parent: DirectoryLease;\n\n try {\n parent = openOutputParent(root, rootPath, path);\n } catch (error) {\n root.release();\n throw error;\n }\n\n let quarantine: QuarantineDirectory;\n\n try {\n quarantine = createQuarantineDirectory(root, canonicalRoot);\n } catch (error) {\n parent.release();\n root.release();\n throw error;\n }\n\n const target = join(parent.path, basename(path));\n const captured = join(quarantine.path, \"previous\");\n let previous: string | null = null;\n\n try {\n previous = capturePath(target, captured) === \"captured\" ? captured : null;\n } catch (error) {\n try {\n recoverFailedCapture(quarantine, error);\n } finally {\n releasePreparationLeases(quarantine, parent, root);\n }\n }\n\n try {\n mkdirSync(target);\n } catch (error) {\n try {\n recoverUnsecuredPublicPath(target, quarantine, previous, error);\n } finally {\n releasePreparationLeases(quarantine, parent, root);\n }\n }\n\n return {\n target,\n publicPath: path,\n publicRoot: rootPath,\n publicParent: dirname(path),\n parent,\n quarantine,\n previous,\n root,\n };\n};\n\nconst prepareOutputDirectory = (\n rootPath: string,\n path: string,\n isReusable: DirectoryValidator,\n): PreparedOutputDirectory => {\n const resources = createPreparationResources(rootPath, path);\n const fresh = requireFreshDirectoryLease(resources);\n const transaction = createOutputDirectoryTransaction({ ...resources, fresh });\n\n try {\n if (resources.previous === null || isReusable(resources.previous)) {\n return { status: \"prepared\", transaction };\n }\n } catch (error) {\n rollbackAfterError(transaction, error);\n }\n\n transaction[Symbol.dispose]();\n\n return { status: \"unsafe\" };\n};\n\nexport {\n type OutputDirectoryTransaction,\n prepareOutputDirectory,\n readRegularFile,\n};\n"]}
|
|
@@ -2,10 +2,12 @@ import { type CodegenContext } from "../codegen/store-resolver.js";
|
|
|
2
2
|
type ProjectArgs = {
|
|
3
3
|
entry?: string;
|
|
4
4
|
cwd?: string;
|
|
5
|
+
config?: string;
|
|
5
6
|
};
|
|
6
7
|
type PreparedProject = {
|
|
7
8
|
cwd: string;
|
|
8
9
|
entry: string;
|
|
10
|
+
configFile: string;
|
|
9
11
|
};
|
|
10
12
|
type ResolvedProject = PreparedProject & {
|
|
11
13
|
context: CodegenContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-project.d.ts","sourceRoot":"","sources":["../../src/internal/prepare-project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAAyB,MAAM,8BAA8B,CAAC;AAG1F,KAAK,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"prepare-project.d.ts","sourceRoot":"","sources":["../../src/internal/prepare-project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAAyB,MAAM,8BAA8B,CAAC;AAG1F,KAAK,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACrE,KAAK,eAAe,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1E,KAAK,eAAe,GAAG,eAAe,GAAG;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC;AAErE,QAAA,MAAM,cAAc,GAAU,MAAM,WAAW,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,eAAe,CAKtF,CAAC;AAEF,QAAA,MAAM,cAAc,GAAU,MAAM,WAAW,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,eAAe,CAKtF,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -3,13 +3,13 @@ import { resolveCodegenContext } from "../codegen/store-resolver.js";
|
|
|
3
3
|
import { resolveCwd, resolveEntry } from "./entry-arg.js";
|
|
4
4
|
const resolveProject = async (args, mode) => {
|
|
5
5
|
const cwd = resolveCwd(args);
|
|
6
|
-
const context = await resolveCodegenContext(cwd, mode);
|
|
7
|
-
return { cwd, entry: resolveEntry(cwd, args.entry), context };
|
|
6
|
+
const context = await resolveCodegenContext(cwd, mode, args.config);
|
|
7
|
+
return { cwd, entry: resolveEntry(cwd, args.entry), configFile: context.configFile, context };
|
|
8
8
|
};
|
|
9
9
|
const prepareProject = async (args, mode) => {
|
|
10
10
|
const { cwd, entry, context } = await resolveProject(args, mode);
|
|
11
11
|
await ensureGeneratedIn(context, { shouldAnnounce: true, mode });
|
|
12
|
-
return { cwd, entry };
|
|
12
|
+
return { cwd, entry, configFile: context.configFile };
|
|
13
13
|
};
|
|
14
14
|
export { prepareProject, resolveProject };
|
|
15
15
|
//# sourceMappingURL=prepare-project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-project.js","sourceRoot":"","sources":["../../src/internal/prepare-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAuB,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM1D,MAAM,cAAc,GAAG,KAAK,EAAE,IAAiB,EAAE,IAAY,EAA4B,EAAE;IACvF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"prepare-project.js","sourceRoot":"","sources":["../../src/internal/prepare-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAuB,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM1D,MAAM,cAAc,GAAG,KAAK,EAAE,IAAiB,EAAE,IAAY,EAA4B,EAAE;IACvF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,IAAiB,EAAE,IAAY,EAA4B,EAAE;IACvF,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjE,MAAM,iBAAiB,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;AAC1D,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { ensureGeneratedIn } from \"../codegen/run-codegen.js\";\nimport { type CodegenContext, resolveCodegenContext } from \"../codegen/store-resolver.js\";\nimport { resolveCwd, resolveEntry } from \"./entry-arg.js\";\n\ntype ProjectArgs = { entry?: string; cwd?: string; config?: string };\ntype PreparedProject = { cwd: string; entry: string; configFile: string };\ntype ResolvedProject = PreparedProject & { context: CodegenContext };\n\nconst resolveProject = async (args: ProjectArgs, mode: string): Promise<ResolvedProject> => {\n const cwd = resolveCwd(args);\n const context = await resolveCodegenContext(cwd, mode, args.config);\n\n return { cwd, entry: resolveEntry(cwd, args.entry), configFile: context.configFile, context };\n};\n\nconst prepareProject = async (args: ProjectArgs, mode: string): Promise<PreparedProject> => {\n const { cwd, entry, context } = await resolveProject(args, mode);\n await ensureGeneratedIn(context, { shouldAnnounce: true, mode });\n\n return { cwd, entry, configFile: context.configFile };\n};\n\nexport { prepareProject, resolveProject };\n"]}
|
|
@@ -18,7 +18,7 @@ const sourceLanguage = (path) => {
|
|
|
18
18
|
};
|
|
19
19
|
const discoverSourceFiles = (dir) => sortStringsBy(globSync("**/{*,.*}", {
|
|
20
20
|
cwd: dir,
|
|
21
|
-
exclude: ["**/{build,coverage,dist,node_modules,out-tsc}/**"],
|
|
21
|
+
exclude: ["**/{build,coverage,dist,node_modules,out-tsc}/**", "**/.gtkx-output-*/**"],
|
|
22
22
|
withFileTypes: true,
|
|
23
23
|
})
|
|
24
24
|
.filter((entry) => entry.isFile())
|