mulink 1.1.8 → 1.1.9
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/README.md +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/lib/{chunk-AHGDKSOY.js → chunk-2WVV6AOO.js} +418 -250
- package/dist/lib/chunk-2WVV6AOO.js.map +1 -0
- package/dist/lib/{chunk-SSMOIVFN.cjs → chunk-NC747MZJ.cjs} +418 -250
- package/dist/lib/chunk-NC747MZJ.cjs.map +1 -0
- package/dist/lib/cli.cjs +57 -29
- package/dist/lib/cli.cjs.map +1 -1
- package/dist/lib/cli.js +42 -14
- package/dist/lib/cli.js.map +1 -1
- package/dist/lib/client.cjs +20 -20
- package/dist/lib/client.cjs.map +1 -1
- package/dist/lib/client.d.cts +4 -4
- package/dist/lib/client.d.ts +4 -4
- package/dist/lib/client.js +4 -4
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/index.cjs +177 -15
- package/dist/lib/index.cjs.map +1 -1
- package/dist/lib/index.d.cts +211 -3
- package/dist/lib/index.d.ts +211 -3
- package/dist/lib/index.js +153 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/{version-checker-uF6o5ziX.d.cts → version-checker-DU88tpi8.d.cts} +152 -12
- package/dist/lib/{version-checker-uF6o5ziX.d.ts → version-checker-DU88tpi8.d.ts} +152 -12
- package/package.json +2 -2
- package/dist/lib/chunk-AHGDKSOY.js.map +0 -1
- package/dist/lib/chunk-SSMOIVFN.cjs.map +0 -1
package/dist/lib/cli.cjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkNC747MZJ_cjs = require('./chunk-NC747MZJ.cjs');
|
|
5
5
|
var commander = require('commander');
|
|
6
|
+
var fs = require('fs');
|
|
7
|
+
var path = require('path');
|
|
6
8
|
|
|
7
|
-
var BANNER = /* @__PURE__ */
|
|
9
|
+
var BANNER = /* @__PURE__ */ chunkNC747MZJ_cjs.__name((version) => `
|
|
8
10
|
\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557
|
|
9
11
|
\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2554\u255D
|
|
10
12
|
\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2554\u255D
|
|
@@ -16,11 +18,11 @@ var BANNER = /* @__PURE__ */ chunkSSMOIVFN_cjs.__name((version) => `
|
|
|
16
18
|
\u{1F517} Connect APIs \u2022 Generate Clients \u2022 Type Safety
|
|
17
19
|
\u{1F4E6} Version: ${version} \u2022 \u{1F680} Next.js 16+ \u2022 \u26A1 OpenAPI 3.x
|
|
18
20
|
`, "BANNER");
|
|
19
|
-
var logger = new
|
|
21
|
+
var logger = new chunkNC747MZJ_cjs.BridgeLogger({ prefix: "\u{1F517} Mulink CLI" });
|
|
20
22
|
function displayBanner(version, updateInfo) {
|
|
21
23
|
let banner = BANNER(version);
|
|
22
24
|
if (updateInfo && updateInfo.updateAvailable) {
|
|
23
|
-
const upgradeCommand = updateInfo.upgradeCommand
|
|
25
|
+
const upgradeCommand = updateInfo.upgradeCommand ?? "npm update mulink";
|
|
24
26
|
banner += `
|
|
25
27
|
|
|
26
28
|
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u{1F504} UPDATE AVAILABLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
@@ -38,7 +40,7 @@ function displayBanner(version, updateInfo) {
|
|
|
38
40
|
}
|
|
39
41
|
console.log(banner);
|
|
40
42
|
}
|
|
41
|
-
|
|
43
|
+
chunkNC747MZJ_cjs.__name(displayBanner, "displayBanner");
|
|
42
44
|
function displayColoredBanner(version, updateInfo) {
|
|
43
45
|
const colors = {
|
|
44
46
|
reset: "\x1B[0m",
|
|
@@ -48,7 +50,7 @@ function displayColoredBanner(version, updateInfo) {
|
|
|
48
50
|
magenta: "\x1B[35m"};
|
|
49
51
|
let banner = BANNER(version).replace(/█/g, `${colors.cyan}\u2588${colors.reset}`).replace(/🌉/g, `${colors.yellow}\u{1F309}${colors.reset}`).replace(/🔗/g, `${colors.cyan}\u{1F517}${colors.reset}`).replace(/📦/g, `${colors.green}\u{1F4E6}${colors.reset}`).replace(/🚀/g, `${colors.magenta}\u{1F680}${colors.reset}`).replace(/⚡/g, `${colors.yellow}\u26A1${colors.reset}`);
|
|
50
52
|
if (updateInfo && updateInfo.updateAvailable) {
|
|
51
|
-
const upgradeCommand = updateInfo.upgradeCommand
|
|
53
|
+
const upgradeCommand = updateInfo.upgradeCommand ?? "npm update mulink";
|
|
52
54
|
const updateBox = `
|
|
53
55
|
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u{1F504} UPDATE AVAILABLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
54
56
|
|
|
@@ -66,9 +68,9 @@ function displayColoredBanner(version, updateInfo) {
|
|
|
66
68
|
}
|
|
67
69
|
console.log(banner);
|
|
68
70
|
}
|
|
69
|
-
|
|
71
|
+
chunkNC747MZJ_cjs.__name(displayColoredBanner, "displayColoredBanner");
|
|
70
72
|
var program = new commander.Command();
|
|
71
|
-
var versionChecker =
|
|
73
|
+
var versionChecker = chunkNC747MZJ_cjs.createBridgeVersionChecker(logger);
|
|
72
74
|
program.name("mulink").description("Universal type-safe API integration library for modern web applications").version(versionChecker.getCurrentVersion()).option("-v, --verbose", "Enable verbose logging").option("-q, --quiet", "Suppress non-error output").option("--no-color", "Disable colored output").option("--no-banner", "Disable banner display").hook("preAction", async (thisCommand) => {
|
|
73
75
|
const opts = thisCommand.opts();
|
|
74
76
|
if (opts.verbose) {
|
|
@@ -82,7 +84,7 @@ program.name("mulink").description("Universal type-safe API integration library
|
|
|
82
84
|
let updateInfo = null;
|
|
83
85
|
if (!opts.quiet) {
|
|
84
86
|
try {
|
|
85
|
-
const versionChecker2 =
|
|
87
|
+
const versionChecker2 = chunkNC747MZJ_cjs.createBridgeVersionChecker(logger);
|
|
86
88
|
const versionInfo = await versionChecker2.checkForUpdates();
|
|
87
89
|
if (versionInfo && versionInfo.updateAvailable) {
|
|
88
90
|
const upgradeCommand = versionChecker2.getUpgradeCommand(versionInfo);
|
|
@@ -100,19 +102,19 @@ program.name("mulink").description("Universal type-safe API integration library
|
|
|
100
102
|
if (!opts.noBanner && !opts.quiet) {
|
|
101
103
|
const currentVersion = versionChecker.getCurrentVersion();
|
|
102
104
|
if (opts.noColor) {
|
|
103
|
-
displayBanner(currentVersion, updateInfo
|
|
105
|
+
displayBanner(currentVersion, updateInfo ?? void 0);
|
|
104
106
|
} else {
|
|
105
|
-
displayColoredBanner(currentVersion, updateInfo
|
|
107
|
+
displayColoredBanner(currentVersion, updateInfo ?? void 0);
|
|
106
108
|
}
|
|
107
109
|
}
|
|
108
110
|
});
|
|
109
111
|
program.command("generate").alias("gen").description("Generate API client code from OpenAPI schema").option("-c, --config <path>", "Path to config file", "link.config.json").option("-w, --watch", "Watch for schema changes and regenerate automatically").option("--dry-run", "Show what would be generated without writing files").action(async (options) => {
|
|
110
112
|
const spinner = logger.spinner("Initializing generation...");
|
|
111
113
|
try {
|
|
112
|
-
const configLoader = new
|
|
114
|
+
const configLoader = new chunkNC747MZJ_cjs.ConfigurationLoader();
|
|
113
115
|
const config = await configLoader.load(options.config);
|
|
114
116
|
spinner.succeed("Configuration loaded");
|
|
115
|
-
const bridge = new
|
|
117
|
+
const bridge = new chunkNC747MZJ_cjs.BridgeCore();
|
|
116
118
|
if (options.dryRun) {
|
|
117
119
|
logger.info("\u{1F50D} Dry run mode - validation only");
|
|
118
120
|
const validationSpinner = logger.spinner("Validating schema...");
|
|
@@ -164,22 +166,48 @@ program.command("generate").alias("gen").description("Generate API client code f
|
|
|
164
166
|
program.command("init").description("Initialize a new Mulink project").option("-f, --framework <type>", "Framework type", "nextjs").option("--router <type>", "Next.js router type", "app").option("-s, --schema <url>", "OpenAPI schema URL").option("-o, --output <dir>", "Output directory", "src/generated").action(async (options) => {
|
|
165
167
|
const spinner = logger.spinner("Initializing Mulink project...");
|
|
166
168
|
try {
|
|
167
|
-
const
|
|
168
|
-
const
|
|
169
|
-
if (
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
169
|
+
const configPath = "link.config.json";
|
|
170
|
+
const configFilePath = path.resolve(process.cwd(), configPath);
|
|
171
|
+
if (fs.existsSync(configFilePath)) {
|
|
172
|
+
spinner.fail("Configuration file already exists");
|
|
173
|
+
logger.warn(`A configuration file already exists at: ${configPath}`);
|
|
174
|
+
logger.info("If you want to overwrite it, delete the file first or use a different path.");
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
const configLoader = new chunkNC747MZJ_cjs.ConfigurationLoader();
|
|
178
|
+
const config = configLoader.createDefault(options.framework);
|
|
179
|
+
if (options.schema) {
|
|
180
|
+
try {
|
|
181
|
+
new URL(options.schema);
|
|
182
|
+
config.schema = options.schema;
|
|
183
|
+
} catch {
|
|
184
|
+
logger.warn(`Invalid schema URL format: ${options.schema}. Using default.`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (options.output) {
|
|
188
|
+
config.outputDir = options.output;
|
|
189
|
+
}
|
|
190
|
+
if (options.router) {
|
|
191
|
+
if (options.router === "app" || options.router === "pages") {
|
|
192
|
+
config.framework.router = options.router;
|
|
193
|
+
} else {
|
|
194
|
+
logger.warn(`Invalid router type: ${options.router}. Using default 'app'.`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
await configLoader.save(config, configPath);
|
|
173
198
|
spinner.succeed("Mulink configuration created successfully!");
|
|
174
199
|
logger.info("\u{1F4CB} Configuration Summary:");
|
|
175
200
|
logger.info(` Framework: ${config.framework.type}`);
|
|
176
201
|
logger.info(` Router: ${config.framework.router}`);
|
|
177
202
|
logger.info(` Schema: ${config.schema}`);
|
|
178
203
|
logger.info(` Output: ${config.outputDir}`);
|
|
204
|
+
logger.info(` Config file: ${configPath}`);
|
|
179
205
|
logger.info("\n\u{1F680} Next steps:");
|
|
180
|
-
logger.info(
|
|
181
|
-
logger.info(
|
|
182
|
-
logger.info(
|
|
206
|
+
logger.info(`1. Edit ${configPath} to configure your API`);
|
|
207
|
+
logger.info("2. Update the schema URL to point to your OpenAPI schema");
|
|
208
|
+
logger.info("3. Update the API baseUrl if needed");
|
|
209
|
+
logger.info('4. Run "mulink generate" to create your API client');
|
|
210
|
+
logger.info('5. Run "mulink validate" to check your configuration');
|
|
183
211
|
} catch (error) {
|
|
184
212
|
spinner.fail("Initialization failed");
|
|
185
213
|
if (error instanceof Error) {
|
|
@@ -195,9 +223,9 @@ program.command("init").description("Initialize a new Mulink project").option("-
|
|
|
195
223
|
});
|
|
196
224
|
program.command("validate").description("Validate OpenAPI schema and configuration").option("-c, --config <path>", "Path to config file", "link.config.json").option("--schema-only", "Only validate the OpenAPI schema").action(async (options) => {
|
|
197
225
|
try {
|
|
198
|
-
const configLoader = new
|
|
226
|
+
const configLoader = new chunkNC747MZJ_cjs.ConfigurationLoader();
|
|
199
227
|
const config = await configLoader.load(options.config);
|
|
200
|
-
const bridge = new
|
|
228
|
+
const bridge = new chunkNC747MZJ_cjs.BridgeCore();
|
|
201
229
|
if (options.schemaOnly) {
|
|
202
230
|
const isValid = await bridge.validateSchema(config.schema);
|
|
203
231
|
if (isValid) {
|
|
@@ -228,9 +256,9 @@ program.command("validate").description("Validate OpenAPI schema and configurati
|
|
|
228
256
|
program.command("clean").description("Clean generated files and cache").option("-c, --config <path>", "Path to config file", "link.config.json").option("--force", "Force clean without confirmation").action(async (options) => {
|
|
229
257
|
const spinner = logger.spinner("Cleaning cache and generated files...");
|
|
230
258
|
try {
|
|
231
|
-
const configLoader = new
|
|
232
|
-
const
|
|
233
|
-
const bridge = new
|
|
259
|
+
const configLoader = new chunkNC747MZJ_cjs.ConfigurationLoader();
|
|
260
|
+
const _config = await configLoader.load(options.config);
|
|
261
|
+
const bridge = new chunkNC747MZJ_cjs.BridgeCore();
|
|
234
262
|
bridge.clearCache();
|
|
235
263
|
spinner.succeed("Cache and generated files cleared successfully");
|
|
236
264
|
logger.info("\u{1F9F9} Cleaned:");
|
|
@@ -252,7 +280,7 @@ program.command("clean").description("Clean generated files and cache").option("
|
|
|
252
280
|
});
|
|
253
281
|
program.command("info").description("Show project information and status").option("-c, --config <path>", "Path to config file", "link.config.json").action(async (options) => {
|
|
254
282
|
try {
|
|
255
|
-
const configLoader = new
|
|
283
|
+
const configLoader = new chunkNC747MZJ_cjs.ConfigurationLoader();
|
|
256
284
|
const config = await configLoader.load(options.config);
|
|
257
285
|
logger.info("\u{1F4CA} Mulink Project Information");
|
|
258
286
|
logger.info("=".repeat(40));
|
|
@@ -279,7 +307,7 @@ program.command("info").description("Show project information and status").optio
|
|
|
279
307
|
program.command("check-updates").alias("update-check").description("Check for available updates").option("--force", "Force check even if recently checked").option("--show-current", "Show current version information").action(async (options) => {
|
|
280
308
|
const spinner = logger.spinner("Checking for updates...");
|
|
281
309
|
try {
|
|
282
|
-
const versionChecker2 =
|
|
310
|
+
const versionChecker2 = chunkNC747MZJ_cjs.createBridgeVersionChecker(logger);
|
|
283
311
|
const versionInfo = await versionChecker2.checkForUpdates();
|
|
284
312
|
const currentVersion = versionChecker2.getCurrentVersion();
|
|
285
313
|
if (versionInfo) {
|
package/dist/lib/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts"],"names":["BridgeLogger","__name","Command","createBridgeVersionChecker","versionChecker","ConfigurationLoader","BridgeCore"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\r\nimport { Command } from 'commander';\r\nimport { BridgeCore } from '@/core/bridge-core';\r\nimport { ConfigurationLoader } from '@/config/configuration-loader';\r\nimport { BridgeLogger, LogLevel } from '@/utils/logger';\r\nimport { createBridgeVersionChecker } from '@/utils/version-checker';\r\n\r\n// ASCII Art Banner\r\nconst BANNER = (version: string) => `\r\n ███╗ ███╗██╗ ██╗██╗ ██╗███╗ ██╗██╗ ██╗\r\n ████╗ ████║██║ ██║██║ ██║████╗ ██║██║ ██╔╝\r\n ██╔████╔██║██║ ██║██║ ██║██╔██╗ ██║█████╔╝ \r\n ██║╚██╔╝██║██║ ██║██║ ██║██║╚██╗██║██╔═██╗ \r\n ██║ ╚═╝ ██║╚██████╔╝███████╗██║██║ ╚████║██║ ██╗\r\n ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝\r\n\r\n 🔗 Mulink - Universal Type-Safe API Integration\r\n 🔗 Connect APIs • Generate Clients • Type Safety\r\n 📦 Version: ${version} • 🚀 Next.js 16+ • ⚡ OpenAPI 3.x\r\n`;\r\n\r\nconst logger = new BridgeLogger({ prefix: '🔗 Mulink CLI' });\r\n\r\n// Enhanced banner display with update notification integration\r\nfunction displayBanner(version: string, updateInfo?: { current: string; latest: string; updateAvailable: boolean; upgradeCommand?: string }) {\r\n let banner = BANNER(version);\r\n \r\n if (updateInfo && updateInfo.updateAvailable) {\r\n const upgradeCommand = updateInfo.upgradeCommand || 'npm update mulink';\r\n \r\n banner += `\r\n\r\n─────────────────── 🔄 UPDATE AVAILABLE ──────────────────\r\n\r\n Current Version: ${updateInfo.current}\r\n Latest Version: ${updateInfo.latest}\r\n\r\n Upgrade Command:\r\n ${upgradeCommand}\r\n\r\n Run 'mulink check-updates' for more information\r\n\r\n──────────────────────────────────────────────────────────\r\n`;\r\n }\r\n \r\n console.log(banner);\r\n}\r\n\r\n// Enhanced colored banner display with update notification integration\r\nfunction displayColoredBanner(version: string, updateInfo?: { current: string; latest: string; updateAvailable: boolean; upgradeCommand?: string }) {\r\n const colors = {\r\n reset: '\\x1b[0m',\r\n bright: '\\x1b[1m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n cyan: '\\x1b[36m',\r\n magenta: '\\x1b[35m',\r\n orange: '\\x1b[38;5;208m',\r\n };\r\n\r\n let banner = BANNER(version)\r\n .replace(/█/g, `${colors.cyan}█${colors.reset}`)\r\n .replace(/🌉/g, `${colors.yellow}🌉${colors.reset}`)\r\n .replace(/🔗/g, `${colors.cyan}🔗${colors.reset}`)\r\n .replace(/📦/g, `${colors.green}📦${colors.reset}`)\r\n .replace(/🚀/g, `${colors.magenta}🚀${colors.reset}`)\r\n .replace(/⚡/g, `${colors.yellow}⚡${colors.reset}`);\r\n\r\n if (updateInfo && updateInfo.updateAvailable) {\r\n const upgradeCommand = updateInfo.upgradeCommand || 'npm update mulink';\r\n \r\n const updateBox = `\r\n─────────────────── 🔄 UPDATE AVAILABLE ──────────────────\r\n\r\n Current Version: ${updateInfo.current}\r\n Latest Version: ${updateInfo.latest}\r\n\r\n Upgrade Command:\r\n ${upgradeCommand}\r\n\r\n Run 'mulink check-updates' for more information\r\n\r\n──────────────────────────────────────────────────────────\r\n`;\r\n\r\n banner += updateBox;\r\n }\r\n\r\n console.log(banner);\r\n}\r\n\r\nconst program = new Command();\r\nconst versionChecker = createBridgeVersionChecker(logger);\r\nprogram\r\n .name('mulink')\r\n .description('Universal type-safe API integration library for modern web applications')\r\n .version(versionChecker.getCurrentVersion())\r\n .option('-v, --verbose', 'Enable verbose logging')\r\n .option('-q, --quiet', 'Suppress non-error output')\r\n .option('--no-color', 'Disable colored output')\r\n .option('--no-banner', 'Disable banner display')\r\n .hook('preAction', async (thisCommand) => {\r\n const opts = thisCommand.opts();\r\n if (opts.verbose) {\r\n logger.options.level = LogLevel.DEBUG;\r\n } else if (opts.quiet) {\r\n logger.options.level = LogLevel.ERROR;\r\n }\r\n if (opts.noColor) {\r\n logger.options.colors = false;\r\n }\r\n\r\n // Check for updates first (synchronously for banner integration)\r\n let updateInfo = null;\r\n if (!opts.quiet) {\r\n try {\r\n const versionChecker = createBridgeVersionChecker(logger);\r\n const versionInfo = await versionChecker.checkForUpdates();\r\n \r\n if (versionInfo && versionInfo.updateAvailable) {\r\n const upgradeCommand = versionChecker.getUpgradeCommand(versionInfo);\r\n updateInfo = {\r\n current: versionInfo.current,\r\n latest: versionInfo.latest,\r\n updateAvailable: versionInfo.updateAvailable,\r\n upgradeCommand\r\n };\r\n }\r\n } catch (error) {\r\n // Silently fail - version check should not interrupt user workflow\r\n logger.debug('Version check failed:', error);\r\n }\r\n }\r\n\r\n // Display banner with integrated update notification\r\n if (!opts.noBanner && !opts.quiet) {\r\n const currentVersion = versionChecker.getCurrentVersion();\r\n if (opts.noColor) {\r\n displayBanner(currentVersion, updateInfo || undefined);\r\n } else {\r\n displayColoredBanner(currentVersion, updateInfo || undefined);\r\n }\r\n }\r\n });\r\n\r\nprogram\r\n .command('generate')\r\n .alias('gen')\r\n .description('Generate API client code from OpenAPI schema')\r\n .option('-c, --config <path>', 'Path to config file', 'link.config.json')\r\n .option('-w, --watch', 'Watch for schema changes and regenerate automatically')\r\n .option('--dry-run', 'Show what would be generated without writing files')\r\n .action(async options => {\r\n const spinner = logger.spinner('Initializing generation...');\r\n\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const config = await configLoader.load(options.config);\r\n spinner.succeed('Configuration loaded');\r\n\r\n const bridge = new BridgeCore();\r\n\r\n if (options.dryRun) {\r\n logger.info('🔍 Dry run mode - validation only');\r\n const validationSpinner = logger.spinner('Validating schema...');\r\n\r\n try {\r\n const isValid = await bridge.validateSchema(config.schema);\r\n if (isValid) {\r\n validationSpinner.succeed('Schema is valid');\r\n const info = await bridge.getSchemaInfo(config.schema);\r\n logger.info(`Schema: ${info.title} v${info.version}`);\r\n if (info.description) {\r\n logger.info(`Description: ${info.description}`);\r\n }\r\n } else {\r\n validationSpinner.fail('Schema validation failed');\r\n process.exit(1);\r\n }\r\n } catch (error) {\r\n validationSpinner.fail('Schema validation failed');\r\n logger.error('Schema validation error:', error);\r\n process.exit(1);\r\n }\r\n } else if (options.watch) {\r\n logger.warn('👀 Watch mode is not yet implemented');\r\n logger.info('Falling back to single generation...');\r\n await bridge.generate(config);\r\n } else {\r\n const generationSpinner = logger.spinner('Generating API client...');\r\n try {\r\n await bridge.generate(config);\r\n generationSpinner.succeed('API client generated successfully');\r\n } catch (error) {\r\n generationSpinner.fail('Generation failed');\r\n throw error;\r\n }\r\n }\r\n } catch (error) {\r\n spinner.fail('Generation failed');\r\n if (error instanceof Error) {\r\n logger.error('Error:', error.message);\r\n if (logger.options.level === LogLevel.DEBUG) {\r\n logger.error('Stack trace:', error.stack);\r\n }\r\n } else {\r\n logger.error('Unknown error:', error);\r\n }\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('init')\r\n .description('Initialize a new Mulink project')\r\n .option('-f, --framework <type>', 'Framework type', 'nextjs')\r\n .option('--router <type>', 'Next.js router type', 'app')\r\n .option('-s, --schema <url>', 'OpenAPI schema URL')\r\n .option('-o, --output <dir>', 'Output directory', 'src/generated')\r\n .action(async options => {\r\n const spinner = logger.spinner('Initializing Mulink project...');\r\n\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const config = await configLoader.createDefault(options.framework);\r\n\r\n // Override defaults with provided options\r\n if (options.schema) config.schema = options.schema;\r\n if (options.output) config.outputDir = options.output;\r\n if (options.router) config.framework.router = options.router;\r\n\r\n await configLoader.save(config);\r\n spinner.succeed('Mulink configuration created successfully!');\r\n\r\n logger.info('📋 Configuration Summary:');\r\n logger.info(` Framework: ${config.framework.type}`);\r\n logger.info(` Router: ${config.framework.router}`);\r\n logger.info(` Schema: ${config.schema}`);\r\n logger.info(` Output: ${config.outputDir}`);\r\n\r\n logger.info('\\n🚀 Next steps:');\r\n logger.info('1. Edit link.config.json to configure your API');\r\n logger.info('2. Run \"mulink generate\" to create your API client');\r\n logger.info('3. Run \"mulink validate\" to check your configuration');\r\n } catch (error) {\r\n spinner.fail('Initialization failed');\r\n if (error instanceof Error) {\r\n logger.error('Error:', error.message);\r\n if (logger.options.level === LogLevel.DEBUG) {\r\n logger.error('Stack trace:', error.stack);\r\n }\r\n } else {\r\n logger.error('Unknown error:', error);\r\n }\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('validate')\r\n .description('Validate OpenAPI schema and configuration')\r\n .option('-c, --config <path>', 'Path to config file', 'link.config.json')\r\n .option('--schema-only', 'Only validate the OpenAPI schema')\r\n .action(async options => {\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const config = await configLoader.load(options.config);\r\n\r\n const bridge = new BridgeCore();\r\n\r\n if (options.schemaOnly) {\r\n const isValid = await bridge.validateSchema(config.schema);\r\n if (isValid) {\r\n logger.success('✅ Schema is valid');\r\n const info = await bridge.getSchemaInfo(config.schema);\r\n logger.info(`Title: ${info.title}`);\r\n logger.info(`Version: ${info.version}`);\r\n if (info.description) logger.info(`Description: ${info.description}`);\r\n } else {\r\n logger.error('❌ Schema validation failed');\r\n process.exit(1);\r\n }\r\n } else {\r\n logger.success('✅ Configuration is valid');\r\n const isValid = await bridge.validateSchema(config.schema);\r\n if (isValid) {\r\n logger.success('✅ Schema is valid');\r\n } else {\r\n logger.error('❌ Schema validation failed');\r\n process.exit(1);\r\n }\r\n }\r\n } catch (error) {\r\n logger.error('Validation failed:', error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('clean')\r\n .description('Clean generated files and cache')\r\n .option('-c, --config <path>', 'Path to config file', 'link.config.json')\r\n .option('--force', 'Force clean without confirmation')\r\n .action(async options => {\r\n const spinner = logger.spinner('Cleaning cache and generated files...');\r\n\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const config = await configLoader.load(options.config);\r\n\r\n const bridge = new BridgeCore();\r\n bridge.clearCache();\r\n\r\n // TODO: Implement file cleanup\r\n spinner.succeed('Cache and generated files cleared successfully');\r\n\r\n logger.info('🧹 Cleaned:');\r\n logger.info(' - Schema cache');\r\n logger.info(' - Generated files');\r\n logger.info(' - Build artifacts');\r\n } catch (error) {\r\n spinner.fail('Clean failed');\r\n if (error instanceof Error) {\r\n logger.error('Error:', error.message);\r\n if (logger.options.level === LogLevel.DEBUG) {\r\n logger.error('Stack trace:', error.stack);\r\n }\r\n } else {\r\n logger.error('Unknown error:', error);\r\n }\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('info')\r\n .description('Show project information and status')\r\n .option('-c, --config <path>', 'Path to config file', 'link.config.json')\r\n .action(async options => {\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const config = await configLoader.load(options.config);\r\n\r\n logger.info('📊 Mulink Project Information');\r\n logger.info('='.repeat(40));\r\n logger.info(`Framework: ${config.framework.type}`);\r\n logger.info(`Router: ${config.framework.router}`);\r\n logger.info(`Schema: ${config.schema}`);\r\n logger.info(`Output: ${config.outputDir}`);\r\n logger.info(`Features:`);\r\n logger.info(` - Server Actions: ${config.framework.features.serverActions ? '✅' : '❌'}`);\r\n logger.info(` - Middleware: ${config.framework.features.middleware ? '✅' : '❌'}`);\r\n logger.info(` - Streaming: ${config.framework.features.streaming ? '✅' : '❌'}`);\r\n logger.info(` - Revalidation: ${config.framework.features.revalidation ? '✅' : '❌'}`);\r\n\r\n if (config.auth?.enabled) {\r\n logger.info(`Auth: ${config.auth.provider}`);\r\n }\r\n\r\n if (config.cache) {\r\n logger.info(`Cache: ${config.cache.strategy} (TTL: ${config.cache.ttl}s)`);\r\n }\r\n } catch (error) {\r\n logger.error('Failed to load project info:', error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('check-updates')\r\n .alias('update-check')\r\n .description('Check for available updates')\r\n .option('--force', 'Force check even if recently checked')\r\n .option('--show-current', 'Show current version information')\r\n .action(async options => {\r\n const spinner = logger.spinner('Checking for updates...');\r\n \r\n try {\r\n const versionChecker = createBridgeVersionChecker(logger);\r\n const versionInfo = await versionChecker.checkForUpdates();\r\n const currentVersion = versionChecker.getCurrentVersion();\r\n \r\n if (versionInfo) {\r\n spinner.succeed('Version check completed');\r\n \r\n // Display the enhanced banner with update info\r\n if (versionInfo.updateAvailable) {\r\n const upgradeCommand = versionChecker.getUpgradeCommand(versionInfo);\r\n const updateInfo = {\r\n current: versionInfo.current,\r\n latest: versionInfo.latest,\r\n updateAvailable: versionInfo.updateAvailable,\r\n upgradeCommand\r\n };\r\n \r\n if (logger.options.colors) {\r\n displayColoredBanner(currentVersion,updateInfo);\r\n } else {\r\n displayBanner(currentVersion,updateInfo);\r\n }\r\n } else if (options.showCurrent) {\r\n logger.info(`Current version: ${versionInfo.current}`);\r\n logger.info(`Latest version: ${versionInfo.latest}`);\r\n logger.info('✅ You are using the latest version');\r\n }\r\n } else {\r\n spinner.fail('Could not check for updates');\r\n logger.warn('Unable to fetch version information. Please check your internet connection.');\r\n }\r\n } catch (error) {\r\n spinner.fail('Update check failed');\r\n logger.error('Failed to check for updates:', error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\n// Handle unknown commands\r\nprogram.on('command:*', () => {\r\n logger.error(`Unknown command: ${program.args.join(' ')}`);\r\n logger.info(\"Run 'mulink --help' for available commands\");\r\n process.exit(1);\r\n});\r\n\r\n// Handle errors gracefully\r\nprocess.on('uncaughtException', error => {\r\n logger.error('Uncaught exception:', error);\r\n process.exit(1);\r\n});\r\n\r\nprocess.on('unhandledRejection', reason => {\r\n logger.error('Unhandled rejection:', reason);\r\n process.exit(1);\r\n});\r\n\r\n// Show help if no command provided\r\nif (process.argv.length === 2) {\r\n // Check if colors are disabled\r\n const hasNoColor = process.argv.includes('--no-color');\r\n const currentVersion = versionChecker.getCurrentVersion();\r\n if (hasNoColor) {\r\n displayBanner(currentVersion);\r\n } else {\r\n displayColoredBanner(currentVersion);\r\n }\r\n program.help();\r\n}\r\n\r\nprogram.parse();\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts"],"names":["BridgeLogger","__name","Command","createBridgeVersionChecker","versionChecker","ConfigurationLoader","BridgeCore","resolve","existsSync"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\r\nimport { Command } from 'commander';\r\nimport { existsSync } from 'fs';\r\nimport { resolve } from 'path';\r\nimport { BridgeCore } from '@/core/bridge-core';\r\nimport { ConfigurationLoader } from '@/config/configuration-loader';\r\nimport { BridgeLogger, LogLevel } from '@/utils/logger';\r\nimport { createBridgeVersionChecker } from '@/utils/version-checker';\r\n\r\n// ASCII Art Banner\r\nconst BANNER = (version: string): string => `\r\n ███╗ ███╗██╗ ██╗██╗ ██╗███╗ ██╗██╗ ██╗\r\n ████╗ ████║██║ ██║██║ ██║████╗ ██║██║ ██╔╝\r\n ██╔████╔██║██║ ██║██║ ██║██╔██╗ ██║█████╔╝ \r\n ██║╚██╔╝██║██║ ██║██║ ██║██║╚██╗██║██╔═██╗ \r\n ██║ ╚═╝ ██║╚██████╔╝███████╗██║██║ ╚████║██║ ██╗\r\n ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝\r\n\r\n 🔗 Mulink - Universal Type-Safe API Integration\r\n 🔗 Connect APIs • Generate Clients • Type Safety\r\n 📦 Version: ${version} • 🚀 Next.js 16+ • ⚡ OpenAPI 3.x\r\n`;\r\n\r\nconst logger = new BridgeLogger({ prefix: '🔗 Mulink CLI' });\r\n\r\n// Enhanced banner display with update notification integration\r\nfunction displayBanner(version: string, updateInfo?: { current: string; latest: string; updateAvailable: boolean; upgradeCommand?: string }): void {\r\n let banner = BANNER(version);\r\n \r\n if (updateInfo && updateInfo.updateAvailable) {\r\n const upgradeCommand = updateInfo.upgradeCommand ?? 'npm update mulink';\r\n \r\n banner += `\r\n\r\n─────────────────── 🔄 UPDATE AVAILABLE ──────────────────\r\n\r\n Current Version: ${updateInfo.current}\r\n Latest Version: ${updateInfo.latest}\r\n\r\n Upgrade Command:\r\n ${upgradeCommand}\r\n\r\n Run 'mulink check-updates' for more information\r\n\r\n──────────────────────────────────────────────────────────\r\n`;\r\n }\r\n \r\n console.log(banner);\r\n}\r\n\r\n// Enhanced colored banner display with update notification integration\r\nfunction displayColoredBanner(version: string, updateInfo?: { current: string; latest: string; updateAvailable: boolean; upgradeCommand?: string }): void {\r\n const colors = {\r\n reset: '\\x1b[0m',\r\n bright: '\\x1b[1m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n cyan: '\\x1b[36m',\r\n magenta: '\\x1b[35m',\r\n orange: '\\x1b[38;5;208m',\r\n };\r\n\r\n let banner = BANNER(version)\r\n .replace(/█/g, `${colors.cyan}█${colors.reset}`)\r\n .replace(/🌉/g, `${colors.yellow}🌉${colors.reset}`)\r\n .replace(/🔗/g, `${colors.cyan}🔗${colors.reset}`)\r\n .replace(/📦/g, `${colors.green}📦${colors.reset}`)\r\n .replace(/🚀/g, `${colors.magenta}🚀${colors.reset}`)\r\n .replace(/⚡/g, `${colors.yellow}⚡${colors.reset}`);\r\n\r\n if (updateInfo && updateInfo.updateAvailable) {\r\n const upgradeCommand = updateInfo.upgradeCommand ?? 'npm update mulink';\r\n \r\n const updateBox = `\r\n─────────────────── 🔄 UPDATE AVAILABLE ──────────────────\r\n\r\n Current Version: ${updateInfo.current}\r\n Latest Version: ${updateInfo.latest}\r\n\r\n Upgrade Command:\r\n ${upgradeCommand}\r\n\r\n Run 'mulink check-updates' for more information\r\n\r\n──────────────────────────────────────────────────────────\r\n`;\r\n\r\n banner += updateBox;\r\n }\r\n\r\n console.log(banner);\r\n}\r\n\r\nconst program = new Command();\r\nconst versionChecker = createBridgeVersionChecker(logger);\r\nprogram\r\n .name('mulink')\r\n .description('Universal type-safe API integration library for modern web applications')\r\n .version(versionChecker.getCurrentVersion())\r\n .option('-v, --verbose', 'Enable verbose logging')\r\n .option('-q, --quiet', 'Suppress non-error output')\r\n .option('--no-color', 'Disable colored output')\r\n .option('--no-banner', 'Disable banner display')\r\n .hook('preAction', async (thisCommand) => {\r\n const opts = thisCommand.opts();\r\n if (opts.verbose) {\r\n logger.options.level = LogLevel.DEBUG;\r\n } else if (opts.quiet) {\r\n logger.options.level = LogLevel.ERROR;\r\n }\r\n if (opts.noColor) {\r\n logger.options.colors = false;\r\n }\r\n\r\n // Check for updates first (synchronously for banner integration)\r\n let updateInfo = null;\r\n if (!opts.quiet) {\r\n try {\r\n const versionChecker = createBridgeVersionChecker(logger);\r\n const versionInfo = await versionChecker.checkForUpdates();\r\n \r\n if (versionInfo && versionInfo.updateAvailable) {\r\n const upgradeCommand = versionChecker.getUpgradeCommand(versionInfo);\r\n updateInfo = {\r\n current: versionInfo.current,\r\n latest: versionInfo.latest,\r\n updateAvailable: versionInfo.updateAvailable,\r\n upgradeCommand\r\n };\r\n }\r\n } catch (error) {\r\n // Silently fail - version check should not interrupt user workflow\r\n logger.debug('Version check failed:', error);\r\n }\r\n }\r\n\r\n // Display banner with integrated update notification\r\n if (!opts.noBanner && !opts.quiet) {\r\n const currentVersion = versionChecker.getCurrentVersion();\r\n if (opts.noColor) {\r\n displayBanner(currentVersion, updateInfo ?? undefined);\r\n } else {\r\n displayColoredBanner(currentVersion, updateInfo ?? undefined);\r\n }\r\n }\r\n });\r\n\r\nprogram\r\n .command('generate')\r\n .alias('gen')\r\n .description('Generate API client code from OpenAPI schema')\r\n .option('-c, --config <path>', 'Path to config file', 'link.config.json')\r\n .option('-w, --watch', 'Watch for schema changes and regenerate automatically')\r\n .option('--dry-run', 'Show what would be generated without writing files')\r\n .action(async options => {\r\n const spinner = logger.spinner('Initializing generation...');\r\n\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const config = await configLoader.load(options.config);\r\n spinner.succeed('Configuration loaded');\r\n\r\n const bridge = new BridgeCore();\r\n\r\n if (options.dryRun) {\r\n logger.info('🔍 Dry run mode - validation only');\r\n const validationSpinner = logger.spinner('Validating schema...');\r\n\r\n try {\r\n const isValid = await bridge.validateSchema(config.schema);\r\n if (isValid) {\r\n validationSpinner.succeed('Schema is valid');\r\n const info = await bridge.getSchemaInfo(config.schema);\r\n logger.info(`Schema: ${info.title} v${info.version}`);\r\n if (info.description) {\r\n logger.info(`Description: ${info.description}`);\r\n }\r\n } else {\r\n validationSpinner.fail('Schema validation failed');\r\n process.exit(1);\r\n }\r\n } catch (error) {\r\n validationSpinner.fail('Schema validation failed');\r\n logger.error('Schema validation error:', error);\r\n process.exit(1);\r\n }\r\n } else if (options.watch) {\r\n logger.warn('👀 Watch mode is not yet implemented');\r\n logger.info('Falling back to single generation...');\r\n await bridge.generate(config);\r\n } else {\r\n const generationSpinner = logger.spinner('Generating API client...');\r\n try {\r\n await bridge.generate(config);\r\n generationSpinner.succeed('API client generated successfully');\r\n } catch (error) {\r\n generationSpinner.fail('Generation failed');\r\n throw error;\r\n }\r\n }\r\n } catch (error) {\r\n spinner.fail('Generation failed');\r\n if (error instanceof Error) {\r\n logger.error('Error:', error.message);\r\n if (logger.options.level === LogLevel.DEBUG) {\r\n logger.error('Stack trace:', error.stack);\r\n }\r\n } else {\r\n logger.error('Unknown error:', error);\r\n }\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('init')\r\n .description('Initialize a new Mulink project')\r\n .option('-f, --framework <type>', 'Framework type', 'nextjs')\r\n .option('--router <type>', 'Next.js router type', 'app')\r\n .option('-s, --schema <url>', 'OpenAPI schema URL')\r\n .option('-o, --output <dir>', 'Output directory', 'src/generated')\r\n .action(async options => {\r\n const spinner = logger.spinner('Initializing Mulink project...');\r\n\r\n try {\r\n const configPath = 'link.config.json';\r\n const configFilePath = resolve(process.cwd(), configPath);\r\n\r\n // Check if config file already exists\r\n if (existsSync(configFilePath)) {\r\n spinner.fail('Configuration file already exists');\r\n logger.warn(`A configuration file already exists at: ${configPath}`);\r\n logger.info('If you want to overwrite it, delete the file first or use a different path.');\r\n process.exit(1);\r\n }\r\n\r\n const configLoader = new ConfigurationLoader();\r\n const config = configLoader.createDefault(options.framework);\r\n\r\n // Override defaults with provided options\r\n if (options.schema) {\r\n // Validate schema URL format\r\n try {\r\n new URL(options.schema);\r\n config.schema = options.schema;\r\n } catch {\r\n logger.warn(`Invalid schema URL format: ${options.schema}. Using default.`);\r\n }\r\n }\r\n if (options.output) {\r\n config.outputDir = options.output;\r\n }\r\n if (options.router) {\r\n if (options.router === 'app' || options.router === 'pages') {\r\n config.framework.router = options.router;\r\n } else {\r\n logger.warn(`Invalid router type: ${options.router}. Using default 'app'.`);\r\n }\r\n }\r\n\r\n // Save configuration file\r\n await configLoader.save(config, configPath);\r\n \r\n spinner.succeed('Mulink configuration created successfully!');\r\n\r\n logger.info('📋 Configuration Summary:');\r\n logger.info(` Framework: ${config.framework.type}`);\r\n logger.info(` Router: ${config.framework.router}`);\r\n logger.info(` Schema: ${config.schema}`);\r\n logger.info(` Output: ${config.outputDir}`);\r\n logger.info(` Config file: ${configPath}`);\r\n\r\n logger.info('\\n🚀 Next steps:');\r\n logger.info(`1. Edit ${configPath} to configure your API`);\r\n logger.info('2. Update the schema URL to point to your OpenAPI schema');\r\n logger.info('3. Update the API baseUrl if needed');\r\n logger.info('4. Run \"mulink generate\" to create your API client');\r\n logger.info('5. Run \"mulink validate\" to check your configuration');\r\n } catch (error) {\r\n spinner.fail('Initialization failed');\r\n if (error instanceof Error) {\r\n logger.error('Error:', error.message);\r\n if (logger.options.level === LogLevel.DEBUG) {\r\n logger.error('Stack trace:', error.stack);\r\n }\r\n } else {\r\n logger.error('Unknown error:', error);\r\n }\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('validate')\r\n .description('Validate OpenAPI schema and configuration')\r\n .option('-c, --config <path>', 'Path to config file', 'link.config.json')\r\n .option('--schema-only', 'Only validate the OpenAPI schema')\r\n .action(async options => {\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const config = await configLoader.load(options.config);\r\n\r\n const bridge = new BridgeCore();\r\n\r\n if (options.schemaOnly) {\r\n const isValid = await bridge.validateSchema(config.schema);\r\n if (isValid) {\r\n logger.success('✅ Schema is valid');\r\n const info = await bridge.getSchemaInfo(config.schema);\r\n logger.info(`Title: ${info.title}`);\r\n logger.info(`Version: ${info.version}`);\r\n if (info.description) logger.info(`Description: ${info.description}`);\r\n } else {\r\n logger.error('❌ Schema validation failed');\r\n process.exit(1);\r\n }\r\n } else {\r\n logger.success('✅ Configuration is valid');\r\n const isValid = await bridge.validateSchema(config.schema);\r\n if (isValid) {\r\n logger.success('✅ Schema is valid');\r\n } else {\r\n logger.error('❌ Schema validation failed');\r\n process.exit(1);\r\n }\r\n }\r\n } catch (error) {\r\n logger.error('Validation failed:', error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('clean')\r\n .description('Clean generated files and cache')\r\n .option('-c, --config <path>', 'Path to config file', 'link.config.json')\r\n .option('--force', 'Force clean without confirmation')\r\n .action(async options => {\r\n const spinner = logger.spinner('Cleaning cache and generated files...');\r\n\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const _config = await configLoader.load(options.config);\r\n\r\n const bridge = new BridgeCore();\r\n bridge.clearCache();\r\n\r\n // TODO: Implement file cleanup\r\n spinner.succeed('Cache and generated files cleared successfully');\r\n\r\n logger.info('🧹 Cleaned:');\r\n logger.info(' - Schema cache');\r\n logger.info(' - Generated files');\r\n logger.info(' - Build artifacts');\r\n } catch (error) {\r\n spinner.fail('Clean failed');\r\n if (error instanceof Error) {\r\n logger.error('Error:', error.message);\r\n if (logger.options.level === LogLevel.DEBUG) {\r\n logger.error('Stack trace:', error.stack);\r\n }\r\n } else {\r\n logger.error('Unknown error:', error);\r\n }\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('info')\r\n .description('Show project information and status')\r\n .option('-c, --config <path>', 'Path to config file', 'link.config.json')\r\n .action(async options => {\r\n try {\r\n const configLoader = new ConfigurationLoader();\r\n const config = await configLoader.load(options.config);\r\n\r\n logger.info('📊 Mulink Project Information');\r\n logger.info('='.repeat(40));\r\n logger.info(`Framework: ${config.framework.type}`);\r\n logger.info(`Router: ${config.framework.router}`);\r\n logger.info(`Schema: ${config.schema}`);\r\n logger.info(`Output: ${config.outputDir}`);\r\n logger.info(`Features:`);\r\n logger.info(` - Server Actions: ${config.framework.features.serverActions ? '✅' : '❌'}`);\r\n logger.info(` - Middleware: ${config.framework.features.middleware ? '✅' : '❌'}`);\r\n logger.info(` - Streaming: ${config.framework.features.streaming ? '✅' : '❌'}`);\r\n logger.info(` - Revalidation: ${config.framework.features.revalidation ? '✅' : '❌'}`);\r\n\r\n if (config.auth?.enabled) {\r\n logger.info(`Auth: ${config.auth.provider}`);\r\n }\r\n\r\n if (config.cache) {\r\n logger.info(`Cache: ${config.cache.strategy} (TTL: ${config.cache.ttl}s)`);\r\n }\r\n } catch (error) {\r\n logger.error('Failed to load project info:', error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram\r\n .command('check-updates')\r\n .alias('update-check')\r\n .description('Check for available updates')\r\n .option('--force', 'Force check even if recently checked')\r\n .option('--show-current', 'Show current version information')\r\n .action(async options => {\r\n const spinner = logger.spinner('Checking for updates...');\r\n \r\n try {\r\n const versionChecker = createBridgeVersionChecker(logger);\r\n const versionInfo = await versionChecker.checkForUpdates();\r\n const currentVersion = versionChecker.getCurrentVersion();\r\n \r\n if (versionInfo) {\r\n spinner.succeed('Version check completed');\r\n \r\n // Display the enhanced banner with update info\r\n if (versionInfo.updateAvailable) {\r\n const upgradeCommand = versionChecker.getUpgradeCommand(versionInfo);\r\n const updateInfo = {\r\n current: versionInfo.current,\r\n latest: versionInfo.latest,\r\n updateAvailable: versionInfo.updateAvailable,\r\n upgradeCommand\r\n };\r\n \r\n if (logger.options.colors) {\r\n displayColoredBanner(currentVersion,updateInfo);\r\n } else {\r\n displayBanner(currentVersion,updateInfo);\r\n }\r\n } else if (options.showCurrent) {\r\n logger.info(`Current version: ${versionInfo.current}`);\r\n logger.info(`Latest version: ${versionInfo.latest}`);\r\n logger.info('✅ You are using the latest version');\r\n }\r\n } else {\r\n spinner.fail('Could not check for updates');\r\n logger.warn('Unable to fetch version information. Please check your internet connection.');\r\n }\r\n } catch (error) {\r\n spinner.fail('Update check failed');\r\n logger.error('Failed to check for updates:', error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\n// Handle unknown commands\r\nprogram.on('command:*', () => {\r\n logger.error(`Unknown command: ${program.args.join(' ')}`);\r\n logger.info(\"Run 'mulink --help' for available commands\");\r\n process.exit(1);\r\n});\r\n\r\n// Handle errors gracefully\r\nprocess.on('uncaughtException', error => {\r\n logger.error('Uncaught exception:', error);\r\n process.exit(1);\r\n});\r\n\r\nprocess.on('unhandledRejection', reason => {\r\n logger.error('Unhandled rejection:', reason);\r\n process.exit(1);\r\n});\r\n\r\n// Show help if no command provided\r\nif (process.argv.length === 2) {\r\n // Check if colors are disabled\r\n const hasNoColor = process.argv.includes('--no-color');\r\n const currentVersion = versionChecker.getCurrentVersion();\r\n if (hasNoColor) {\r\n displayBanner(currentVersion);\r\n } else {\r\n displayColoredBanner(currentVersion);\r\n }\r\n program.help();\r\n}\r\n\r\nprogram.parse();\r\n"]}
|
package/dist/lib/cli.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { BridgeLogger, __name, createBridgeVersionChecker, ConfigurationLoader, BridgeCore } from './chunk-
|
|
2
|
+
import { BridgeLogger, __name, createBridgeVersionChecker, ConfigurationLoader, BridgeCore } from './chunk-2WVV6AOO.js';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { resolve } from 'path';
|
|
4
6
|
|
|
5
7
|
var BANNER = /* @__PURE__ */ __name((version) => `
|
|
6
8
|
\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557
|
|
@@ -18,7 +20,7 @@ var logger = new BridgeLogger({ prefix: "\u{1F517} Mulink CLI" });
|
|
|
18
20
|
function displayBanner(version, updateInfo) {
|
|
19
21
|
let banner = BANNER(version);
|
|
20
22
|
if (updateInfo && updateInfo.updateAvailable) {
|
|
21
|
-
const upgradeCommand = updateInfo.upgradeCommand
|
|
23
|
+
const upgradeCommand = updateInfo.upgradeCommand ?? "npm update mulink";
|
|
22
24
|
banner += `
|
|
23
25
|
|
|
24
26
|
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u{1F504} UPDATE AVAILABLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
@@ -46,7 +48,7 @@ function displayColoredBanner(version, updateInfo) {
|
|
|
46
48
|
magenta: "\x1B[35m"};
|
|
47
49
|
let banner = BANNER(version).replace(/█/g, `${colors.cyan}\u2588${colors.reset}`).replace(/🌉/g, `${colors.yellow}\u{1F309}${colors.reset}`).replace(/🔗/g, `${colors.cyan}\u{1F517}${colors.reset}`).replace(/📦/g, `${colors.green}\u{1F4E6}${colors.reset}`).replace(/🚀/g, `${colors.magenta}\u{1F680}${colors.reset}`).replace(/⚡/g, `${colors.yellow}\u26A1${colors.reset}`);
|
|
48
50
|
if (updateInfo && updateInfo.updateAvailable) {
|
|
49
|
-
const upgradeCommand = updateInfo.upgradeCommand
|
|
51
|
+
const upgradeCommand = updateInfo.upgradeCommand ?? "npm update mulink";
|
|
50
52
|
const updateBox = `
|
|
51
53
|
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u{1F504} UPDATE AVAILABLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
52
54
|
|
|
@@ -98,9 +100,9 @@ program.name("mulink").description("Universal type-safe API integration library
|
|
|
98
100
|
if (!opts.noBanner && !opts.quiet) {
|
|
99
101
|
const currentVersion = versionChecker.getCurrentVersion();
|
|
100
102
|
if (opts.noColor) {
|
|
101
|
-
displayBanner(currentVersion, updateInfo
|
|
103
|
+
displayBanner(currentVersion, updateInfo ?? void 0);
|
|
102
104
|
} else {
|
|
103
|
-
displayColoredBanner(currentVersion, updateInfo
|
|
105
|
+
displayColoredBanner(currentVersion, updateInfo ?? void 0);
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
});
|
|
@@ -162,22 +164,48 @@ program.command("generate").alias("gen").description("Generate API client code f
|
|
|
162
164
|
program.command("init").description("Initialize a new Mulink project").option("-f, --framework <type>", "Framework type", "nextjs").option("--router <type>", "Next.js router type", "app").option("-s, --schema <url>", "OpenAPI schema URL").option("-o, --output <dir>", "Output directory", "src/generated").action(async (options) => {
|
|
163
165
|
const spinner = logger.spinner("Initializing Mulink project...");
|
|
164
166
|
try {
|
|
167
|
+
const configPath = "link.config.json";
|
|
168
|
+
const configFilePath = resolve(process.cwd(), configPath);
|
|
169
|
+
if (existsSync(configFilePath)) {
|
|
170
|
+
spinner.fail("Configuration file already exists");
|
|
171
|
+
logger.warn(`A configuration file already exists at: ${configPath}`);
|
|
172
|
+
logger.info("If you want to overwrite it, delete the file first or use a different path.");
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
165
175
|
const configLoader = new ConfigurationLoader();
|
|
166
|
-
const config =
|
|
167
|
-
if (options.schema)
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
176
|
+
const config = configLoader.createDefault(options.framework);
|
|
177
|
+
if (options.schema) {
|
|
178
|
+
try {
|
|
179
|
+
new URL(options.schema);
|
|
180
|
+
config.schema = options.schema;
|
|
181
|
+
} catch {
|
|
182
|
+
logger.warn(`Invalid schema URL format: ${options.schema}. Using default.`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (options.output) {
|
|
186
|
+
config.outputDir = options.output;
|
|
187
|
+
}
|
|
188
|
+
if (options.router) {
|
|
189
|
+
if (options.router === "app" || options.router === "pages") {
|
|
190
|
+
config.framework.router = options.router;
|
|
191
|
+
} else {
|
|
192
|
+
logger.warn(`Invalid router type: ${options.router}. Using default 'app'.`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
await configLoader.save(config, configPath);
|
|
171
196
|
spinner.succeed("Mulink configuration created successfully!");
|
|
172
197
|
logger.info("\u{1F4CB} Configuration Summary:");
|
|
173
198
|
logger.info(` Framework: ${config.framework.type}`);
|
|
174
199
|
logger.info(` Router: ${config.framework.router}`);
|
|
175
200
|
logger.info(` Schema: ${config.schema}`);
|
|
176
201
|
logger.info(` Output: ${config.outputDir}`);
|
|
202
|
+
logger.info(` Config file: ${configPath}`);
|
|
177
203
|
logger.info("\n\u{1F680} Next steps:");
|
|
178
|
-
logger.info(
|
|
179
|
-
logger.info(
|
|
180
|
-
logger.info(
|
|
204
|
+
logger.info(`1. Edit ${configPath} to configure your API`);
|
|
205
|
+
logger.info("2. Update the schema URL to point to your OpenAPI schema");
|
|
206
|
+
logger.info("3. Update the API baseUrl if needed");
|
|
207
|
+
logger.info('4. Run "mulink generate" to create your API client');
|
|
208
|
+
logger.info('5. Run "mulink validate" to check your configuration');
|
|
181
209
|
} catch (error) {
|
|
182
210
|
spinner.fail("Initialization failed");
|
|
183
211
|
if (error instanceof Error) {
|
|
@@ -227,7 +255,7 @@ program.command("clean").description("Clean generated files and cache").option("
|
|
|
227
255
|
const spinner = logger.spinner("Cleaning cache and generated files...");
|
|
228
256
|
try {
|
|
229
257
|
const configLoader = new ConfigurationLoader();
|
|
230
|
-
const
|
|
258
|
+
const _config = await configLoader.load(options.config);
|
|
231
259
|
const bridge = new BridgeCore();
|
|
232
260
|
bridge.clearCache();
|
|
233
261
|
spinner.succeed("Cache and generated files cleared successfully");
|