@ethereal-nexus/cli 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // bin/index.ts
4
- import { Command as Command3 } from "commander";
4
+ import { Command as Command4 } from "commander";
5
5
 
6
6
  // src/commands/publish.ts
7
7
  import path3 from "path";
@@ -48,13 +48,16 @@ function handleError(error) {
48
48
  import path from "path";
49
49
  import { cosmiconfig } from "cosmiconfig";
50
50
  import { z } from "zod";
51
+ import { promises as fs } from "fs";
51
52
  var DEFAULT_PATH = "./dist/.ethereal";
52
53
  var explorer = cosmiconfig("ethereal");
53
54
  var configSchema = z.object({
54
55
  $schema: z.string().optional(),
55
56
  url: z.string(),
56
- auth: z.string(),
57
- path: z.string().optional()
57
+ auth: z.string().optional(),
58
+ token: z.string().optional(),
59
+ path: z.string().optional(),
60
+ authType: z.enum(["keycloak"]).optional()
58
61
  }).strict();
59
62
  async function getRawConfig(cwd) {
60
63
  try {
@@ -64,6 +67,7 @@ async function getRawConfig(cwd) {
64
67
  }
65
68
  return configSchema.parse(configResult.config);
66
69
  } catch (error) {
70
+ console.error(error.message);
67
71
  throw new Error(`Invalid configuration found in ${cwd}/components.json.`);
68
72
  }
69
73
  }
@@ -82,9 +86,15 @@ async function getConfig() {
82
86
  }
83
87
  return await resolveConfigPaths(cwd, config2);
84
88
  }
89
+ async function saveConfig(config2) {
90
+ const cwd = path.resolve(process.cwd());
91
+ const targetPath = path.resolve(cwd, ".etherealrc");
92
+ await fs.writeFile(targetPath, JSON.stringify(config2, null, 2), "utf8");
93
+ return config2;
94
+ }
85
95
 
86
96
  // src/utils/get-tar-exclude-list.ts
87
- import fs from "node:fs";
97
+ import fs2 from "node:fs";
88
98
  var ignoreCommonFiles = [
89
99
  "package.json",
90
100
  "package-lock.json",
@@ -94,7 +104,7 @@ var ignoreCommonFiles = [
94
104
  ".DS_Store"
95
105
  ];
96
106
  function getTarExcludeList(excludedPaths = []) {
97
- const gitignore = fs.existsSync(".gitignore") ? fs.readFileSync(".gitignore", "utf-8") : "";
107
+ const gitignore = fs2.existsSync(".gitignore") ? fs2.readFileSync(".gitignore", "utf-8") : "";
98
108
  const gitignoreFiles = gitignore?.split("\n")?.filter((file) => !file?.includes("#") && file?.trim() !== "");
99
109
  return [
100
110
  ...gitignoreFiles,
@@ -135,13 +145,19 @@ import ora from "ora";
135
145
 
136
146
  // src/lib/services/nexus.ts
137
147
  import wretch from "wretch";
138
- import fs2 from "node:fs";
148
+ import fs3 from "node:fs";
139
149
  import path2 from "path";
140
150
  var config = await getConfig();
141
- var nexusApi = wretch(config?.url).auth(`apikey ${config?.auth}`);
151
+ var nexusApi = wretch(config?.url);
152
+ if (config?.authType === "keycloak" && config?.token) {
153
+ nexusApi = nexusApi.headers({
154
+ "Cookie": `authjs.session-token=${config.token}`
155
+ });
156
+ }
157
+ nexusApi = nexusApi.auth(`apikey ${config?.auth}`);
142
158
  var publish = async (filePath) => {
143
159
  const form = new FormData();
144
- const buffer = fs2.readFileSync(filePath);
160
+ const buffer = fs3.readFileSync(filePath);
145
161
  const blob = new Blob([buffer]);
146
162
  const fileName = path2.basename(filePath);
147
163
  form.append("file", blob, fileName);
@@ -235,7 +251,7 @@ var publish2 = new Command().name("publish").description("publish a component to
235
251
  });
236
252
 
237
253
  // src/commands/init.ts
238
- import { existsSync as existsSync2, promises as fs3 } from "fs";
254
+ import { existsSync as existsSync2, promises as fs4 } from "fs";
239
255
  import { Command as Command2 } from "commander";
240
256
  import chalk3 from "chalk";
241
257
  import ora2 from "ora";
@@ -305,13 +321,13 @@ async function promptForConfig(cwd, skip) {
305
321
  logger.info("");
306
322
  const spinner = ora2(`Writing .etherealrc...`).start();
307
323
  const targetPath = resolve(cwd, ".etherealrc");
308
- await fs3.writeFile(targetPath, JSON.stringify(config2, null, 2), "utf8");
324
+ await fs4.writeFile(targetPath, JSON.stringify(config2, null, 2), "utf8");
309
325
  spinner.succeed();
310
326
  }
311
327
 
312
328
  // src/utils/get-package-info.ts
313
329
  import path4 from "path";
314
- import fs4 from "fs-extra";
330
+ import fs5 from "fs-extra";
315
331
 
316
332
  // src/utils/dirname.ts
317
333
  import { dirname } from "path";
@@ -321,20 +337,194 @@ var __dirname = dirname(fileURLToPath(import.meta.url));
321
337
  // src/utils/get-package-info.ts
322
338
  function getPackageInfo() {
323
339
  const packageJsonPath = path4.join(__dirname, "../package.json");
324
- return fs4.readJSONSync(packageJsonPath);
340
+ return fs5.readJSONSync(packageJsonPath);
325
341
  }
326
342
 
343
+ // src/commands/auth.ts
344
+ import { Command as Command3 } from "commander";
345
+ import open from "open";
346
+ import ora3 from "ora";
347
+ import chalk4 from "chalk";
348
+ import http from "http";
349
+ import { URL } from "url";
350
+ import inquirer2 from "inquirer";
351
+ var authLogin = new Command3().name("auth").description("Ethereal Nexus authentication command.").argument("login", "to login").option("--port <port>", "Port to use for the callback server", "3000").action(async (_, options) => {
352
+ try {
353
+ const config2 = await getConfig();
354
+ if (!config2) {
355
+ logger.error("No configuration found. Please run `ethereal init` first.");
356
+ process.exit(1);
357
+ }
358
+ if (!config2.url) {
359
+ logger.error("No authentication URL found in configuration.");
360
+ process.exit(1);
361
+ }
362
+ if (!config2.authType || config2.authType !== "keycloak") {
363
+ logger.error('Authentication type must be set to "keycloak" in .etherealrc');
364
+ process.exit(1);
365
+ }
366
+ logger.info(`Starting Keycloak login flow...`);
367
+ const baseUrl = config2.url;
368
+ logger.info(`Using Keycloak server: ${baseUrl}`);
369
+ const server = http.createServer();
370
+ const port = parseInt(options.port);
371
+ try {
372
+ server.listen(port);
373
+ logger.info(`Using port ${port} for callback server`);
374
+ } catch (error) {
375
+ logger.error(`Failed to bind to port ${port}. It might be in use by another application.`);
376
+ process.exit(1);
377
+ }
378
+ server.on("error", (error) => {
379
+ if (error.code === "EADDRINUSE") {
380
+ logger.error(`Port ${port} is already in use. Please specify a different port with --port option.`);
381
+ process.exit(1);
382
+ } else {
383
+ logger.error(`Server error: ${error.message}`);
384
+ process.exit(1);
385
+ }
386
+ });
387
+ const tokenPromise = new Promise((resolve2, reject) => {
388
+ const timeout = setTimeout(() => {
389
+ server.close();
390
+ reject(new Error("Authentication timed out"));
391
+ }, 5 * 60 * 1e3);
392
+ server.on("request", async (req, res) => {
393
+ try {
394
+ const url = new URL(req.url || "", `http://localhost:${port}`);
395
+ const token = url.searchParams.get("token");
396
+ if (token) {
397
+ res.writeHead(200, { "Content-Type": "text/plain" });
398
+ res.end("Ethereal Nexus CLI Authentication successful! You can close this window.");
399
+ clearTimeout(timeout);
400
+ resolve2({ access_token: token });
401
+ server.close();
402
+ }
403
+ } catch (error) {
404
+ reject(error);
405
+ server.close();
406
+ }
407
+ });
408
+ });
409
+ const authUrlBase = baseUrl.endsWith(`/api/v1/cli-auth?callback=http://localhost:${port}`) ? baseUrl : `${baseUrl}/api/v1/cli-auth?callback=http://localhost:${port}`;
410
+ const authUrl = new URL(authUrlBase);
411
+ logger.info(`Opening browser to authenticate...`);
412
+ logger.info(`If the browser doesn't open automatically, please visit:`);
413
+ logger.info(chalk4.cyan(authUrl.toString()));
414
+ await open(authUrl.toString());
415
+ logger.info(`Waiting for authentication...`);
416
+ try {
417
+ const { access_token } = await tokenPromise;
418
+ const spinner = ora3("Saving authentication tokens...").start();
419
+ await saveConfig({
420
+ ...config2,
421
+ token: access_token
422
+ });
423
+ spinner.succeed();
424
+ logger.info(chalk4.green("Authentication successful!"));
425
+ } catch (error) {
426
+ logger.error("Authentication failed:", error);
427
+ process.exit(1);
428
+ }
429
+ } catch (error) {
430
+ handleError(error);
431
+ }
432
+ });
433
+ var authLogout = new Command3().name("auth logout").description("Ethereal Nexus authentication command.").argument("logout", "to logout").action(async () => {
434
+ try {
435
+ const config2 = await getConfig();
436
+ if (!config2) {
437
+ logger.error("No configuration found. Please run `ethereal init` first.");
438
+ process.exit(1);
439
+ }
440
+ if (!config2.auth) {
441
+ logger.info("You are not currently logged in.");
442
+ process.exit(0);
443
+ }
444
+ const spinner = ora3("Removing local authentication token...").start();
445
+ await saveConfig({
446
+ ...config2,
447
+ token: void 0
448
+ });
449
+ spinner.succeed();
450
+ logger.info(chalk4.green("Logged out successfully!"));
451
+ } catch (error) {
452
+ handleError(error);
453
+ }
454
+ });
455
+ var authKeys = new Command3().name("authkeys").description("List and select API keys.").argument("keys", "to list and select API keys").action(async () => {
456
+ try {
457
+ const config2 = await getConfig();
458
+ if (!config2) {
459
+ logger.error("No configuration found. Please run `ethereal init` first.");
460
+ process.exit(1);
461
+ }
462
+ if (!config2.token) {
463
+ logger.error("You are not authenticated. Please run `ethereal auth login` first.");
464
+ process.exit(1);
465
+ }
466
+ logger.info("Fetching API keys...");
467
+ let apiKeys = [];
468
+ const baseUrl = config2.url;
469
+ const apiKeysUrl = baseUrl.endsWith("/api/v1/cli/apikeys") ? baseUrl : `${baseUrl}/api/v1/cli/apikeys`;
470
+ try {
471
+ const response = await fetch(apiKeysUrl, {
472
+ headers: {
473
+ "Cookie": `authjs.session-token=${config2.token}`
474
+ }
475
+ });
476
+ if (!response.ok) {
477
+ logger.error(`Failed to fetch API keys: ${response.statusText}`);
478
+ process.exit(1);
479
+ }
480
+ apiKeys = await response.json();
481
+ if (!apiKeys || apiKeys.length === 0) {
482
+ logger.error("No API keys found for your account.");
483
+ process.exit(1);
484
+ }
485
+ } catch (error) {
486
+ logger.error("Failed to fetch API keys:", error);
487
+ process.exit(1);
488
+ }
489
+ const { selectedKey } = await inquirer2.prompt([
490
+ {
491
+ type: "list",
492
+ name: "selectedKey",
493
+ message: "Select an API key to use:",
494
+ choices: apiKeys.map((key) => {
495
+ const permissionsStr = Object.entries(key.permissions ?? {}).map(([resource, permission]) => `${resource}: ${permission}`).join(", ");
496
+ const createdDate = new Date(key.created_at).toLocaleDateString();
497
+ return {
498
+ name: `${key.alias || "Unnamed Key"} - ${key.key} - Created: ${createdDate} - Permissions: ${permissionsStr}`,
499
+ value: key.key
500
+ };
501
+ })
502
+ }
503
+ ]);
504
+ const spinner = ora3("Saving selected API key...").start();
505
+ await saveConfig({
506
+ ...config2,
507
+ auth: selectedKey
508
+ });
509
+ spinner.succeed();
510
+ logger.info(chalk4.green("API key saved successfully!"));
511
+ logger.info(`Using API key: ${chalk4.cyan(selectedKey)}`);
512
+ } catch (error) {
513
+ handleError(error);
514
+ }
515
+ });
516
+
327
517
  // bin/index.ts
328
518
  process.on("SIGINT", () => process.exit(0));
329
519
  process.on("SIGTERM", () => process.exit(0));
330
520
  function main() {
331
521
  const packageInfo = getPackageInfo();
332
- const program = new Command3().name("ethereal").description("Add components and dependencies to your Nexus projects.").version(
522
+ const program = new Command4().name("ethereal").description("Add components and dependencies to your Nexus projects.").version(
333
523
  packageInfo.version || "1.0.0",
334
524
  "-v, --version",
335
525
  "display the version number"
336
526
  );
337
- program.addCommand(init).addCommand(publish2).parse();
527
+ program.addCommand(init).addCommand(authLogin).addCommand(authLogout).addCommand(authKeys).addCommand(publish2).parse();
338
528
  }
339
529
  main();
340
530
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../bin/index.ts","../src/commands/publish.ts","../src/utils/logger.ts","../src/utils/handle-error.ts","../src/utils/get-config.ts","../src/utils/get-tar-exclude-list.ts","../src/utils/create-tar.ts","../src/lib/services/nexus.ts","../src/commands/init.ts","../src/utils/get-package-info.ts","../src/utils/dirname.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\"\nimport { publish } from '../src/commands/publish';\nimport { init } from '../src/commands/init';\nimport { getPackageInfo } from \"../src/utils/get-package-info\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nfunction main() {\n const packageInfo = getPackageInfo();\n\n const program = new Command()\n .name(\"ethereal\")\n .description(\"Add components and dependencies to your Nexus projects.\")\n .version(\n packageInfo.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program\n .addCommand(init)\n .addCommand(publish)\n .parse()\n}\n\nmain()","import path from 'path';\nimport chalk from 'chalk';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { z } from 'zod';\nimport { handleError } from '../utils/handle-error';\nimport { logger } from '../utils/logger';\nimport { getConfig } from '../utils/get-config';\nimport { getTarExcludeList, ignoreCommonFiles } from '../utils/get-tar-exclude-list';\nimport { createTar } from '../utils/create-tar';\nimport ora from 'ora';\nimport { nexus } from '../lib/services/nexus';\n\nconst publishOptionsSchema = z.object({\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n overwrite: z.boolean(),\n all: z.boolean(),\n path: z.string().optional()\n});\n\nexport const publish = new Command()\n .name('publish')\n .description('publish a component to your project')\n .argument('[components...]', 'the components to add')\n .option('-y, --yes', 'skip confirmation prompt.', false)\n .option('-o, --overwrite', 'overwrite existing versions.', false)\n .option('-a, --all', 'add all available components', false)\n .option('-p, --path <path>', 'the path to .ethereal folder where the component are.')\n .action(async (components, opts) => {\n try {\n const options = publishOptionsSchema.parse({\n components,\n ...opts\n });\n if (!options.all && !options.components?.length) {\n logger.warn(\n `Either [components...] or --all need to be passed.`\n );\n process.exit(1);\n }\n\n const config = await getConfig();\n if (!config) {\n logger.warn(\n `Configuration is missing. Please run ${chalk.green(\n `'init'`\n )} to create an .etherealrc file.`\n );\n process.exit(1);\n }\n\n const distPath = config?.path;\n if (!distPath || !existsSync(distPath)) {\n logger.error(`The path ${distPath} does not exist. Please try again.`);\n process.exit(1);\n }\n\n const selectedComponents = options.all\n ? readdirSync(distPath).filter(folder => !ignoreCommonFiles.includes(folder))\n : options.components!;\n\n const componentPaths = selectedComponents.map(folder => path.resolve(distPath, folder));\n const excludeList = getTarExcludeList();\n const spinner = ora({\n discardStdin: false,\n text: `${chalk.green('Taring files...\\n')}`\n }).start();\n for (const folder of componentPaths) {\n spinner.text = `Taring ${folder}...\\n`;\n createTar(folder, excludeList);\n spinner.stopAndPersist({\n text: folder,\n symbol: chalk.green('✔')\n });\n }\n\n spinner.start(`Publishing...\\n`);\n for (const folder of componentPaths) {\n spinner.text = `Publishing ${folder}...\\n`;\n const tar = `${folder}/ethereal_nexus.tar.gz`;\n try {\n const result = await nexus.publish(tar);\n spinner.stopAndPersist({\n text: folder,\n symbol: chalk.green('✔')\n });\n\n if(result === 409) {\n logger.warn('Some assets were already present.');\n }\n } catch (e) {\n logger.error(`Failed to publish ${tar}.`, e);\n process.exit(1);\n }\n }\n spinner.stop();\n\n logger.info(\"\")\n spinner.succeed(`Done.`);\n logger.info(\n `${chalk.green(\n \"Success!\"\n )} You may now start using your components.`\n )\n } catch (error) {\n handleError(error);\n }\n });\n","import chalk from \"chalk\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(chalk.red(...args))\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(...args))\n },\n info(...args: unknown[]) {\n console.log(chalk.cyan(...args))\n },\n success(...args: unknown[]) {\n console.log(chalk.green(...args))\n },\n break() {\n console.log(\"\")\n },\n}","import { logger } from './logger';\n\nexport function handleError(error: unknown) {\n if (typeof error === \"string\") {\n logger.error(error)\n process.exit(1)\n }\n\n if (error instanceof Error) {\n logger.error(error.message)\n process.exit(1)\n }\n\n logger.error(\"Something went wrong. Please try again.\")\n process.exit(1)\n}","import path from \"path\"\nimport { cosmiconfig } from \"cosmiconfig\"\nimport { z } from \"zod\"\n\nexport const DEFAULT_PATH = \"./dist/.ethereal\"\n\nconst explorer = cosmiconfig(\"ethereal\");\n\nexport const configSchema = z\n .object({\n $schema: z.string().optional(),\n url: z.string(),\n auth: z.string(),\n path: z.string().optional()\n })\n .strict()\n\nexport type Config = z.infer<typeof configSchema>\n\nexport async function getRawConfig(cwd: string): Promise<Config | null> {\n try {\n const configResult = await explorer.search(cwd)\n if (!configResult) {\n return null\n }\n\n return configSchema.parse(configResult.config)\n } catch (error) {\n throw new Error(`Invalid configuration found in ${cwd}/components.json.`)\n }\n}\n\nexport async function resolveConfigPaths(cwd: string, config: Config) {\n const sourcePath = config.path ?? DEFAULT_PATH;\n return configSchema.parse({\n ...config,\n path: path.resolve(cwd, sourcePath),\n })\n}\n\nexport async function getConfig() {\n const cwd = path.resolve(process.cwd())\n const config = await getRawConfig(cwd)\n\n if (!config) {\n return null\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n","import fs from 'node:fs';\n\nexport const ignoreCommonFiles = [\n 'package.json',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'node_modules',\n '.DS_Store'\n]\n\nexport function getTarExcludeList(excludedPaths: string[] = []) {\n const gitignore = fs.existsSync('.gitignore')\n ? fs.readFileSync('.gitignore', 'utf-8')\n : '';\n const gitignoreFiles = gitignore\n ?.split('\\n')\n ?.filter((file) => !file?.includes('#') && file?.trim() !== '');\n\n return [\n ...gitignoreFiles,\n ...excludedPaths,\n ...ignoreCommonFiles,\n '*.tar',\n '*.tar.gz',\n '*.tar.xz',\n ]\n}\n","import { create } from 'tar'\nimport { minimatch } from 'minimatch'\n\nexport function createTar(folder: string, excludeList: string[]) {\n console.log(folder)\n return create(\n {\n gzip: true,\n file: `${folder}/ethereal_nexus.tar.gz`,\n filter: (path) => {\n for (const exclude of excludeList) {\n if (minimatch(path, exclude)) {\n return false\n }\n }\n return true\n },\n cwd: `${folder}/`,\n sync: true,\n },\n ['.']\n )\n}","import wretch from \"wretch\"\nimport { getConfig } from '../../utils/get-config';\nimport fs from 'node:fs';\nimport path from 'path';\n\nconst config = await getConfig()\nconst nexusApi = wretch(config?.url)\n .auth(`apikey ${config?.auth}`)\n\nconst publish = async (filePath: string) => {\n const form = new FormData();\n const buffer = fs.readFileSync(filePath);\n const blob = new Blob([buffer])\n const fileName = path.basename(filePath);\n\n form.append('file', blob, fileName);\n\n return await nexusApi\n .url(\"/api/v1/publish\")\n .body(form)\n .post()\n .error(409, (error) => 409)\n .json()\n}\n\nexport const nexus = {\n publish\n}\n","import { existsSync, promises as fs } from 'fs';\nimport { Command } from 'commander';\nimport { logger } from '../utils/logger';\nimport chalk from 'chalk';\nimport { handleError } from '../utils/handle-error';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport { configSchema, DEFAULT_PATH } from '../utils/get-config';\nimport { z } from 'zod';\nimport { resolve } from 'node:path';\n\nconst initOptionsSchema = z.object({\n yes: z.boolean(),\n});\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project configuration\")\n .option('-y, --yes', 'skip confirmation prompt.', false)\n .action(async (opts) => {\n try {\n const options = initOptionsSchema.parse(opts)\n const cwd = resolve(process.cwd())\n\n // Ensure target directory exists.\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist. Please try again.`)\n process.exit(1)\n }\n\n await promptForConfig(cwd, options.yes)\n\n logger.info(\"\")\n logger.info(\n `${chalk.green(\n \"Success!\"\n )} Project initialization completed. You may now create your components.`\n )\n } catch (error) {\n handleError(error)\n }\n })\n\nexport async function promptForConfig(\n cwd: string,\n skip: boolean,\n) {\n const highlight = (text: string) => chalk.cyan(text)\n\n const options = await inquirer\n .prompt([{\n type: 'input',\n name: 'url',\n message: `What is your ${highlight('Nexus')} instance url?`\n },\n {\n type: 'password',\n name: 'auth',\n message: `What is your ${highlight('Nexus')} instance Api Key?`\n },\n {\n type: 'input',\n name: 'path',\n default: DEFAULT_PATH,\n message: `What is the path for your library output?`\n }\n ])\n\n const config = configSchema.parse({\n url: options.url,\n auth: options.auth,\n path: options.path,\n })\n\n if (!skip) {\n const { proceed } = await inquirer\n .prompt({\n type: \"confirm\",\n name: \"proceed\",\n message: `Write configuration to ${highlight(\n \".etherealrc\"\n )}. Proceed?`,\n default: true,\n })\n\n if (!proceed) {\n process.exit(0)\n }\n }\n logger.info(\"\")\n const spinner = ora(`Writing .etherealrc...`).start()\n const targetPath = resolve(cwd, \".etherealrc\")\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), \"utf8\")\n spinner.succeed()\n}\n","import path from \"path\"\nimport fs from \"fs-extra\"\nimport { __dirname } from \"./dirname\"\nimport { type PackageJson } from \"type-fest\"\n\nexport function getPackageInfo() {\n const packageJsonPath = path.join(__dirname, \"../package.json\")\n\n return fs.readJSONSync(packageJsonPath) as PackageJson\n}","import { dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nexport const __dirname = dirname(fileURLToPath(import.meta.url));"],"mappings":"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","names":["Command","path","chalk","z","config","path","fs","path","z","publish","config","chalk","path","existsSync","fs","Command","chalk","ora","z","Command","existsSync","chalk","config","ora","fs","path","fs","path","fs","Command","publish"]}
1
+ {"version":3,"sources":["../bin/index.ts","../src/commands/publish.ts","../src/utils/logger.ts","../src/utils/handle-error.ts","../src/utils/get-config.ts","../src/utils/get-tar-exclude-list.ts","../src/utils/create-tar.ts","../src/lib/services/nexus.ts","../src/commands/init.ts","../src/utils/get-package-info.ts","../src/utils/dirname.ts","../src/commands/auth.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\"\nimport { publish } from '../src/commands/publish';\nimport { init } from '../src/commands/init';\nimport { getPackageInfo } from \"../src/utils/get-package-info\"\nimport { authLogin, authLogout, authKeys } from '../src/commands/auth';\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nfunction main() {\n const packageInfo = getPackageInfo();\n\n const program = new Command()\n .name(\"ethereal\")\n .description(\"Add components and dependencies to your Nexus projects.\")\n .version(\n packageInfo.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program\n .addCommand(init)\n .addCommand(authLogin)\n .addCommand(authLogout)\n .addCommand(authKeys)\n .addCommand(publish)\n .parse()\n}\n\nmain()\n","import path from 'path';\nimport chalk from 'chalk';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { z } from 'zod';\nimport { handleError } from '../utils/handle-error';\nimport { logger } from '../utils/logger';\nimport { getConfig } from '../utils/get-config';\nimport { getTarExcludeList, ignoreCommonFiles } from '../utils/get-tar-exclude-list';\nimport { createTar } from '../utils/create-tar';\nimport ora from 'ora';\nimport { nexus } from '../lib/services/nexus';\n\nconst publishOptionsSchema = z.object({\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n overwrite: z.boolean(),\n all: z.boolean(),\n path: z.string().optional()\n});\n\nexport const publish = new Command()\n .name('publish')\n .description('publish a component to your project')\n .argument('[components...]', 'the components to add')\n .option('-y, --yes', 'skip confirmation prompt.', false)\n .option('-o, --overwrite', 'overwrite existing versions.', false)\n .option('-a, --all', 'add all available components', false)\n .option('-p, --path <path>', 'the path to .ethereal folder where the component are.')\n .action(async (components, opts) => {\n try {\n const options = publishOptionsSchema.parse({\n components,\n ...opts\n });\n if (!options.all && !options.components?.length) {\n logger.warn(\n `Either [components...] or --all need to be passed.`\n );\n process.exit(1);\n }\n\n const config = await getConfig();\n if (!config) {\n logger.warn(\n `Configuration is missing. Please run ${chalk.green(\n `'init'`\n )} to create an .etherealrc file.`\n );\n process.exit(1);\n }\n\n const distPath = config?.path;\n if (!distPath || !existsSync(distPath)) {\n logger.error(`The path ${distPath} does not exist. Please try again.`);\n process.exit(1);\n }\n\n const selectedComponents = options.all\n ? readdirSync(distPath).filter(folder => !ignoreCommonFiles.includes(folder))\n : options.components!;\n\n const componentPaths = selectedComponents.map(folder => path.resolve(distPath, folder));\n const excludeList = getTarExcludeList();\n const spinner = ora({\n discardStdin: false,\n text: `${chalk.green('Taring files...\\n')}`\n }).start();\n for (const folder of componentPaths) {\n spinner.text = `Taring ${folder}...\\n`;\n createTar(folder, excludeList);\n spinner.stopAndPersist({\n text: folder,\n symbol: chalk.green('✔')\n });\n }\n\n spinner.start(`Publishing...\\n`);\n for (const folder of componentPaths) {\n spinner.text = `Publishing ${folder}...\\n`;\n const tar = `${folder}/ethereal_nexus.tar.gz`;\n try {\n const result = await nexus.publish(tar);\n spinner.stopAndPersist({\n text: folder,\n symbol: chalk.green('✔')\n });\n\n if(result === 409) {\n logger.warn('Some assets were already present.');\n }\n } catch (e) {\n logger.error(`Failed to publish ${tar}.`, e);\n process.exit(1);\n }\n }\n spinner.stop();\n\n logger.info(\"\")\n spinner.succeed(`Done.`);\n logger.info(\n `${chalk.green(\n \"Success!\"\n )} You may now start using your components.`\n )\n } catch (error) {\n handleError(error);\n }\n });\n","import chalk from \"chalk\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(chalk.red(...args))\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(...args))\n },\n info(...args: unknown[]) {\n console.log(chalk.cyan(...args))\n },\n success(...args: unknown[]) {\n console.log(chalk.green(...args))\n },\n break() {\n console.log(\"\")\n },\n}","import { logger } from './logger';\n\nexport function handleError(error: unknown) {\n if (typeof error === \"string\") {\n logger.error(error)\n process.exit(1)\n }\n\n if (error instanceof Error) {\n logger.error(error.message)\n process.exit(1)\n }\n\n logger.error(\"Something went wrong. Please try again.\")\n process.exit(1)\n}","import path from \"path\"\nimport { cosmiconfig } from \"cosmiconfig\"\nimport { z } from \"zod\"\nimport { promises as fs } from 'fs'\n\nexport const DEFAULT_PATH = \"./dist/.ethereal\"\n\nconst explorer = cosmiconfig(\"ethereal\");\n\nexport const configSchema = z\n .object({\n $schema: z.string().optional(),\n url: z.string(),\n auth: z.string().optional(),\n token: z.string().optional(),\n path: z.string().optional(),\n authType: z.enum(['keycloak']).optional(),\n })\n .strict()\n\nexport type Config = z.infer<typeof configSchema>\n\nexport async function getRawConfig(cwd: string): Promise<Config | null> {\n try {\n const configResult = await explorer.search(cwd)\n if (!configResult) {\n return null\n }\n\n return configSchema.parse(configResult.config)\n } catch (error) {\n console.error(error.message)\n throw new Error(`Invalid configuration found in ${cwd}/components.json.`)\n }\n}\n\nexport async function resolveConfigPaths(cwd: string, config: Config) {\n const sourcePath = config.path ?? DEFAULT_PATH;\n return configSchema.parse({\n ...config,\n path: path.resolve(cwd, sourcePath),\n })\n}\n\nexport async function getConfig() {\n const cwd = path.resolve(process.cwd())\n const config = await getRawConfig(cwd)\n\n if (!config) {\n return null\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n\nexport async function saveConfig(config: Config) {\n const cwd = path.resolve(process.cwd())\n const targetPath = path.resolve(cwd, \".etherealrc\")\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), \"utf8\")\n return config\n}\n","import fs from 'node:fs';\n\nexport const ignoreCommonFiles = [\n 'package.json',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'node_modules',\n '.DS_Store'\n]\n\nexport function getTarExcludeList(excludedPaths: string[] = []) {\n const gitignore = fs.existsSync('.gitignore')\n ? fs.readFileSync('.gitignore', 'utf-8')\n : '';\n const gitignoreFiles = gitignore\n ?.split('\\n')\n ?.filter((file) => !file?.includes('#') && file?.trim() !== '');\n\n return [\n ...gitignoreFiles,\n ...excludedPaths,\n ...ignoreCommonFiles,\n '*.tar',\n '*.tar.gz',\n '*.tar.xz',\n ]\n}\n","import { create } from 'tar'\nimport { minimatch } from 'minimatch'\n\nexport function createTar(folder: string, excludeList: string[]) {\n console.log(folder)\n return create(\n {\n gzip: true,\n file: `${folder}/ethereal_nexus.tar.gz`,\n filter: (path) => {\n for (const exclude of excludeList) {\n if (minimatch(path, exclude)) {\n return false\n }\n }\n return true\n },\n cwd: `${folder}/`,\n sync: true,\n },\n ['.']\n )\n}","import wretch from \"wretch\"\nimport { getConfig } from '../../utils/get-config';\nimport fs from 'node:fs';\nimport path from 'path';\n\nconst config = await getConfig()\nlet nexusApi = wretch(config?.url)\n\n// If authType is keycloak and token exists, set the cookie\nif (config?.authType === 'keycloak' && config?.token) {\n nexusApi = nexusApi.headers({\n 'Cookie': `authjs.session-token=${config.token}`\n })\n}\n\nnexusApi = nexusApi.auth(`apikey ${config?.auth}`)\n\n\nconst publish = async (filePath: string) => {\n\n const form = new FormData();\n const buffer = fs.readFileSync(filePath);\n const blob = new Blob([buffer])\n const fileName = path.basename(filePath);\n\n form.append('file', blob, fileName);\n\n\n return await nexusApi\n .url(\"/api/v1/publish\")\n .body(form)\n .post()\n .error(409, (error) => 409)\n .json()\n}\n\nexport const nexus = {\n publish\n}\n","import { existsSync, promises as fs } from 'fs';\nimport { Command } from 'commander';\nimport { logger } from '../utils/logger';\nimport chalk from 'chalk';\nimport { handleError } from '../utils/handle-error';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport { configSchema, DEFAULT_PATH } from '../utils/get-config';\nimport { z } from 'zod';\nimport { resolve } from 'node:path';\n\nconst initOptionsSchema = z.object({\n yes: z.boolean(),\n});\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project configuration\")\n .option('-y, --yes', 'skip confirmation prompt.', false)\n .action(async (opts) => {\n try {\n const options = initOptionsSchema.parse(opts)\n const cwd = resolve(process.cwd())\n\n // Ensure target directory exists.\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist. Please try again.`)\n process.exit(1)\n }\n\n await promptForConfig(cwd, options.yes)\n\n logger.info(\"\")\n logger.info(\n `${chalk.green(\n \"Success!\"\n )} Project initialization completed. You may now create your components.`\n )\n } catch (error) {\n handleError(error)\n }\n })\n\nexport async function promptForConfig(\n cwd: string,\n skip: boolean,\n) {\n const highlight = (text: string) => chalk.cyan(text)\n\n const options = await inquirer\n .prompt([{\n type: 'input',\n name: 'url',\n message: `What is your ${highlight('Nexus')} instance url?`\n },\n {\n type: 'password',\n name: 'auth',\n message: `What is your ${highlight('Nexus')} instance Api Key?`\n },\n {\n type: 'input',\n name: 'path',\n default: DEFAULT_PATH,\n message: `What is the path for your library output?`\n }\n ])\n\n const config = configSchema.parse({\n url: options.url,\n auth: options.auth,\n path: options.path,\n })\n\n if (!skip) {\n const { proceed } = await inquirer\n .prompt({\n type: \"confirm\",\n name: \"proceed\",\n message: `Write configuration to ${highlight(\n \".etherealrc\"\n )}. Proceed?`,\n default: true,\n })\n\n if (!proceed) {\n process.exit(0)\n }\n }\n logger.info(\"\")\n const spinner = ora(`Writing .etherealrc...`).start()\n const targetPath = resolve(cwd, \".etherealrc\")\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), \"utf8\")\n spinner.succeed()\n}\n","import path from \"path\"\nimport fs from \"fs-extra\"\nimport { __dirname } from \"./dirname\"\nimport { type PackageJson } from \"type-fest\"\n\nexport function getPackageInfo() {\n const packageJsonPath = path.join(__dirname, \"../package.json\")\n\n return fs.readJSONSync(packageJsonPath) as PackageJson\n}","import { dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nexport const __dirname = dirname(fileURLToPath(import.meta.url));","import { Command } from 'commander';\nimport { handleError } from '../utils/handle-error';\nimport { getConfig, saveConfig } from '../utils/get-config';\nimport open from 'open';\nimport { logger } from '../utils/logger';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport http from 'http';\nimport { URL } from 'url';\nimport inquirer from 'inquirer';\n\n/**\n * Command to authenticate with Keycloak.\n * This command implements a direct OAuth flow:\n * 1. Verifies that authType is set to 'keycloak' in .etherealrc\n * 2. Uses the authenticationUrl from .etherealrc as the Keycloak server URL\n * 3. Sets up a local server to receive the callback\n * 4. Opens the browser for the user to login\n * 5. Listens for a token parameter in the callback URL (localhost:${port}/?token=...)\n * 6. Saves the received token to the .etherealrc file\n */\nexport const authLogin = new Command()\n .name('auth')\n .description('Ethereal Nexus authentication command.')\n .argument('login', 'to login')\n .option('--port <port>', 'Port to use for the callback server', '3000')\n .action(async (_, options) => {\n try {\n const config = await getConfig();\n\n if (!config) {\n logger.error('No configuration found. Please run `ethereal init` first.');\n process.exit(1);\n }\n\n if (!config.url) {\n logger.error('No authentication URL found in configuration.');\n process.exit(1);\n }\n\n if (!config.authType || config.authType !== 'keycloak') {\n logger.error('Authentication type must be set to \"keycloak\" in .etherealrc');\n process.exit(1);\n }\n\n logger.info(`Starting Keycloak login flow...`);\n\n // Use the authentication URL directly without format verification\n const baseUrl = config.url;\n\n logger.info(`Using Keycloak server: ${baseUrl}`);\n\n // Create a local server to receive the callback\n const server = http.createServer();\n\n // Use the specified port or default to 3000\n const port = parseInt(options.port);\n\n try {\n server.listen(port);\n logger.info(`Using port ${port} for callback server`);\n } catch (error) {\n logger.error(`Failed to bind to port ${port}. It might be in use by another application.`);\n process.exit(1);\n }\n\n // Handle server errors\n server.on('error', (error: any) => {\n if (error.code === 'EADDRINUSE') {\n logger.error(`Port ${port} is already in use. Please specify a different port with --port option.`);\n process.exit(1);\n } else {\n logger.error(`Server error: ${error.message}`);\n process.exit(1);\n }\n });\n\n // Create a promise that will resolve when we get the tokens\n const tokenPromise = new Promise<{ access_token: string, refresh_token?: string }>((resolve, reject) => {\n // Set a timeout to reject the promise after 5 minutes\n const timeout = setTimeout(() => {\n server.close();\n reject(new Error('Authentication timed out'));\n }, 5 * 60 * 1000);\n\n server.on('request', async (req, res) => {\n try {\n // Parse the URL to get the token\n const url = new URL(req.url || '', `http://localhost:${port}`);\n const token = url.searchParams.get('token');\n\n if (token) {\n // Send a response to the browser\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end('Ethereal Nexus CLI Authentication successful! You can close this window.');\n\n // Resolve the promise with the token\n clearTimeout(timeout);\n resolve({ access_token: token });\n\n // Close the server\n server.close();\n }\n } catch (error) {\n reject(error);\n server.close();\n }\n });\n });\n\n // Ensure the auth URL is correctly constructed\n const authUrlBase = baseUrl.endsWith(`/api/v1/cli-auth?callback=http://localhost:${port}`)\n ? baseUrl \n : `${baseUrl}/api/v1/cli-auth?callback=http://localhost:${port}`;\n const authUrl = new URL(authUrlBase);\n\n // Open the browser with the login URL\n logger.info(`Opening browser to authenticate...`);\n logger.info(`If the browser doesn't open automatically, please visit:`);\n logger.info(chalk.cyan(authUrl.toString()));\n\n await open(authUrl.toString());\n\n logger.info(`Waiting for authentication...`);\n\n // Wait for the tokens\n try {\n const { access_token } = await tokenPromise;\n\n // Save the tokens to the config\n const spinner = ora('Saving authentication tokens...').start();\n await saveConfig({\n ...config,\n token: access_token\n });\n spinner.succeed();\n\n logger.info(chalk.green('Authentication successful!'));\n } catch (error) {\n logger.error('Authentication failed:', error);\n process.exit(1);\n }\n } catch (error) {\n handleError(error);\n }\n });\n\n/**\n * Command to logout.\n * This command simply removes the authentication token from the config file.\n */\nexport const authLogout = new Command()\n .name('auth logout')\n .description('Ethereal Nexus authentication command.')\n .argument('logout', 'to logout')\n .action(async () => {\n try {\n const config = await getConfig();\n\n if (!config) {\n logger.error('No configuration found. Please run `ethereal init` first.');\n process.exit(1);\n }\n\n if (!config.auth) {\n logger.info('You are not currently logged in.');\n process.exit(0);\n }\n\n // Remove the token from the config\n const spinner = ora('Removing local authentication token...').start();\n await saveConfig({\n ...config,\n token: undefined\n });\n spinner.succeed();\n\n logger.info(chalk.green('Logged out successfully!'));\n } catch (error) {\n handleError(error);\n }\n });\n\n/**\n * Command to list and select API keys.\n * This command:\n * 1. Checks if .etherealrc has an \"auth\" field\n * 2. Lists all API keys from a specific user (mocked data for now)\n * 3. Allows keyboard selection of a specific API key\n * 4. Saves the selected API key to .etherealrc\n */\nexport const authKeys = new Command()\n .name('authkeys')\n .description('List and select API keys.')\n .argument('keys', 'to list and select API keys')\n .action(async () => {\n try {\n const config = await getConfig();\n\n if (!config) {\n logger.error('No configuration found. Please run `ethereal init` first.');\n process.exit(1);\n }\n\n if (!config.token) {\n logger.error('You are not authenticated. Please run `ethereal auth login` first.');\n process.exit(1);\n }\n\n logger.info('Fetching API keys...');\n\n // Fetch API keys from the server\n let apiKeys = [];\n const baseUrl = config.url;\n const apiKeysUrl = baseUrl.endsWith('/api/v1/cli/apikeys')\n ? baseUrl\n : `${baseUrl}/api/v1/cli/apikeys`;\n\n try {\n const response = await fetch(apiKeysUrl, {\n headers: {\n 'Cookie': `authjs.session-token=${config.token}`\n }\n });\n\n if (!response.ok) {\n logger.error(`Failed to fetch API keys: ${response.statusText}`);\n process.exit(1);\n }\n\n apiKeys = await response.json();\n\n if (!apiKeys || apiKeys.length === 0) {\n logger.error('No API keys found for your account.');\n process.exit(1);\n }\n } catch (error) {\n logger.error('Failed to fetch API keys:', error);\n process.exit(1);\n }\n\n // Display API keys with inquirer\n const { selectedKey } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedKey',\n message: 'Select an API key to use:',\n choices: apiKeys.map((key: { permissions: any; id:string, created_at: string | number | Date; alias: any; key: any; }) => {\n // Format the permissions for display\n const permissionsStr = Object.entries(key.permissions ?? {})\n .map(([resource, permission]) => `${resource}: ${permission}`)\n .join(', ');\n\n // Format the created_at date\n const createdDate = new Date(key.created_at).toLocaleDateString();\n\n return {\n name: `${key.alias || 'Unnamed Key'} - ${key.key} - Created: ${createdDate} - Permissions: ${permissionsStr}`,\n value: key.key\n };\n }),\n },\n ]);\n\n // Save the selected API key to .etherealrc\n const spinner = ora('Saving selected API key...').start();\n await saveConfig({\n ...config,\n auth: selectedKey\n });\n spinner.succeed();\n\n logger.info(chalk.green('API key saved successfully!'));\n logger.info(`Using API key: ${chalk.cyan(selectedKey)}`);\n } catch (error) {\n handleError(error);\n }\n });\n"],"mappings":"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","names":["Command","path","chalk","z","config","fs","path","fs","path","z","publish","config","chalk","path","existsSync","fs","Command","chalk","ora","z","Command","existsSync","chalk","config","ora","fs","path","fs","path","fs","Command","ora","chalk","inquirer","Command","config","resolve","Command","publish"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ethereal-nexus/cli",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "type": "module",
5
5
  "description": "",
6
6
  "exports": "./dist/index.js",
@@ -16,16 +16,18 @@
16
16
  "fs-extra": "^11.2.0",
17
17
  "inquirer": "^9.2.22",
18
18
  "minimatch": "^10.0.1",
19
+ "node-fetch": "^3.3.2",
20
+ "open": "^10.0.3",
19
21
  "ora": "^8.0.1",
20
22
  "tar": "^7.4.0",
21
23
  "wretch": "^2.8.1",
22
- "zod": "^3.22.4"
24
+ "zod": "^3.24.1"
23
25
  },
24
26
  "devDependencies": {
25
27
  "@types/fs-extra": "^11.0.4",
26
28
  "@types/inquirer": "^9.0.7",
27
29
  "@types/node": "^20.12.12",
28
- "tsup": "^8.0.2",
30
+ "tsup": "^8.3.5",
29
31
  "type-fest": "^4.18.2"
30
32
  },
31
33
  "bin": {