@optique/discover 1.2.0-dev.2169 → 1.2.0-dev.2180

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.
@@ -0,0 +1,288 @@
1
+ const require_chunk = require('./chunk-CUT6urMc.cjs');
2
+ const require_src = require('./src-BYGxdHGJ.cjs');
3
+ const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
4
+ const node_path = require_chunk.__toESM(require("node:path"));
5
+ const node_url = require_chunk.__toESM(require("node:url"));
6
+
7
+ //#region src/generator.ts
8
+ /**
9
+ * Generates a TypeScript module that exports command entries.
10
+ *
11
+ * @param options Generation options.
12
+ * @returns The generated source code and command module metadata.
13
+ * @throws {TypeError} If options are invalid or no command modules are found.
14
+ * @since 1.2.0
15
+ */
16
+ async function generateCommandsModule(options) {
17
+ const normalized = normalizeGenerateOptions(options);
18
+ const files = await collectGeneratedCommandFiles(normalized);
19
+ return generateCommandsModuleFromFiles(normalized, files);
20
+ }
21
+ /**
22
+ * Writes a generated command module to disk.
23
+ *
24
+ * @param options Generation options.
25
+ * @returns The generated source code and command module metadata.
26
+ * @throws {TypeError} If options are invalid or no command modules are found.
27
+ * @throws {Error} If the generated module cannot be written.
28
+ * @since 1.2.0
29
+ */
30
+ async function writeCommandsModule(options) {
31
+ const result = await generateCommandsModule(options);
32
+ await (0, node_fs_promises.mkdir)((0, node_path.dirname)(pathFromFile(options.outputFile)), { recursive: true });
33
+ await (0, node_fs_promises.writeFile)(pathFromFile(options.outputFile), result.code, "utf-8");
34
+ return result;
35
+ }
36
+ /**
37
+ * Watches the command file set and rewrites the generated module when it
38
+ * changes.
39
+ *
40
+ * Content-only edits do not trigger regeneration because they do not change
41
+ * the static module map.
42
+ *
43
+ * @param options Watch options.
44
+ * @returns A promise that resolves when the watch signal is aborted.
45
+ * @throws {TypeError} If options are invalid.
46
+ * @since 1.2.0
47
+ */
48
+ async function watchCommandsModule(options) {
49
+ const normalized = normalizeGenerateOptions(options);
50
+ const intervalMs = options.intervalMs ?? 250;
51
+ if (!Number.isInteger(intervalMs) || intervalMs < 1) throw new TypeError(`Watch interval must be a positive integer: ${intervalMs}`);
52
+ let previousSignature;
53
+ while (options.signal?.aborted !== true) {
54
+ try {
55
+ const files = await collectGeneratedCommandFiles(normalized, { allowEmpty: true });
56
+ const signature = files.map((file) => file.filePath).join("\0");
57
+ if (signature !== previousSignature) {
58
+ const result = generateCommandsModuleFromFiles(normalized, files);
59
+ await (0, node_fs_promises.mkdir)((0, node_path.dirname)(normalized.outputFile), { recursive: true });
60
+ await (0, node_fs_promises.writeFile)(normalized.outputFile, result.code, "utf-8");
61
+ options.onGenerate?.(result);
62
+ previousSignature = signature;
63
+ }
64
+ } catch (error) {
65
+ options.onError?.(error);
66
+ }
67
+ await delay(intervalMs, options.signal);
68
+ }
69
+ }
70
+ async function collectGeneratedCommandFiles(options, collectOptions = {}) {
71
+ const filePaths = await collectCommandFiles(options.dir, options.extensions, options.outputFile);
72
+ if (filePaths.length < 1) {
73
+ if (collectOptions.allowEmpty === true) return [];
74
+ throw new TypeError(`No command modules found in ${options.dir}.`);
75
+ }
76
+ const files = filePaths.map((filePath, index) => {
77
+ const importSpecifier = relativeImportSpecifier(options.outputDir, filePath);
78
+ const defaultModulePath = relativeModuleSpecifier(options.outputDir, filePath);
79
+ const modulePath = options.baseWasProvided ? joinModulePath(options.base, normalizeRelativePath((0, node_path.relative)(options.dir, filePath))) : defaultModulePath;
80
+ return {
81
+ filePath,
82
+ importSpecifier,
83
+ modulePath,
84
+ identifier: `cmd${index}`
85
+ };
86
+ });
87
+ rejectDuplicateCommandPaths(files, options);
88
+ return files;
89
+ }
90
+ function generateCommandsModuleFromFiles(options, files) {
91
+ if (files.length < 1) return {
92
+ code: "import type { ModuleCommand } from \"@optique/discover\";\n\nexport default [] satisfies readonly ModuleCommand[];\n",
93
+ files
94
+ };
95
+ const imports = files.map(formatCommandModuleImport).join("\n");
96
+ const entries = files.map((file) => ` ${JSON.stringify(file.modulePath)}: ${file.identifier},`).join("\n");
97
+ const optionEntries = [
98
+ ` base: ${JSON.stringify(options.base)},`,
99
+ ` extensions: ${formatStringArray(options.extensions)},`,
100
+ ...options.entryFileName === void 0 ? [] : [` entryFileName: ${JSON.stringify(options.entryFileName)},`]
101
+ ].join("\n");
102
+ return {
103
+ code: `import { commandsFromModules } from "@optique/discover";\n${imports}\n\nexport default commandsFromModules(\n {\n${entries}\n },\n {\n${optionEntries}\n },\n);\n`,
104
+ files
105
+ };
106
+ }
107
+ function formatCommandModuleImport(file) {
108
+ const importSpecifier = JSON.stringify(file.importSpecifier);
109
+ const importDeclaration = `import * as ${file.identifier} from ${importSpecifier};`;
110
+ if (requiresTypeScriptResolutionIgnore(file.importSpecifier)) return `// @ts-ignore: Percent-encoded import preserves URL-significant command paths.\n${importDeclaration}`;
111
+ return importDeclaration;
112
+ }
113
+ function requiresTypeScriptResolutionIgnore(specifier) {
114
+ return specifier.includes("%");
115
+ }
116
+ function normalizeGenerateOptions(options) {
117
+ const dir = (0, node_path.resolve)(pathFromFile(options.dir));
118
+ const outputFile = (0, node_path.resolve)(pathFromFile(options.outputFile));
119
+ const outputDir = (0, node_path.dirname)(outputFile);
120
+ const baseWasProvided = options.base !== void 0;
121
+ const base = normalizeBase(options.base ?? relativeModuleSpecifier(outputDir, dir));
122
+ return {
123
+ dir,
124
+ outputFile,
125
+ outputDir,
126
+ base,
127
+ baseWasProvided,
128
+ extensions: normalizeExtensions(options.extensions ?? require_src.getDefaultExtensions()),
129
+ entryFileName: normalizeEntryFileName(options.entryFileName)
130
+ };
131
+ }
132
+ function pathFromFile(path) {
133
+ return typeof path === "string" ? path : (0, node_url.fileURLToPath)(path);
134
+ }
135
+ function normalizeBase(base) {
136
+ if (typeof base !== "string" || base.length < 1) throw new TypeError(`Module base path must be a non-empty string: ${base}`);
137
+ return normalizeModulePath(base);
138
+ }
139
+ function normalizeExtensions(extensions) {
140
+ if (extensions.length < 1) throw new TypeError("At least one command file extension is required.");
141
+ const normalized = [];
142
+ for (const extension of extensions) {
143
+ if (!extension.startsWith(".") || extension.length < 2) throw new TypeError(`Command file extension must start with a dot: ${extension}`);
144
+ if (!normalized.includes(extension)) normalized.push(extension);
145
+ }
146
+ return normalized.toSorted((a, b) => b.length - a.length || a.localeCompare(b));
147
+ }
148
+ function normalizeEntryFileName(entryFileName) {
149
+ if (entryFileName === void 0) return void 0;
150
+ if (entryFileName === false) return false;
151
+ if (typeof entryFileName !== "string" || entryFileName.length < 1 || entryFileName.includes("/") || entryFileName.includes("\\")) throw new TypeError(`Command entry file name must be a non-empty file name: ${entryFileName}`);
152
+ return entryFileName;
153
+ }
154
+ async function collectCommandFiles(dir, extensions, excludedFile, activeDirs = /* @__PURE__ */ new Set()) {
155
+ const canonicalDir = await (0, node_fs_promises.realpath)(dir);
156
+ if (activeDirs.has(canonicalDir)) return [];
157
+ const nextActiveDirs = new Set(activeDirs);
158
+ nextActiveDirs.add(canonicalDir);
159
+ const entries = await (0, node_fs_promises.readdir)(dir, { withFileTypes: true });
160
+ const files = [];
161
+ for (const entry of entries.toSorted((a, b) => a.name.localeCompare(b.name))) {
162
+ const path = (0, node_path.resolve)(dir, entry.name);
163
+ const entryType = await getCommandFileEntryType(path, entry);
164
+ if (entryType === "directory") files.push(...await collectCommandFiles(path, extensions, excludedFile, nextActiveDirs));
165
+ else if (entryType === "file" && path !== excludedFile && !isDeclarationFile(entry.name) && extensions.some((ext) => entry.name.endsWith(ext))) files.push(path);
166
+ }
167
+ return files;
168
+ }
169
+ async function getCommandFileEntryType(path, entry) {
170
+ if (entry.isDirectory()) return "directory";
171
+ if (entry.isFile()) return "file";
172
+ if (!entry.isSymbolicLink()) return void 0;
173
+ try {
174
+ const target = await (0, node_fs_promises.stat)(path);
175
+ if (target.isDirectory()) return "directory";
176
+ if (target.isFile()) return "file";
177
+ return void 0;
178
+ } catch {
179
+ return void 0;
180
+ }
181
+ }
182
+ function isDeclarationFile(fileName) {
183
+ return /\.d\.[cm]?ts$/.test(fileName);
184
+ }
185
+ function rejectDuplicateCommandPaths(files, options) {
186
+ const entryFileName = options.entryFileName ?? "index";
187
+ const seen = /* @__PURE__ */ new Map();
188
+ for (const file of files) {
189
+ const commandPath = commandPathFromModulePath(options.base, file.modulePath, options.extensions, entryFileName);
190
+ const key = commandPath.join("\0");
191
+ const previous = seen.get(key);
192
+ if (previous != null) throw new TypeError(`Duplicate command path "${displayCommandPath(commandPath)}" from ${previous} and ${file.modulePath}.`);
193
+ seen.set(key, file.modulePath);
194
+ }
195
+ }
196
+ function commandPathFromModulePath(base, modulePath, extensions, entryFileName) {
197
+ const withoutExtension = stripCommandExtension(modulePath, extensions);
198
+ const relativePath = relativeModulePath(base, withoutExtension, modulePath);
199
+ const path = relativePath.split("/").filter((segment) => segment.length > 0);
200
+ return commandPathFromSegments(path, modulePath, entryFileName);
201
+ }
202
+ function stripCommandExtension(path, extensions) {
203
+ const matchedExtension = extensions.find((ext) => path.endsWith(ext));
204
+ if (matchedExtension == null) throw new TypeError(`No configured extension matches ${path}.`);
205
+ return path.slice(0, -matchedExtension.length);
206
+ }
207
+ function relativeModulePath(base, modulePath, originalModulePath) {
208
+ const normalizedBase = normalizeDerivedModulePath(base);
209
+ const normalizedPath = normalizeDerivedModulePath(modulePath);
210
+ const relativePath = node_path.posix.relative(normalizedBase, normalizedPath);
211
+ if (relativePath.length < 1 || relativePath === ".." || relativePath.startsWith("../") || node_path.posix.isAbsolute(relativePath)) throw new TypeError(`Module path ${originalModulePath} is not under base path ${base}.`);
212
+ return relativePath;
213
+ }
214
+ function commandPathFromSegments(path, source, entryFileName) {
215
+ if (path.length < 1) throw new TypeError(`Command module ${source} does not define a path.`);
216
+ if (entryFileName !== false && path[path.length - 1] === entryFileName) return path.slice(0, -1);
217
+ return path;
218
+ }
219
+ function displayCommandPath(path) {
220
+ return path.length < 1 ? "<root>" : path.join(" ");
221
+ }
222
+ function relativeModuleSpecifier(fromDir, target) {
223
+ const relativePath = normalizeRelativePath((0, node_path.relative)(fromDir, target));
224
+ return relativePath.startsWith(".") ? relativePath : `./${relativePath}`;
225
+ }
226
+ function relativeImportSpecifier(fromDir, target) {
227
+ const specifier = relativeModuleSpecifier(fromDir, target);
228
+ if (requiresEncodedImportSpecifier(specifier)) return encodeImportSpecifier(specifier);
229
+ return specifier;
230
+ }
231
+ function requiresEncodedImportSpecifier(specifier) {
232
+ return specifier.includes("#") || specifier.includes("?") || specifier.includes("%");
233
+ }
234
+ function encodeImportSpecifier(specifier) {
235
+ return specifier.split("/").map((segment) => encodeURIComponent(segment)).join("/");
236
+ }
237
+ function normalizeRelativePath(path) {
238
+ return path.replaceAll("\\", "/");
239
+ }
240
+ function normalizeModulePath(path) {
241
+ return path.replaceAll("\\", "/");
242
+ }
243
+ function normalizeDerivedModulePath(path) {
244
+ return node_path.posix.normalize(normalizeModulePath(path));
245
+ }
246
+ function joinModulePath(base, relativePath) {
247
+ if (base === "." || base === "./") return `./${relativePath}`;
248
+ const prefix = base.endsWith("/") ? base.slice(0, -1) : base;
249
+ return `${prefix}/${relativePath}`;
250
+ }
251
+ function formatStringArray(values) {
252
+ return `[${values.map((value) => JSON.stringify(value)).join(", ")}]`;
253
+ }
254
+ function delay(ms, signal) {
255
+ if (signal?.aborted === true) return Promise.resolve();
256
+ return new Promise((resolve$1) => {
257
+ const onTimeout = () => {
258
+ signal?.removeEventListener("abort", onAbort);
259
+ resolve$1();
260
+ };
261
+ const onAbort = () => {
262
+ clearTimeout(timeout);
263
+ resolve$1();
264
+ };
265
+ const timeout = setTimeout(onTimeout, ms);
266
+ signal?.addEventListener("abort", onAbort, { once: true });
267
+ });
268
+ }
269
+
270
+ //#endregion
271
+ Object.defineProperty(exports, 'generateCommandsModule', {
272
+ enumerable: true,
273
+ get: function () {
274
+ return generateCommandsModule;
275
+ }
276
+ });
277
+ Object.defineProperty(exports, 'watchCommandsModule', {
278
+ enumerable: true,
279
+ get: function () {
280
+ return watchCommandsModule;
281
+ }
282
+ });
283
+ Object.defineProperty(exports, 'writeCommandsModule', {
284
+ enumerable: true,
285
+ get: function () {
286
+ return writeCommandsModule;
287
+ }
288
+ });
@@ -0,0 +1,7 @@
1
+ require('./command-CUn2_NIA.cjs');
2
+ require('./src-BYGxdHGJ.cjs');
3
+ const require_generator = require('./generator-e4RwnDKG.cjs');
4
+
5
+ exports.generateCommandsModule = require_generator.generateCommandsModule;
6
+ exports.watchCommandsModule = require_generator.watchCommandsModule;
7
+ exports.writeCommandsModule = require_generator.writeCommandsModule;
@@ -0,0 +1,136 @@
1
+ //#region src/generator.d.ts
2
+ /**
3
+ * A command module file included in generated discovery output.
4
+ *
5
+ * @since 1.2.0
6
+ */
7
+ interface GeneratedCommandModuleFile {
8
+ /**
9
+ * Absolute path to the command module file.
10
+ */
11
+ readonly filePath: string;
12
+ /**
13
+ * Module specifier used by the generated import declaration.
14
+ *
15
+ * Paths containing URL-significant characters use percent-encoded
16
+ * relative specifiers so generated modules stay relocatable.
17
+ */
18
+ readonly importSpecifier: string;
19
+ /**
20
+ * Module map key passed to `commandsFromModules()`.
21
+ */
22
+ readonly modulePath: string;
23
+ /**
24
+ * Namespace import identifier used in the generated module.
25
+ */
26
+ readonly identifier: string;
27
+ }
28
+ /**
29
+ * Options for generating a static command module.
30
+ *
31
+ * @since 1.2.0
32
+ */
33
+ interface GenerateCommandsModuleOptions {
34
+ /**
35
+ * Directory containing command modules.
36
+ */
37
+ readonly dir: string | URL;
38
+ /**
39
+ * Path to the module that will be generated.
40
+ */
41
+ readonly outputFile: string | URL;
42
+ /**
43
+ * Module map base path passed to `commandsFromModules()`.
44
+ *
45
+ * By default, this is the command directory path relative to the generated
46
+ * module's containing directory.
47
+ */
48
+ readonly base?: string;
49
+ /**
50
+ * Module suffixes to include.
51
+ *
52
+ * @default Runtime-aware extension defaults from {@link getDefaultExtensions}
53
+ */
54
+ readonly extensions?: readonly string[];
55
+ /**
56
+ * Entry file name passed to `commandsFromModules()`. Pass `false` to
57
+ * disable entry-file mapping.
58
+ */
59
+ readonly entryFileName?: string | false;
60
+ }
61
+ /**
62
+ * Result of generating a static command module.
63
+ *
64
+ * @since 1.2.0
65
+ */
66
+ interface GeneratedCommandsModule {
67
+ /**
68
+ * Generated TypeScript source code.
69
+ */
70
+ readonly code: string;
71
+ /**
72
+ * Command module files included in the generated module.
73
+ */
74
+ readonly files: readonly GeneratedCommandModuleFile[];
75
+ }
76
+ /**
77
+ * Options for watching and regenerating a static command module.
78
+ *
79
+ * @since 1.2.0
80
+ */
81
+ interface WatchCommandsModuleOptions extends GenerateCommandsModuleOptions {
82
+ /**
83
+ * Polling interval in milliseconds.
84
+ *
85
+ * @default `250`
86
+ */
87
+ readonly intervalMs?: number;
88
+ /**
89
+ * Abort signal used to stop watching.
90
+ */
91
+ readonly signal?: AbortSignal;
92
+ /**
93
+ * Callback invoked after each regeneration.
94
+ */
95
+ readonly onGenerate?: (result: GeneratedCommandsModule) => void;
96
+ /**
97
+ * Callback invoked when generation fails during watching.
98
+ *
99
+ * @since 1.2.0
100
+ */
101
+ readonly onError?: (error: unknown) => void;
102
+ }
103
+ /**
104
+ * Generates a TypeScript module that exports command entries.
105
+ *
106
+ * @param options Generation options.
107
+ * @returns The generated source code and command module metadata.
108
+ * @throws {TypeError} If options are invalid or no command modules are found.
109
+ * @since 1.2.0
110
+ */
111
+ declare function generateCommandsModule(options: GenerateCommandsModuleOptions): Promise<GeneratedCommandsModule>;
112
+ /**
113
+ * Writes a generated command module to disk.
114
+ *
115
+ * @param options Generation options.
116
+ * @returns The generated source code and command module metadata.
117
+ * @throws {TypeError} If options are invalid or no command modules are found.
118
+ * @throws {Error} If the generated module cannot be written.
119
+ * @since 1.2.0
120
+ */
121
+ declare function writeCommandsModule(options: GenerateCommandsModuleOptions): Promise<GeneratedCommandsModule>;
122
+ /**
123
+ * Watches the command file set and rewrites the generated module when it
124
+ * changes.
125
+ *
126
+ * Content-only edits do not trigger regeneration because they do not change
127
+ * the static module map.
128
+ *
129
+ * @param options Watch options.
130
+ * @returns A promise that resolves when the watch signal is aborted.
131
+ * @throws {TypeError} If options are invalid.
132
+ * @since 1.2.0
133
+ */
134
+ declare function watchCommandsModule(options: WatchCommandsModuleOptions): Promise<void>;
135
+ //#endregion
136
+ export { GenerateCommandsModuleOptions, GeneratedCommandModuleFile, GeneratedCommandsModule, WatchCommandsModuleOptions, generateCommandsModule, watchCommandsModule, writeCommandsModule };
@@ -0,0 +1,136 @@
1
+ //#region src/generator.d.ts
2
+ /**
3
+ * A command module file included in generated discovery output.
4
+ *
5
+ * @since 1.2.0
6
+ */
7
+ interface GeneratedCommandModuleFile {
8
+ /**
9
+ * Absolute path to the command module file.
10
+ */
11
+ readonly filePath: string;
12
+ /**
13
+ * Module specifier used by the generated import declaration.
14
+ *
15
+ * Paths containing URL-significant characters use percent-encoded
16
+ * relative specifiers so generated modules stay relocatable.
17
+ */
18
+ readonly importSpecifier: string;
19
+ /**
20
+ * Module map key passed to `commandsFromModules()`.
21
+ */
22
+ readonly modulePath: string;
23
+ /**
24
+ * Namespace import identifier used in the generated module.
25
+ */
26
+ readonly identifier: string;
27
+ }
28
+ /**
29
+ * Options for generating a static command module.
30
+ *
31
+ * @since 1.2.0
32
+ */
33
+ interface GenerateCommandsModuleOptions {
34
+ /**
35
+ * Directory containing command modules.
36
+ */
37
+ readonly dir: string | URL;
38
+ /**
39
+ * Path to the module that will be generated.
40
+ */
41
+ readonly outputFile: string | URL;
42
+ /**
43
+ * Module map base path passed to `commandsFromModules()`.
44
+ *
45
+ * By default, this is the command directory path relative to the generated
46
+ * module's containing directory.
47
+ */
48
+ readonly base?: string;
49
+ /**
50
+ * Module suffixes to include.
51
+ *
52
+ * @default Runtime-aware extension defaults from {@link getDefaultExtensions}
53
+ */
54
+ readonly extensions?: readonly string[];
55
+ /**
56
+ * Entry file name passed to `commandsFromModules()`. Pass `false` to
57
+ * disable entry-file mapping.
58
+ */
59
+ readonly entryFileName?: string | false;
60
+ }
61
+ /**
62
+ * Result of generating a static command module.
63
+ *
64
+ * @since 1.2.0
65
+ */
66
+ interface GeneratedCommandsModule {
67
+ /**
68
+ * Generated TypeScript source code.
69
+ */
70
+ readonly code: string;
71
+ /**
72
+ * Command module files included in the generated module.
73
+ */
74
+ readonly files: readonly GeneratedCommandModuleFile[];
75
+ }
76
+ /**
77
+ * Options for watching and regenerating a static command module.
78
+ *
79
+ * @since 1.2.0
80
+ */
81
+ interface WatchCommandsModuleOptions extends GenerateCommandsModuleOptions {
82
+ /**
83
+ * Polling interval in milliseconds.
84
+ *
85
+ * @default `250`
86
+ */
87
+ readonly intervalMs?: number;
88
+ /**
89
+ * Abort signal used to stop watching.
90
+ */
91
+ readonly signal?: AbortSignal;
92
+ /**
93
+ * Callback invoked after each regeneration.
94
+ */
95
+ readonly onGenerate?: (result: GeneratedCommandsModule) => void;
96
+ /**
97
+ * Callback invoked when generation fails during watching.
98
+ *
99
+ * @since 1.2.0
100
+ */
101
+ readonly onError?: (error: unknown) => void;
102
+ }
103
+ /**
104
+ * Generates a TypeScript module that exports command entries.
105
+ *
106
+ * @param options Generation options.
107
+ * @returns The generated source code and command module metadata.
108
+ * @throws {TypeError} If options are invalid or no command modules are found.
109
+ * @since 1.2.0
110
+ */
111
+ declare function generateCommandsModule(options: GenerateCommandsModuleOptions): Promise<GeneratedCommandsModule>;
112
+ /**
113
+ * Writes a generated command module to disk.
114
+ *
115
+ * @param options Generation options.
116
+ * @returns The generated source code and command module metadata.
117
+ * @throws {TypeError} If options are invalid or no command modules are found.
118
+ * @throws {Error} If the generated module cannot be written.
119
+ * @since 1.2.0
120
+ */
121
+ declare function writeCommandsModule(options: GenerateCommandsModuleOptions): Promise<GeneratedCommandsModule>;
122
+ /**
123
+ * Watches the command file set and rewrites the generated module when it
124
+ * changes.
125
+ *
126
+ * Content-only edits do not trigger regeneration because they do not change
127
+ * the static module map.
128
+ *
129
+ * @param options Watch options.
130
+ * @returns A promise that resolves when the watch signal is aborted.
131
+ * @throws {TypeError} If options are invalid.
132
+ * @since 1.2.0
133
+ */
134
+ declare function watchCommandsModule(options: WatchCommandsModuleOptions): Promise<void>;
135
+ //#endregion
136
+ export { GenerateCommandsModuleOptions, GeneratedCommandModuleFile, GeneratedCommandsModule, WatchCommandsModuleOptions, generateCommandsModule, watchCommandsModule, writeCommandsModule };
@@ -0,0 +1,5 @@
1
+ import "./command-DO5zgkvS.js";
2
+ import "./src-Ci75oZo-.js";
3
+ import { generateCommandsModule, watchCommandsModule, writeCommandsModule } from "./generator-C12pIuFe.js";
4
+
5
+ export { generateCommandsModule, watchCommandsModule, writeCommandsModule };