@effect-app/cli 1.23.4 → 1.23.6
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/CHANGELOG.md +13 -0
- package/dist/index.js +116 -153
- package/package.json +1 -1
- package/src/index.ts +248 -252
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @effect-app/cli
|
|
2
2
|
|
|
3
|
+
## 1.23.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- e81f093: remove watch add nuke
|
|
8
|
+
|
|
9
|
+
## 1.23.5
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- de35a0f: add monitors for packagejson
|
|
14
|
+
- 8e1543e: add wrapping of child commands
|
|
15
|
+
|
|
3
16
|
## 1.23.4
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { Args, Command, Options, Prompt } from "@effect/cli";
|
|
5
5
|
import { Command as NodeCommand, FileSystem, Path } from "@effect/platform";
|
|
6
6
|
import { NodeContext, NodeRuntime } from "@effect/platform-node";
|
|
7
|
-
import { Effect, identity, Stream } from "effect";
|
|
7
|
+
import { Effect, identity, Option, Stream } from "effect";
|
|
8
8
|
import { ExtractExportMappingsService } from "./extract.js";
|
|
9
9
|
import { packages } from "./shared.js";
|
|
10
10
|
Effect
|
|
@@ -41,19 +41,6 @@ Effect
|
|
|
41
41
|
// cwd ? NodeCommand.workingDirectory(cwd) : identity,
|
|
42
42
|
// NodeCommand.string
|
|
43
43
|
// )
|
|
44
|
-
/**
|
|
45
|
-
* Creates a file if it doesn't exist or updates the access and modification times of an existing file.
|
|
46
|
-
* This is the effectful equivalent of the Unix `touch` command.
|
|
47
|
-
*
|
|
48
|
-
* @param path - The path to the file to touch
|
|
49
|
-
* @returns An Effect that succeeds with void or fails with a FileSystem error
|
|
50
|
-
*/
|
|
51
|
-
const touch = Effect.fn("touch")(function* (path) {
|
|
52
|
-
const time = new Date();
|
|
53
|
-
yield* fs.utimes(path, time, time).pipe(Effect.catchTag("SystemError", (err) => err.reason === "NotFound"
|
|
54
|
-
? fs.writeFileString(path, "")
|
|
55
|
-
: Effect.fail(err)));
|
|
56
|
-
});
|
|
57
44
|
/**
|
|
58
45
|
* Updates effect-app packages to their latest versions using npm-check-updates.
|
|
59
46
|
* Runs both at workspace root and recursively in all workspace packages.
|
|
@@ -86,7 +73,7 @@ Effect
|
|
|
86
73
|
* @returns An Effect that succeeds when linking is complete
|
|
87
74
|
*/
|
|
88
75
|
const linkPackages = Effect.fnUntraced(function* (effectAppLibsPath) {
|
|
89
|
-
yield* Effect.
|
|
76
|
+
yield* Effect.logInfo("Linking local effect-app packages...");
|
|
90
77
|
const packageJsonPath = "./package.json";
|
|
91
78
|
const packageJsonContent = yield* fs.readFileString(packageJsonPath);
|
|
92
79
|
const pj = JSON.parse(packageJsonContent);
|
|
@@ -101,9 +88,9 @@ Effect
|
|
|
101
88
|
};
|
|
102
89
|
pj.resolutions = resolutions;
|
|
103
90
|
yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2));
|
|
104
|
-
yield* Effect.
|
|
91
|
+
yield* Effect.logInfo("Updated package.json with local file resolutions");
|
|
105
92
|
yield* runNodeCommand("pnpm i");
|
|
106
|
-
yield* Effect.
|
|
93
|
+
yield* Effect.logInfo("Successfully linked local packages");
|
|
107
94
|
});
|
|
108
95
|
/**
|
|
109
96
|
* Unlinks local effect-app packages by removing file resolutions from package.json.
|
|
@@ -113,7 +100,7 @@ Effect
|
|
|
113
100
|
* @returns An Effect that succeeds when unlinking is complete
|
|
114
101
|
*/
|
|
115
102
|
const unlinkPackages = Effect.fnUntraced(function* () {
|
|
116
|
-
yield* Effect.
|
|
103
|
+
yield* Effect.logInfo("Unlinking local effect-app packages...");
|
|
117
104
|
const packageJsonPath = "./package.json";
|
|
118
105
|
const packageJsonContent = yield* fs.readFileString(packageJsonPath);
|
|
119
106
|
const pj = JSON.parse(packageJsonContent);
|
|
@@ -125,9 +112,9 @@ Effect
|
|
|
125
112
|
}, {});
|
|
126
113
|
pj.resolutions = filteredResolutions;
|
|
127
114
|
yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2));
|
|
128
|
-
yield* Effect.
|
|
115
|
+
yield* Effect.logInfo("Removed effect-app file resolutions from package.json");
|
|
129
116
|
yield* runNodeCommand("pnpm i");
|
|
130
|
-
yield* Effect.
|
|
117
|
+
yield* Effect.logInfo("Successfully unlinked local packages");
|
|
131
118
|
})();
|
|
132
119
|
/**
|
|
133
120
|
* Monitors controller files for changes and runs eslint on related controllers.ts/routes.ts files.
|
|
@@ -137,12 +124,9 @@ Effect
|
|
|
137
124
|
* @param debug - Whether to enable debug logging
|
|
138
125
|
* @returns An Effect that sets up controller file monitoring
|
|
139
126
|
*/
|
|
140
|
-
const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(function* (watchPath
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`);
|
|
144
|
-
}
|
|
145
|
-
const watchStream = fileSystem.watch(watchPath, { recursive: true });
|
|
127
|
+
const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(function* (watchPath) {
|
|
128
|
+
yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`);
|
|
129
|
+
const watchStream = fs.watch(watchPath, { recursive: true });
|
|
146
130
|
yield* watchStream
|
|
147
131
|
.pipe(Stream.runForEach(Effect.fn("effa-cli.monitorChildIndexes.handleEvent")(function* (event) {
|
|
148
132
|
const pathParts = event.path.split("/");
|
|
@@ -157,14 +141,12 @@ Effect
|
|
|
157
141
|
.map((f) => [...pathParts.slice(0, pathParts.length - i), f].join("/"));
|
|
158
142
|
const existingFiles = [];
|
|
159
143
|
for (const file of candidateFiles) {
|
|
160
|
-
const exists = yield*
|
|
144
|
+
const exists = yield* fs.exists(file);
|
|
161
145
|
if (exists)
|
|
162
146
|
existingFiles.push(file);
|
|
163
147
|
}
|
|
164
148
|
if (existingFiles.length > 0) {
|
|
165
|
-
|
|
166
|
-
yield* Effect.logInfo(`Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`);
|
|
167
|
-
}
|
|
149
|
+
yield* Effect.logInfo(`Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`);
|
|
168
150
|
const eslintArgs = existingFiles.map((f) => `"../${f}"`).join(" ");
|
|
169
151
|
yield* runNodeCommand(`cd api && pnpm eslint --fix ${eslintArgs}`);
|
|
170
152
|
break;
|
|
@@ -183,19 +165,14 @@ Effect
|
|
|
183
165
|
* @param debug - Whether to enable debug logging
|
|
184
166
|
* @returns An Effect that sets up root index monitoring
|
|
185
167
|
*/
|
|
186
|
-
const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(function* (watchPath, indexFile
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`);
|
|
190
|
-
}
|
|
191
|
-
const watchStream = fileSystem.watch(watchPath);
|
|
168
|
+
const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(function* (watchPath, indexFile) {
|
|
169
|
+
yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`);
|
|
170
|
+
const watchStream = fs.watch(watchPath);
|
|
192
171
|
yield* watchStream
|
|
193
172
|
.pipe(Stream.runForEach(Effect.fn("effa-cli.index-multi.monitorRootIndexes.handleEvent")(function* (event) {
|
|
194
173
|
if (event.path.endsWith(indexFile))
|
|
195
174
|
return;
|
|
196
|
-
|
|
197
|
-
yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`);
|
|
198
|
-
}
|
|
175
|
+
yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`);
|
|
199
176
|
yield* runNodeCommand(`pnpm eslint --fix "${indexFile}"`);
|
|
200
177
|
})))
|
|
201
178
|
.pipe(Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring root indexes in: ${watchPath} -> ${indexFile}`))), Effect.forkScoped);
|
|
@@ -208,88 +185,19 @@ Effect
|
|
|
208
185
|
* @param debug - Whether to enable debug logging
|
|
209
186
|
* @returns An Effect that sets up all index monitoring for the path
|
|
210
187
|
*/
|
|
211
|
-
const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(function* (watchPath
|
|
212
|
-
|
|
213
|
-
if (debug) {
|
|
214
|
-
yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`);
|
|
215
|
-
}
|
|
188
|
+
const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(function* (watchPath) {
|
|
189
|
+
yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`);
|
|
216
190
|
const indexFile = watchPath + "/index.ts";
|
|
217
|
-
const monitors = [monitorChildIndexes(watchPath
|
|
218
|
-
if (yield*
|
|
219
|
-
monitors.push(monitorRootIndexes(watchPath, indexFile
|
|
191
|
+
const monitors = [monitorChildIndexes(watchPath)];
|
|
192
|
+
if (yield* fs.exists(indexFile)) {
|
|
193
|
+
monitors.push(monitorRootIndexes(watchPath, indexFile));
|
|
220
194
|
}
|
|
221
195
|
else {
|
|
222
|
-
yield* Effect.
|
|
223
|
-
}
|
|
224
|
-
if (debug) {
|
|
225
|
-
yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`);
|
|
196
|
+
yield* Effect.logWarning(`Index file ${indexFile} does not exist`);
|
|
226
197
|
}
|
|
198
|
+
yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`);
|
|
227
199
|
yield* Effect.all(monitors, { concurrency: monitors.length });
|
|
228
200
|
});
|
|
229
|
-
/**
|
|
230
|
-
* Watches directories for file changes and updates tsconfig.json and vite.config.ts accordingly.
|
|
231
|
-
* Monitors API resources and models directories for changes using Effect's native file watching.
|
|
232
|
-
*
|
|
233
|
-
* @returns An Effect that sets up file watching streams
|
|
234
|
-
*/
|
|
235
|
-
const watcher = Effect.fn("watch")(function* (debug) {
|
|
236
|
-
yield* Effect.log("Watch API resources and models for changes");
|
|
237
|
-
const dirs = ["../api/src/resources", "../api/src/models"];
|
|
238
|
-
const viteConfigFile = "./vite.config.ts";
|
|
239
|
-
const fileSystem = yield* FileSystem.FileSystem;
|
|
240
|
-
const viteConfigExists = yield* fileSystem.exists(viteConfigFile);
|
|
241
|
-
if (debug) {
|
|
242
|
-
yield* Effect.logInfo("watcher debug mode is enabled");
|
|
243
|
-
}
|
|
244
|
-
// validate directories and filter out non-existing ones
|
|
245
|
-
const existingDirs = [];
|
|
246
|
-
for (const dir of dirs) {
|
|
247
|
-
const dirExists = yield* fileSystem.exists(dir);
|
|
248
|
-
if (dirExists) {
|
|
249
|
-
existingDirs.push(dir);
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
if (existingDirs.length === 0) {
|
|
256
|
-
return yield* Effect.logWarning("No directories to watch - exiting");
|
|
257
|
-
}
|
|
258
|
-
// start watching all existing directories concurrently
|
|
259
|
-
const watchStreams = existingDirs.map((dir) => Effect.gen(function* () {
|
|
260
|
-
if (debug) {
|
|
261
|
-
yield* Effect.logInfo(`Starting to watch directory: ${dir}`);
|
|
262
|
-
}
|
|
263
|
-
const files = [];
|
|
264
|
-
const watchStream = fileSystem.watch(dir, { recursive: true });
|
|
265
|
-
yield* watchStream
|
|
266
|
-
.pipe(Stream.runForEach(Effect.fn("effa-cli.watch.handleEvent")(function* (event) {
|
|
267
|
-
if (debug) {
|
|
268
|
-
yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`);
|
|
269
|
-
}
|
|
270
|
-
// touch tsconfig.json on any file change
|
|
271
|
-
yield* touch("./tsconfig.json");
|
|
272
|
-
if (debug) {
|
|
273
|
-
yield* Effect.logInfo("Updated tsconfig.json");
|
|
274
|
-
}
|
|
275
|
-
// touch vite config only on file updates (not creates/deletes)
|
|
276
|
-
if (viteConfigExists
|
|
277
|
-
&& event._tag === "Update"
|
|
278
|
-
&& !files.includes(event.path)) {
|
|
279
|
-
yield* touch(viteConfigFile);
|
|
280
|
-
if (debug) {
|
|
281
|
-
yield* Effect.logInfo("Updated vite.config.ts");
|
|
282
|
-
}
|
|
283
|
-
files.push(event.path);
|
|
284
|
-
}
|
|
285
|
-
})))
|
|
286
|
-
.pipe(Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped watching directory: ${dir}`))), Effect.forkScoped);
|
|
287
|
-
// also start monitoring indexes in the watched directory
|
|
288
|
-
yield* monitorIndexes(dir, debug);
|
|
289
|
-
}));
|
|
290
|
-
// run all watch streams concurrently
|
|
291
|
-
yield* Effect.all(watchStreams, { concurrency: existingDirs.length });
|
|
292
|
-
});
|
|
293
201
|
/**
|
|
294
202
|
* Updates a package.json file with generated exports mappings for TypeScript modules.
|
|
295
203
|
* Scans TypeScript source files and creates export entries that map module paths
|
|
@@ -301,11 +209,11 @@ Effect
|
|
|
301
209
|
* @returns An Effect that succeeds when the package.json is updated
|
|
302
210
|
*/
|
|
303
211
|
const packagejsonUpdater = Effect.fn("effa-cli.packagejsonUpdater")(function* (startDir, p, levels = 0) {
|
|
304
|
-
yield* Effect.
|
|
212
|
+
yield* Effect.logInfo(`Generating exports for ${p}`);
|
|
305
213
|
const exportMappings = yield* extractExportMappings(path.resolve(startDir, p));
|
|
306
214
|
// if exportMappings is empty skip export generation
|
|
307
215
|
if (exportMappings === "") {
|
|
308
|
-
yield* Effect.
|
|
216
|
+
yield* Effect.logInfo(`No src directory found for ${p}, skipping export generation`);
|
|
309
217
|
return;
|
|
310
218
|
}
|
|
311
219
|
const sortedExportEntries = JSON.parse(`{ ${exportMappings} }`);
|
|
@@ -336,12 +244,66 @@ Effect
|
|
|
336
244
|
};
|
|
337
245
|
const pkgJson = JSON.parse(yield* fs.readFileString(p + "/package.json", "utf-8"));
|
|
338
246
|
pkgJson.exports = packageExports;
|
|
339
|
-
yield* Effect.
|
|
247
|
+
yield* Effect.logInfo(`Writing updated package.json for ${p}`);
|
|
340
248
|
return yield* fs.writeFileString(p + "/package.json", JSON.stringify(pkgJson, null, 2));
|
|
341
249
|
});
|
|
250
|
+
/**
|
|
251
|
+
* Monitors a directory for TypeScript file changes and automatically updates package.json exports.
|
|
252
|
+
* Generates initial package.json exports, then watches the src directory for changes to regenerate exports.
|
|
253
|
+
*
|
|
254
|
+
* @param watchPath - The directory path containing the package.json and src to monitor
|
|
255
|
+
* @param levels - Optional depth limit for export filtering (0 = no limit)
|
|
256
|
+
* @returns An Effect that sets up package.json monitoring
|
|
257
|
+
*/
|
|
258
|
+
const monitorPackageJson = Effect.fn("effa-cli.monitorPackageJson")(function* (startDir, watchPath, levels = 0) {
|
|
259
|
+
yield* packagejsonUpdater(startDir, watchPath, levels);
|
|
260
|
+
const srcPath = watchPath === "." ? "./src" : `${watchPath}/src`;
|
|
261
|
+
if (!(yield* fs.exists(srcPath))) {
|
|
262
|
+
yield* Effect.logWarning(`Source directory ${srcPath} does not exist - skipping monitoring`);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const watchStream = fs.watch(srcPath, { recursive: true });
|
|
266
|
+
yield* watchStream.pipe(Stream.runForEach(Effect.fn("effa-cli.monitorPackageJson.handleEvent")(function* (_) {
|
|
267
|
+
yield* packagejsonUpdater(startDir, watchPath, levels);
|
|
268
|
+
})), Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring package.json for: ${watchPath}`))), Effect.forkScoped);
|
|
269
|
+
});
|
|
342
270
|
/*
|
|
343
271
|
* CLI
|
|
344
272
|
*/
|
|
273
|
+
const WrapAsOption = Options.text("wrap").pipe(Options.withAlias("w"), Options.optional, Options.withDescription("Wrap child bash command: the lifetime of the CLI command will be tied to the child process"));
|
|
274
|
+
// has prio over WrapAsOption
|
|
275
|
+
const WrapAsArg = Args
|
|
276
|
+
.text({
|
|
277
|
+
name: "wrap"
|
|
278
|
+
})
|
|
279
|
+
.pipe(Args.atLeast(1), Args.optional, Args.withDescription("Wrap child bash command: the lifetime of the CLI command will be tied to the child process"));
|
|
280
|
+
/**
|
|
281
|
+
* Creates a command that automatically includes wrap functionality for executing child bash commands.
|
|
282
|
+
* Combines both option-based (--wrap) and argument-based wrap parameters, giving priority to arguments.
|
|
283
|
+
* If a wrap command is provided, it will be executed **after** the main command handler.
|
|
284
|
+
*
|
|
285
|
+
* @param name - The command name
|
|
286
|
+
* @param config - The command configuration (options, args, etc.)
|
|
287
|
+
* @param handler - The main command handler function
|
|
288
|
+
* @param completionMessage - Optional message to log when the command completes
|
|
289
|
+
* @returns A Command with integrated wrap functionality
|
|
290
|
+
*/
|
|
291
|
+
const makeCommandWithWrap = (name, config, handler, completionMessage) => Command.make(name, { ...config, wo: WrapAsOption, wa: WrapAsArg }, Effect.fn("effa-cli.withWrapHandler")(function* (_) {
|
|
292
|
+
const { wa, wo, ...cfg } = _;
|
|
293
|
+
if (completionMessage) {
|
|
294
|
+
yield* Effect.addFinalizer(() => Effect.logInfo(completionMessage));
|
|
295
|
+
}
|
|
296
|
+
const wrapOption = Option.orElse(wa, () => wo);
|
|
297
|
+
yield* handler(cfg);
|
|
298
|
+
if (Option.isSome(wrapOption)) {
|
|
299
|
+
const val = Array.isArray(wrapOption.value)
|
|
300
|
+
? wrapOption.value.join(" ")
|
|
301
|
+
: wrapOption.value;
|
|
302
|
+
yield* Effect.logInfo(`Spawning child command: ${val}`);
|
|
303
|
+
yield* runNodeCommand(val);
|
|
304
|
+
}
|
|
305
|
+
return;
|
|
306
|
+
}, (_) => Effect.scoped(_)));
|
|
345
307
|
const EffectAppLibsPath = Args
|
|
346
308
|
.directory({
|
|
347
309
|
exists: "yes",
|
|
@@ -360,7 +322,7 @@ Effect
|
|
|
360
322
|
.pipe(Command.withDescription("Remove effect-app file resolutions and restore npm registry packages"));
|
|
361
323
|
const ue = Command
|
|
362
324
|
.make("ue", {}, Effect.fn("effa-cli.ue")(function* ({}) {
|
|
363
|
-
yield* Effect.
|
|
325
|
+
yield* Effect.logInfo("Update effect-app and/or effect packages");
|
|
364
326
|
const prompted = yield* Prompt.select({
|
|
365
327
|
choices: [
|
|
366
328
|
{
|
|
@@ -391,20 +353,12 @@ Effect
|
|
|
391
353
|
}
|
|
392
354
|
}))
|
|
393
355
|
.pipe(Command.withDescription("Update effect-app and/or effect packages"));
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
.make("watch", { debug: DebugOption }, Effect.fn("effa-cli.watch")(function* ({ debug }) {
|
|
397
|
-
return yield* watcher(debug);
|
|
398
|
-
}))
|
|
399
|
-
.pipe(Command.withDescription("Watch API resources and models for changes and update tsconfig.json and vite.config.ts accordingly"));
|
|
400
|
-
const indexMulti = Command
|
|
401
|
-
.make("index-multi", { debug: DebugOption }, Effect.fn("effa-cli.index-multi")(function* ({ debug }) {
|
|
402
|
-
yield* Effect.log("Starting multi-index monitoring");
|
|
356
|
+
const indexMulti = makeCommandWithWrap("index-multi", {}, Effect.fn("effa-cli.index-multi")(function* ({}) {
|
|
357
|
+
yield* Effect.logInfo("Starting multi-index monitoring");
|
|
403
358
|
const dirs = ["./api/src"];
|
|
404
|
-
const fileSystem = yield* FileSystem.FileSystem;
|
|
405
359
|
const existingDirs = [];
|
|
406
360
|
for (const dir of dirs) {
|
|
407
|
-
const dirExists = yield*
|
|
361
|
+
const dirExists = yield* fs.exists(dir);
|
|
408
362
|
if (dirExists) {
|
|
409
363
|
existingDirs.push(dir);
|
|
410
364
|
}
|
|
@@ -412,22 +366,17 @@ Effect
|
|
|
412
366
|
yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`);
|
|
413
367
|
}
|
|
414
368
|
}
|
|
415
|
-
|
|
416
|
-
return yield* Effect.logWarning("No directories to monitor - exiting");
|
|
417
|
-
}
|
|
418
|
-
const monitors = existingDirs.map((dir) => monitorIndexes(dir, debug));
|
|
369
|
+
const monitors = existingDirs.map((dir) => monitorIndexes(dir));
|
|
419
370
|
yield* Effect.all(monitors, { concurrency: monitors.length });
|
|
420
|
-
}))
|
|
371
|
+
}), "Stopped multi-index monitoring")
|
|
421
372
|
.pipe(Command.withDescription("Monitor multiple directories for index and controller file changes"));
|
|
422
|
-
const packagejson =
|
|
423
|
-
.make("packagejson", {}, Effect.fn("effa-cli.packagejson")(function* ({}) {
|
|
373
|
+
const packagejson = makeCommandWithWrap("packagejson", {}, Effect.fn("effa-cli.packagejson")(function* ({}) {
|
|
424
374
|
// https://nodejs.org/api/path.html#pathresolvepaths
|
|
425
375
|
const startDir = path.resolve();
|
|
426
|
-
return yield*
|
|
427
|
-
}))
|
|
376
|
+
return yield* monitorPackageJson(startDir, ".");
|
|
377
|
+
}), "Stopped monitoring root package.json exports")
|
|
428
378
|
.pipe(Command.withDescription("Generate and update root-level package.json exports mappings for TypeScript modules"));
|
|
429
|
-
const packagejsonPackages =
|
|
430
|
-
.make("packagejson-packages", {}, Effect.fn("effa-cli.packagejson-packages")(function* ({}) {
|
|
379
|
+
const packagejsonPackages = makeCommandWithWrap("packagejson-packages", {}, Effect.fn("effa-cli.packagejson-packages")(function* ({}) {
|
|
431
380
|
// https://nodejs.org/api/path.html#pathresolvepaths
|
|
432
381
|
const startDir = path.resolve();
|
|
433
382
|
const packagesDir = path.join(startDir, "packages");
|
|
@@ -450,19 +399,33 @@ Effect
|
|
|
450
399
|
validPackages.push(packagePath);
|
|
451
400
|
}
|
|
452
401
|
}
|
|
453
|
-
|
|
454
|
-
return yield* Effect.logWarning("No valid packages found to update");
|
|
455
|
-
}
|
|
456
|
-
yield* Effect.log(`Found ${validPackages.length} packages to update`);
|
|
402
|
+
yield* Effect.logInfo(`Found ${validPackages.length} packages to update`);
|
|
457
403
|
// update each package sequentially
|
|
458
|
-
yield* Effect.all(validPackages.map(
|
|
404
|
+
yield* Effect.all(validPackages.map(Effect.fnUntraced(function* (packagePath) {
|
|
459
405
|
const relativePackagePath = path.relative(startDir, packagePath);
|
|
460
|
-
yield* Effect.
|
|
461
|
-
return yield*
|
|
406
|
+
yield* Effect.logInfo(`Updating ${relativePackagePath}`);
|
|
407
|
+
return yield* monitorPackageJson(startDir, relativePackagePath);
|
|
462
408
|
})));
|
|
463
|
-
yield* Effect.
|
|
464
|
-
}))
|
|
409
|
+
yield* Effect.logInfo("All packages updated successfully");
|
|
410
|
+
}), "Stopped monitoring package.json exports for all packages")
|
|
465
411
|
.pipe(Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo"));
|
|
412
|
+
const DryRunOption = Options.boolean("dry-run").pipe(Options.withDescription("Show what would be done without making changes"));
|
|
413
|
+
const PruneStoreOption = Options.boolean("store-prune").pipe(Options.withDescription("Prune the package manager store"));
|
|
414
|
+
const nuke = Command
|
|
415
|
+
.make("nuke", { dryRun: DryRunOption, storePrune: PruneStoreOption }, Effect.fn("effa-cli.nuke")(function* ({ dryRun, storePrune }) {
|
|
416
|
+
yield* Effect.logInfo(dryRun ? "Performing dry run cleanup..." : "Performing nuclear cleanup...");
|
|
417
|
+
if (dryRun) {
|
|
418
|
+
yield* runNodeCommand("find . -depth \\( -type d \\( -name 'node_modules' -o -name '.nuxt' -o -name 'dist' -o -name '.output' -o -name '.nitro' -o -name '.cache' -o -name 'test-results' -o -name 'test-out' -o -name 'coverage' \\) -print \\) -o \\( -type f \\( -name '*.log' -o -name '*.tsbuildinfo' \\) -print \\)");
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
yield* runNodeCommand("find . -depth \\( -type d \\( -name 'node_modules' -o -name '.nuxt' -o -name 'dist' -o -name '.output' -o -name '.nitro' -o -name '.cache' -o -name 'test-results' -o -name 'test-out' -o -name 'coverage' \\) -exec rm -rf -- {} + \\) -o \\( -type f \\( -name '*.log' -o -name '*.tsbuildinfo' \\) -delete \\)");
|
|
422
|
+
if (storePrune) {
|
|
423
|
+
yield* runNodeCommand("pnpm store prune");
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
yield* Effect.logInfo("Cleanup operation completed");
|
|
427
|
+
}))
|
|
428
|
+
.pipe(Command.withDescription("Nuclear cleanup command: removes all generated files and cleans the workspace"));
|
|
466
429
|
// configure CLI
|
|
467
430
|
const cli = Command.run(Command
|
|
468
431
|
.make("effa")
|
|
@@ -470,10 +433,10 @@ Effect
|
|
|
470
433
|
ue,
|
|
471
434
|
link,
|
|
472
435
|
unlink,
|
|
473
|
-
watch,
|
|
474
436
|
indexMulti,
|
|
475
437
|
packagejson,
|
|
476
|
-
packagejsonPackages
|
|
438
|
+
packagejsonPackages,
|
|
439
|
+
nuke
|
|
477
440
|
])), {
|
|
478
441
|
name: "Effect-App CLI by jfet97 ❤️",
|
|
479
442
|
version: "v1.0.0"
|
|
@@ -481,4 +444,4 @@ Effect
|
|
|
481
444
|
return yield* cli(process.argv);
|
|
482
445
|
})()
|
|
483
446
|
.pipe(Effect.scoped, Effect.provide(NodeContext.layer), NodeRuntime.runMain);
|
|
484
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0RBQWtEO0FBQ2xELHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDakQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFdEMsTUFBTTtLQUNILEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdkIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQTtJQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQzdCLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLENBQUMsNEJBQTRCLENBQUE7SUFFakUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQTtJQUU5RTs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBWSxFQUFFLEVBQUUsQ0FDbkQsV0FBVztTQUNSLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxF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
|
|
447
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0RBQWtEO0FBQ2xELHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUloRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFjLE1BQU0sUUFBUSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE1BQU07S0FDSCxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUE7SUFDdkMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtJQUM3QixNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxDQUFDLDRCQUE0QixDQUFBO0lBRWpFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUE7SUFFOUU7Ozs7Ozs7T0FPRztJQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBVyxFQUFFLEdBQVksRUFBRSxFQUFFLENBQ25ELFdBQVc7U0FDUixJQUFJLENBQUMsSUFBSSxF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
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
import { Args, Command, Options, Prompt } from "@effect/cli"
|
|
5
5
|
import { Command as NodeCommand, FileSystem, Path } from "@effect/platform"
|
|
6
6
|
import { NodeContext, NodeRuntime } from "@effect/platform-node"
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
import { type CommandExecutor } from "@effect/platform/CommandExecutor"
|
|
9
|
+
import { type PlatformError } from "@effect/platform/Error"
|
|
10
|
+
import { Effect, identity, Option, Stream, type Types } from "effect"
|
|
8
11
|
import { ExtractExportMappingsService } from "./extract.js"
|
|
9
12
|
import { packages } from "./shared.js"
|
|
10
13
|
|
|
@@ -52,24 +55,6 @@ Effect
|
|
|
52
55
|
// NodeCommand.string
|
|
53
56
|
// )
|
|
54
57
|
|
|
55
|
-
/**
|
|
56
|
-
* Creates a file if it doesn't exist or updates the access and modification times of an existing file.
|
|
57
|
-
* This is the effectful equivalent of the Unix `touch` command.
|
|
58
|
-
*
|
|
59
|
-
* @param path - The path to the file to touch
|
|
60
|
-
* @returns An Effect that succeeds with void or fails with a FileSystem error
|
|
61
|
-
*/
|
|
62
|
-
const touch = Effect.fn("touch")(function*(path: string) {
|
|
63
|
-
const time = new Date()
|
|
64
|
-
|
|
65
|
-
yield* fs.utimes(path, time, time).pipe(
|
|
66
|
-
Effect.catchTag("SystemError", (err) =>
|
|
67
|
-
err.reason === "NotFound"
|
|
68
|
-
? fs.writeFileString(path, "")
|
|
69
|
-
: Effect.fail(err))
|
|
70
|
-
)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
58
|
/**
|
|
74
59
|
* Updates effect-app packages to their latest versions using npm-check-updates.
|
|
75
60
|
* Runs both at workspace root and recursively in all workspace packages.
|
|
@@ -104,7 +89,7 @@ Effect
|
|
|
104
89
|
* @returns An Effect that succeeds when linking is complete
|
|
105
90
|
*/
|
|
106
91
|
const linkPackages = Effect.fnUntraced(function*(effectAppLibsPath: string) {
|
|
107
|
-
yield* Effect.
|
|
92
|
+
yield* Effect.logInfo("Linking local effect-app packages...")
|
|
108
93
|
|
|
109
94
|
const packageJsonPath = "./package.json"
|
|
110
95
|
const packageJsonContent = yield* fs.readFileString(packageJsonPath)
|
|
@@ -123,11 +108,11 @@ Effect
|
|
|
123
108
|
pj.resolutions = resolutions
|
|
124
109
|
|
|
125
110
|
yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2))
|
|
126
|
-
yield* Effect.
|
|
111
|
+
yield* Effect.logInfo("Updated package.json with local file resolutions")
|
|
127
112
|
|
|
128
113
|
yield* runNodeCommand("pnpm i")
|
|
129
114
|
|
|
130
|
-
yield* Effect.
|
|
115
|
+
yield* Effect.logInfo("Successfully linked local packages")
|
|
131
116
|
})
|
|
132
117
|
|
|
133
118
|
/**
|
|
@@ -138,7 +123,7 @@ Effect
|
|
|
138
123
|
* @returns An Effect that succeeds when unlinking is complete
|
|
139
124
|
*/
|
|
140
125
|
const unlinkPackages = Effect.fnUntraced(function*() {
|
|
141
|
-
yield* Effect.
|
|
126
|
+
yield* Effect.logInfo("Unlinking local effect-app packages...")
|
|
142
127
|
|
|
143
128
|
const packageJsonPath = "./package.json"
|
|
144
129
|
const packageJsonContent = yield* fs.readFileString(packageJsonPath)
|
|
@@ -156,10 +141,10 @@ Effect
|
|
|
156
141
|
pj.resolutions = filteredResolutions
|
|
157
142
|
|
|
158
143
|
yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2))
|
|
159
|
-
yield* Effect.
|
|
144
|
+
yield* Effect.logInfo("Removed effect-app file resolutions from package.json")
|
|
160
145
|
|
|
161
146
|
yield* runNodeCommand("pnpm i")
|
|
162
|
-
yield* Effect.
|
|
147
|
+
yield* Effect.logInfo("Successfully unlinked local packages")
|
|
163
148
|
})()
|
|
164
149
|
|
|
165
150
|
/**
|
|
@@ -171,14 +156,10 @@ Effect
|
|
|
171
156
|
* @returns An Effect that sets up controller file monitoring
|
|
172
157
|
*/
|
|
173
158
|
const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(
|
|
174
|
-
function*(watchPath: string
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (debug) {
|
|
178
|
-
yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`)
|
|
179
|
-
}
|
|
159
|
+
function*(watchPath: string) {
|
|
160
|
+
yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`)
|
|
180
161
|
|
|
181
|
-
const watchStream =
|
|
162
|
+
const watchStream = fs.watch(watchPath, { recursive: true })
|
|
182
163
|
|
|
183
164
|
yield* watchStream
|
|
184
165
|
.pipe(
|
|
@@ -199,16 +180,14 @@ Effect
|
|
|
199
180
|
|
|
200
181
|
const existingFiles: string[] = []
|
|
201
182
|
for (const file of candidateFiles) {
|
|
202
|
-
const exists = yield*
|
|
183
|
+
const exists = yield* fs.exists(file)
|
|
203
184
|
if (exists) existingFiles.push(file)
|
|
204
185
|
}
|
|
205
186
|
|
|
206
187
|
if (existingFiles.length > 0) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
)
|
|
211
|
-
}
|
|
188
|
+
yield* Effect.logInfo(
|
|
189
|
+
`Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`
|
|
190
|
+
)
|
|
212
191
|
|
|
213
192
|
const eslintArgs = existingFiles.map((f) => `"../${f}"`).join(" ")
|
|
214
193
|
yield* runNodeCommand(`cd api && pnpm eslint --fix ${eslintArgs}`)
|
|
@@ -238,14 +217,10 @@ Effect
|
|
|
238
217
|
* @returns An Effect that sets up root index monitoring
|
|
239
218
|
*/
|
|
240
219
|
const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(
|
|
241
|
-
function*(watchPath: string, indexFile: string
|
|
242
|
-
|
|
220
|
+
function*(watchPath: string, indexFile: string) {
|
|
221
|
+
yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`)
|
|
243
222
|
|
|
244
|
-
|
|
245
|
-
yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`)
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
const watchStream = fileSystem.watch(watchPath)
|
|
223
|
+
const watchStream = fs.watch(watchPath)
|
|
249
224
|
|
|
250
225
|
yield* watchStream
|
|
251
226
|
.pipe(
|
|
@@ -253,9 +228,7 @@ Effect
|
|
|
253
228
|
Effect.fn("effa-cli.index-multi.monitorRootIndexes.handleEvent")(function*(event) {
|
|
254
229
|
if (event.path.endsWith(indexFile)) return
|
|
255
230
|
|
|
256
|
-
|
|
257
|
-
yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`)
|
|
258
|
-
}
|
|
231
|
+
yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`)
|
|
259
232
|
|
|
260
233
|
yield* runNodeCommand(`pnpm eslint --fix "${indexFile}"`)
|
|
261
234
|
})
|
|
@@ -281,120 +254,25 @@ Effect
|
|
|
281
254
|
* @returns An Effect that sets up all index monitoring for the path
|
|
282
255
|
*/
|
|
283
256
|
const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(
|
|
284
|
-
function*(watchPath: string
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
if (debug) {
|
|
288
|
-
yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`)
|
|
289
|
-
}
|
|
257
|
+
function*(watchPath: string) {
|
|
258
|
+
yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`)
|
|
290
259
|
|
|
291
260
|
const indexFile = watchPath + "/index.ts"
|
|
292
261
|
|
|
293
|
-
const monitors = [monitorChildIndexes(watchPath
|
|
262
|
+
const monitors = [monitorChildIndexes(watchPath)]
|
|
294
263
|
|
|
295
|
-
if (yield*
|
|
296
|
-
monitors.push(monitorRootIndexes(watchPath, indexFile
|
|
264
|
+
if (yield* fs.exists(indexFile)) {
|
|
265
|
+
monitors.push(monitorRootIndexes(watchPath, indexFile))
|
|
297
266
|
} else {
|
|
298
|
-
yield* Effect.
|
|
267
|
+
yield* Effect.logWarning(`Index file ${indexFile} does not exist`)
|
|
299
268
|
}
|
|
300
269
|
|
|
301
|
-
|
|
302
|
-
yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`)
|
|
303
|
-
}
|
|
270
|
+
yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`)
|
|
304
271
|
|
|
305
272
|
yield* Effect.all(monitors, { concurrency: monitors.length })
|
|
306
273
|
}
|
|
307
274
|
)
|
|
308
275
|
|
|
309
|
-
/**
|
|
310
|
-
* Watches directories for file changes and updates tsconfig.json and vite.config.ts accordingly.
|
|
311
|
-
* Monitors API resources and models directories for changes using Effect's native file watching.
|
|
312
|
-
*
|
|
313
|
-
* @returns An Effect that sets up file watching streams
|
|
314
|
-
*/
|
|
315
|
-
const watcher = Effect.fn("watch")(function*(debug: boolean) {
|
|
316
|
-
yield* Effect.log("Watch API resources and models for changes")
|
|
317
|
-
|
|
318
|
-
const dirs = ["../api/src/resources", "../api/src/models"]
|
|
319
|
-
const viteConfigFile = "./vite.config.ts"
|
|
320
|
-
const fileSystem = yield* FileSystem.FileSystem
|
|
321
|
-
|
|
322
|
-
const viteConfigExists = yield* fileSystem.exists(viteConfigFile)
|
|
323
|
-
|
|
324
|
-
if (debug) {
|
|
325
|
-
yield* Effect.logInfo("watcher debug mode is enabled")
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// validate directories and filter out non-existing ones
|
|
329
|
-
const existingDirs: string[] = []
|
|
330
|
-
for (const dir of dirs) {
|
|
331
|
-
const dirExists = yield* fileSystem.exists(dir)
|
|
332
|
-
if (dirExists) {
|
|
333
|
-
existingDirs.push(dir)
|
|
334
|
-
} else {
|
|
335
|
-
yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`)
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
if (existingDirs.length === 0) {
|
|
340
|
-
return yield* Effect.logWarning("No directories to watch - exiting")
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
// start watching all existing directories concurrently
|
|
344
|
-
const watchStreams = existingDirs.map((dir) =>
|
|
345
|
-
Effect.gen(function*() {
|
|
346
|
-
if (debug) {
|
|
347
|
-
yield* Effect.logInfo(`Starting to watch directory: ${dir}`)
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
const files: string[] = []
|
|
351
|
-
const watchStream = fileSystem.watch(dir, { recursive: true })
|
|
352
|
-
|
|
353
|
-
yield* watchStream
|
|
354
|
-
.pipe(
|
|
355
|
-
Stream.runForEach(
|
|
356
|
-
Effect.fn("effa-cli.watch.handleEvent")(function*(event) {
|
|
357
|
-
if (debug) {
|
|
358
|
-
yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`)
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// touch tsconfig.json on any file change
|
|
362
|
-
yield* touch("./tsconfig.json")
|
|
363
|
-
if (debug) {
|
|
364
|
-
yield* Effect.logInfo("Updated tsconfig.json")
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
// touch vite config only on file updates (not creates/deletes)
|
|
368
|
-
if (
|
|
369
|
-
viteConfigExists
|
|
370
|
-
&& event._tag === "Update"
|
|
371
|
-
&& !files.includes(event.path)
|
|
372
|
-
) {
|
|
373
|
-
yield* touch(viteConfigFile)
|
|
374
|
-
if (debug) {
|
|
375
|
-
yield* Effect.logInfo("Updated vite.config.ts")
|
|
376
|
-
}
|
|
377
|
-
files.push(event.path)
|
|
378
|
-
}
|
|
379
|
-
})
|
|
380
|
-
)
|
|
381
|
-
)
|
|
382
|
-
.pipe(
|
|
383
|
-
Effect.andThen(
|
|
384
|
-
Effect.addFinalizer(() => Effect.logInfo(`Stopped watching directory: ${dir}`))
|
|
385
|
-
),
|
|
386
|
-
Effect.forkScoped
|
|
387
|
-
)
|
|
388
|
-
|
|
389
|
-
// also start monitoring indexes in the watched directory
|
|
390
|
-
yield* monitorIndexes(dir, debug)
|
|
391
|
-
})
|
|
392
|
-
)
|
|
393
|
-
|
|
394
|
-
// run all watch streams concurrently
|
|
395
|
-
yield* Effect.all(watchStreams, { concurrency: existingDirs.length })
|
|
396
|
-
})
|
|
397
|
-
|
|
398
276
|
/**
|
|
399
277
|
* Updates a package.json file with generated exports mappings for TypeScript modules.
|
|
400
278
|
* Scans TypeScript source files and creates export entries that map module paths
|
|
@@ -407,13 +285,13 @@ Effect
|
|
|
407
285
|
*/
|
|
408
286
|
const packagejsonUpdater = Effect.fn("effa-cli.packagejsonUpdater")(
|
|
409
287
|
function*(startDir: string, p: string, levels = 0) {
|
|
410
|
-
yield* Effect.
|
|
288
|
+
yield* Effect.logInfo(`Generating exports for ${p}`)
|
|
411
289
|
|
|
412
290
|
const exportMappings = yield* extractExportMappings(path.resolve(startDir, p))
|
|
413
291
|
|
|
414
292
|
// if exportMappings is empty skip export generation
|
|
415
293
|
if (exportMappings === "") {
|
|
416
|
-
yield* Effect.
|
|
294
|
+
yield* Effect.logInfo(`No src directory found for ${p}, skipping export generation`)
|
|
417
295
|
return
|
|
418
296
|
}
|
|
419
297
|
|
|
@@ -460,7 +338,7 @@ Effect
|
|
|
460
338
|
const pkgJson = JSON.parse(yield* fs.readFileString(p + "/package.json", "utf-8"))
|
|
461
339
|
pkgJson.exports = packageExports
|
|
462
340
|
|
|
463
|
-
yield* Effect.
|
|
341
|
+
yield* Effect.logInfo(`Writing updated package.json for ${p}`)
|
|
464
342
|
|
|
465
343
|
return yield* fs.writeFileString(
|
|
466
344
|
p + "/package.json",
|
|
@@ -469,10 +347,118 @@ Effect
|
|
|
469
347
|
}
|
|
470
348
|
)
|
|
471
349
|
|
|
350
|
+
/**
|
|
351
|
+
* Monitors a directory for TypeScript file changes and automatically updates package.json exports.
|
|
352
|
+
* Generates initial package.json exports, then watches the src directory for changes to regenerate exports.
|
|
353
|
+
*
|
|
354
|
+
* @param watchPath - The directory path containing the package.json and src to monitor
|
|
355
|
+
* @param levels - Optional depth limit for export filtering (0 = no limit)
|
|
356
|
+
* @returns An Effect that sets up package.json monitoring
|
|
357
|
+
*/
|
|
358
|
+
const monitorPackageJson = Effect.fn("effa-cli.monitorPackageJson")(
|
|
359
|
+
function*(startDir: string, watchPath: string, levels = 0) {
|
|
360
|
+
yield* packagejsonUpdater(startDir, watchPath, levels)
|
|
361
|
+
|
|
362
|
+
const srcPath = watchPath === "." ? "./src" : `${watchPath}/src`
|
|
363
|
+
|
|
364
|
+
if (!(yield* fs.exists(srcPath))) {
|
|
365
|
+
yield* Effect.logWarning(`Source directory ${srcPath} does not exist - skipping monitoring`)
|
|
366
|
+
return
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
const watchStream = fs.watch(srcPath, { recursive: true })
|
|
370
|
+
|
|
371
|
+
yield* watchStream.pipe(
|
|
372
|
+
Stream.runForEach(
|
|
373
|
+
Effect.fn("effa-cli.monitorPackageJson.handleEvent")(function*(_) {
|
|
374
|
+
yield* packagejsonUpdater(startDir, watchPath, levels)
|
|
375
|
+
})
|
|
376
|
+
),
|
|
377
|
+
Effect.andThen(
|
|
378
|
+
Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring package.json for: ${watchPath}`))
|
|
379
|
+
),
|
|
380
|
+
Effect.forkScoped
|
|
381
|
+
)
|
|
382
|
+
}
|
|
383
|
+
)
|
|
384
|
+
|
|
472
385
|
/*
|
|
473
386
|
* CLI
|
|
474
387
|
*/
|
|
475
388
|
|
|
389
|
+
const WrapAsOption = Options.text("wrap").pipe(
|
|
390
|
+
Options.withAlias("w"),
|
|
391
|
+
Options.optional,
|
|
392
|
+
Options.withDescription(
|
|
393
|
+
"Wrap child bash command: the lifetime of the CLI command will be tied to the child process"
|
|
394
|
+
)
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
// has prio over WrapAsOption
|
|
398
|
+
const WrapAsArg = Args
|
|
399
|
+
.text({
|
|
400
|
+
name: "wrap"
|
|
401
|
+
})
|
|
402
|
+
.pipe(
|
|
403
|
+
Args.atLeast(1),
|
|
404
|
+
Args.optional,
|
|
405
|
+
Args.withDescription(
|
|
406
|
+
"Wrap child bash command: the lifetime of the CLI command will be tied to the child process"
|
|
407
|
+
)
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Creates a command that automatically includes wrap functionality for executing child bash commands.
|
|
412
|
+
* Combines both option-based (--wrap) and argument-based wrap parameters, giving priority to arguments.
|
|
413
|
+
* If a wrap command is provided, it will be executed **after** the main command handler.
|
|
414
|
+
*
|
|
415
|
+
* @param name - The command name
|
|
416
|
+
* @param config - The command configuration (options, args, etc.)
|
|
417
|
+
* @param handler - The main command handler function
|
|
418
|
+
* @param completionMessage - Optional message to log when the command completes
|
|
419
|
+
* @returns A Command with integrated wrap functionality
|
|
420
|
+
*/
|
|
421
|
+
const makeCommandWithWrap = <Name extends string, const Config extends Command.Command.Config, R, E>(
|
|
422
|
+
name: Name,
|
|
423
|
+
config: Config,
|
|
424
|
+
handler: (_: Types.Simplify<Command.Command.ParseConfig<Config>>) => Effect.Effect<void, E, R>,
|
|
425
|
+
completionMessage?: string
|
|
426
|
+
): Command.Command<
|
|
427
|
+
Name,
|
|
428
|
+
CommandExecutor | R,
|
|
429
|
+
PlatformError | E,
|
|
430
|
+
Types.Simplify<Command.Command.ParseConfig<Config>>
|
|
431
|
+
> =>
|
|
432
|
+
Command.make(
|
|
433
|
+
name,
|
|
434
|
+
{ ...config, wo: WrapAsOption, wa: WrapAsArg },
|
|
435
|
+
Effect.fn("effa-cli.withWrapHandler")(function*(_) {
|
|
436
|
+
const { wa, wo, ...cfg } = _ as unknown as {
|
|
437
|
+
wo: Option.Option<string>
|
|
438
|
+
wa: Option.Option<[string, ...string[]]>
|
|
439
|
+
} & Types.Simplify<Command.Command.ParseConfig<Config>>
|
|
440
|
+
|
|
441
|
+
if (completionMessage) {
|
|
442
|
+
yield* Effect.addFinalizer(() => Effect.logInfo(completionMessage))
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
const wrapOption = Option.orElse(wa, () => wo)
|
|
446
|
+
|
|
447
|
+
yield* handler(cfg as any)
|
|
448
|
+
|
|
449
|
+
if (Option.isSome(wrapOption)) {
|
|
450
|
+
const val = Array.isArray(wrapOption.value)
|
|
451
|
+
? wrapOption.value.join(" ")
|
|
452
|
+
: wrapOption.value
|
|
453
|
+
|
|
454
|
+
yield* Effect.logInfo(`Spawning child command: ${val}`)
|
|
455
|
+
yield* runNodeCommand(val)
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return
|
|
459
|
+
}, (_) => Effect.scoped(_))
|
|
460
|
+
)
|
|
461
|
+
|
|
476
462
|
const EffectAppLibsPath = Args
|
|
477
463
|
.directory({
|
|
478
464
|
exists: "yes",
|
|
@@ -508,7 +494,7 @@ Effect
|
|
|
508
494
|
"ue",
|
|
509
495
|
{},
|
|
510
496
|
Effect.fn("effa-cli.ue")(function*({}) {
|
|
511
|
-
yield* Effect.
|
|
497
|
+
yield* Effect.logInfo("Update effect-app and/or effect packages")
|
|
512
498
|
|
|
513
499
|
const prompted = yield* Prompt.select({
|
|
514
500
|
choices: [
|
|
@@ -551,130 +537,140 @@ Effect
|
|
|
551
537
|
)
|
|
552
538
|
.pipe(Command.withDescription("Update effect-app and/or effect packages"))
|
|
553
539
|
|
|
554
|
-
const
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
"Watch API resources and models for changes and update tsconfig.json and vite.config.ts accordingly"
|
|
570
|
-
)
|
|
571
|
-
)
|
|
572
|
-
|
|
573
|
-
const indexMulti = Command
|
|
574
|
-
.make(
|
|
575
|
-
"index-multi",
|
|
576
|
-
{ debug: DebugOption },
|
|
577
|
-
Effect.fn("effa-cli.index-multi")(function*({ debug }) {
|
|
578
|
-
yield* Effect.log("Starting multi-index monitoring")
|
|
579
|
-
|
|
580
|
-
const dirs = ["./api/src"]
|
|
581
|
-
const fileSystem = yield* FileSystem.FileSystem
|
|
582
|
-
|
|
583
|
-
const existingDirs: string[] = []
|
|
584
|
-
for (const dir of dirs) {
|
|
585
|
-
const dirExists = yield* fileSystem.exists(dir)
|
|
586
|
-
if (dirExists) {
|
|
587
|
-
existingDirs.push(dir)
|
|
588
|
-
} else {
|
|
589
|
-
yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`)
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
if (existingDirs.length === 0) {
|
|
594
|
-
return yield* Effect.logWarning("No directories to monitor - exiting")
|
|
540
|
+
const indexMulti = makeCommandWithWrap(
|
|
541
|
+
"index-multi",
|
|
542
|
+
{},
|
|
543
|
+
Effect.fn("effa-cli.index-multi")(function*({}) {
|
|
544
|
+
yield* Effect.logInfo("Starting multi-index monitoring")
|
|
545
|
+
|
|
546
|
+
const dirs = ["./api/src"]
|
|
547
|
+
|
|
548
|
+
const existingDirs: string[] = []
|
|
549
|
+
for (const dir of dirs) {
|
|
550
|
+
const dirExists = yield* fs.exists(dir)
|
|
551
|
+
if (dirExists) {
|
|
552
|
+
existingDirs.push(dir)
|
|
553
|
+
} else {
|
|
554
|
+
yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`)
|
|
595
555
|
}
|
|
556
|
+
}
|
|
596
557
|
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
558
|
+
const monitors = existingDirs.map((dir) => monitorIndexes(dir))
|
|
559
|
+
yield* Effect.all(monitors, { concurrency: monitors.length })
|
|
560
|
+
}),
|
|
561
|
+
"Stopped multi-index monitoring"
|
|
562
|
+
)
|
|
601
563
|
.pipe(
|
|
602
564
|
Command.withDescription(
|
|
603
565
|
"Monitor multiple directories for index and controller file changes"
|
|
604
566
|
)
|
|
605
567
|
)
|
|
606
568
|
|
|
607
|
-
const packagejson =
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
const startDir = path.resolve()
|
|
569
|
+
const packagejson = makeCommandWithWrap(
|
|
570
|
+
"packagejson",
|
|
571
|
+
{},
|
|
572
|
+
Effect.fn("effa-cli.packagejson")(function*({}) {
|
|
573
|
+
// https://nodejs.org/api/path.html#pathresolvepaths
|
|
574
|
+
const startDir = path.resolve()
|
|
614
575
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
576
|
+
return yield* monitorPackageJson(startDir, ".")
|
|
577
|
+
}),
|
|
578
|
+
"Stopped monitoring root package.json exports"
|
|
579
|
+
)
|
|
618
580
|
.pipe(
|
|
619
581
|
Command.withDescription("Generate and update root-level package.json exports mappings for TypeScript modules")
|
|
620
582
|
)
|
|
621
583
|
|
|
622
|
-
const packagejsonPackages =
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
const startDir = path.resolve()
|
|
584
|
+
const packagejsonPackages = makeCommandWithWrap(
|
|
585
|
+
"packagejson-packages",
|
|
586
|
+
{},
|
|
587
|
+
Effect.fn("effa-cli.packagejson-packages")(function*({}) {
|
|
588
|
+
// https://nodejs.org/api/path.html#pathresolvepaths
|
|
589
|
+
const startDir = path.resolve()
|
|
629
590
|
|
|
630
|
-
|
|
591
|
+
const packagesDir = path.join(startDir, "packages")
|
|
631
592
|
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
593
|
+
const packagesExists = yield* fs.exists(packagesDir)
|
|
594
|
+
if (!packagesExists) {
|
|
595
|
+
return yield* Effect.logWarning("No packages directory found")
|
|
596
|
+
}
|
|
636
597
|
|
|
637
|
-
|
|
638
|
-
|
|
598
|
+
// get all package directories
|
|
599
|
+
const packageDirs = yield* fs.readDirectory(packagesDir)
|
|
639
600
|
|
|
640
|
-
|
|
601
|
+
const validPackages: string[] = []
|
|
641
602
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
603
|
+
// filter packages that have package.json and src directory
|
|
604
|
+
for (const packageName of packageDirs) {
|
|
605
|
+
const packagePath = path.join(packagesDir, packageName)
|
|
606
|
+
const packageJsonExists = yield* fs.exists(path.join(packagePath, "package.json"))
|
|
607
|
+
const srcExists = yield* fs.exists(path.join(packagePath, "src"))
|
|
647
608
|
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
609
|
+
const shouldExclude = false
|
|
610
|
+
|| packageName.endsWith("eslint-codegen-model")
|
|
611
|
+
|| packageName.endsWith("vue-components")
|
|
651
612
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
}
|
|
613
|
+
if (packageJsonExists && srcExists && !shouldExclude) {
|
|
614
|
+
validPackages.push(packagePath)
|
|
655
615
|
}
|
|
616
|
+
}
|
|
656
617
|
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
618
|
+
yield* Effect.logInfo(`Found ${validPackages.length} packages to update`)
|
|
619
|
+
|
|
620
|
+
// update each package sequentially
|
|
621
|
+
yield* Effect.all(
|
|
622
|
+
validPackages.map(
|
|
623
|
+
Effect.fnUntraced(function*(packagePath) {
|
|
624
|
+
const relativePackagePath = path.relative(startDir, packagePath)
|
|
625
|
+
yield* Effect.logInfo(`Updating ${relativePackagePath}`)
|
|
626
|
+
return yield* monitorPackageJson(startDir, relativePackagePath)
|
|
627
|
+
})
|
|
628
|
+
)
|
|
629
|
+
)
|
|
630
|
+
|
|
631
|
+
yield* Effect.logInfo("All packages updated successfully")
|
|
632
|
+
}),
|
|
633
|
+
"Stopped monitoring package.json exports for all packages"
|
|
634
|
+
)
|
|
635
|
+
.pipe(
|
|
636
|
+
Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo")
|
|
637
|
+
)
|
|
660
638
|
|
|
661
|
-
|
|
639
|
+
const DryRunOption = Options.boolean("dry-run").pipe(
|
|
640
|
+
Options.withDescription("Show what would be done without making changes")
|
|
641
|
+
)
|
|
662
642
|
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
643
|
+
const PruneStoreOption = Options.boolean("store-prune").pipe(
|
|
644
|
+
Options.withDescription("Prune the package manager store")
|
|
645
|
+
)
|
|
646
|
+
|
|
647
|
+
const nuke = Command
|
|
648
|
+
.make(
|
|
649
|
+
"nuke",
|
|
650
|
+
{ dryRun: DryRunOption, storePrune: PruneStoreOption },
|
|
651
|
+
Effect.fn("effa-cli.nuke")(function*({ dryRun, storePrune }) {
|
|
652
|
+
yield* Effect.logInfo(dryRun ? "Performing dry run cleanup..." : "Performing nuclear cleanup...")
|
|
653
|
+
|
|
654
|
+
if (dryRun) {
|
|
655
|
+
yield* runNodeCommand(
|
|
656
|
+
"find . -depth \\( -type d \\( -name 'node_modules' -o -name '.nuxt' -o -name 'dist' -o -name '.output' -o -name '.nitro' -o -name '.cache' -o -name 'test-results' -o -name 'test-out' -o -name 'coverage' \\) -print \\) -o \\( -type f \\( -name '*.log' -o -name '*.tsbuildinfo' \\) -print \\)"
|
|
671
657
|
)
|
|
672
|
-
|
|
658
|
+
} else {
|
|
659
|
+
yield* runNodeCommand(
|
|
660
|
+
"find . -depth \\( -type d \\( -name 'node_modules' -o -name '.nuxt' -o -name 'dist' -o -name '.output' -o -name '.nitro' -o -name '.cache' -o -name 'test-results' -o -name 'test-out' -o -name 'coverage' \\) -exec rm -rf -- {} + \\) -o \\( -type f \\( -name '*.log' -o -name '*.tsbuildinfo' \\) -delete \\)"
|
|
661
|
+
)
|
|
662
|
+
|
|
663
|
+
if (storePrune) {
|
|
664
|
+
yield* runNodeCommand(
|
|
665
|
+
"pnpm store prune"
|
|
666
|
+
)
|
|
667
|
+
}
|
|
668
|
+
}
|
|
673
669
|
|
|
674
|
-
yield* Effect.
|
|
670
|
+
yield* Effect.logInfo("Cleanup operation completed")
|
|
675
671
|
})
|
|
676
672
|
)
|
|
677
|
-
.pipe(Command.withDescription("
|
|
673
|
+
.pipe(Command.withDescription("Nuclear cleanup command: removes all generated files and cleans the workspace"))
|
|
678
674
|
|
|
679
675
|
// configure CLI
|
|
680
676
|
const cli = Command.run(
|
|
@@ -684,10 +680,10 @@ Effect
|
|
|
684
680
|
ue,
|
|
685
681
|
link,
|
|
686
682
|
unlink,
|
|
687
|
-
watch,
|
|
688
683
|
indexMulti,
|
|
689
684
|
packagejson,
|
|
690
|
-
packagejsonPackages
|
|
685
|
+
packagejsonPackages,
|
|
686
|
+
nuke
|
|
691
687
|
])),
|
|
692
688
|
{
|
|
693
689
|
name: "Effect-App CLI by jfet97 ❤️",
|