{"version":3,"sources":["/home/runner/work/emmett/emmett/src/packages/emmett/dist/cli.cjs","../src/cli.ts","../src/commandLine/config.ts","../src/commandLine/plugins.ts"],"names":[],"mappings":"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","file":"/home/runner/work/emmett/emmett/src/packages/emmett/dist/cli.cjs","sourcesContent":[null,"#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { loadPlugins, registerCliPlugins } from './commandLine';\n\nconst program = new Command();\n\nprogram\n  .name('emmett')\n  .description('CLI tool for Emmett')\n  .option('--config <path>', 'Path to the configuration file');\n\n// Load extensions and parse CLI arguments\nconst initCLI = async () => {\n  const configIndex = process.argv.indexOf('--config');\n\n  const configPath =\n    configIndex !== -1 && process.argv.length > configIndex + 1\n      ? process.argv[configIndex + 1]\n      : undefined;\n\n  try {\n    const plugins = await loadPlugins({\n      pluginType: 'cli',\n      configPath: configPath,\n    });\n    await registerCliPlugins(program, plugins);\n\n    // Parse the CLI arguments\n    program.parse(process.argv);\n  } catch (err) {\n    console.error(`Failed to load config from ${configPath}:`, err);\n  }\n};\n\n//Initialize CLI and handle errors\ninitCLI().catch((err) => {\n  console.error(`CLI initialization failed:`);\n  console.error(err);\n});\n\nexport default program;\nexport * from './commandLine';\n","import { Command as CliCommand } from 'commander';\n// eslint-disable-next-line no-restricted-imports\nimport { writeFileSync } from 'node:fs';\nimport { exit } from 'process';\n\nexport const sampleConfig = (plugins: string[] = ['emmett-expressjs']) => {\n  const pluginsNames =\n    plugins.length > 0\n      ? `[\\n${plugins.map((p) => `\"${p}\"`).join(',\\n')}  \\n]`\n      : '[]';\n\n  return `\nexport default {\n  plugins: ${pluginsNames},\n};\n`;\n};\n\nexport const generateConfigFile = (\n  configPath: string,\n  collectionNames: string[],\n): void => {\n  try {\n    writeFileSync(configPath, sampleConfig(collectionNames), 'utf8');\n    console.log(`Configuration file stored at: ${configPath}`);\n  } catch (error) {\n    console.error(`Error: Couldn't store config file: ${configPath}!`);\n    console.error(error);\n    process.exit(1);\n  }\n};\n\nexport const configCommand = new CliCommand('config').description(\n  'Manage Pongo configuration',\n);\n\ntype SampleConfigOptions =\n  | {\n      plugin: string[];\n      print?: boolean;\n    }\n  | {\n      plugin: string[];\n      generate?: boolean;\n      file?: string;\n    };\n\nconfigCommand\n  .command('sample')\n  .description('Generate or print sample configuration')\n  .option(\n    '-plg, --plugins <name>',\n    'Specify the plugin name',\n    (value: string, previous: string[]) => {\n      // Accumulate plugins names into an array (explicitly typing `previous` as `string[]`)\n      return previous.concat([value]);\n    },\n    [] as string[],\n  )\n  .option(\n    '-f, --file <path>',\n    'Path to configuration file with collection list',\n  )\n  .option('-g, --generate', 'Generate sample config file')\n  .option('-p, --print', 'Print sample config file')\n  .action((options: SampleConfigOptions) => {\n    const plugins =\n      options.plugin.length > 0\n        ? options.plugin\n        : ['@event-driven-io/emmett-expressjs'];\n\n    if (!('print' in options) && !('generate' in options)) {\n      console.error(\n        'Error: Please provide either:\\n--print param to print sample config or\\n--generate to generate sample config file',\n      );\n      exit(1);\n    }\n\n    if ('print' in options) {\n      console.log(`${sampleConfig(plugins)}`);\n    } else if ('generate' in options) {\n      if (!options.file) {\n        console.error(\n          'Error: You need to provide a config file through a --file',\n        );\n        exit(1);\n      }\n\n      generateConfigFile(options.file, plugins);\n    }\n  });\n","import { Command as CliCommand } from 'commander';\nimport path from 'path';\nimport {\n  isPluginConfig,\n  type EmmettCliCommand,\n  type EmmettCliPlugin,\n  type EmmettPlugin,\n  type EmmettPluginConfig,\n  type EmmettPluginsConfig,\n  type EmmettPluginType,\n} from '../config';\nimport { EmmettError } from '../errors';\nimport { sampleConfig } from './config';\n\nconst PluginsConfigImportError = {\n  missingDefaultExport: `Error: Config should contain default export, e.g.\\n\\n${sampleConfig()}`,\n  missingPluginsPropertyExport: `Error: Config should contain default export with plugins array, e.g.\\n\\n${sampleConfig()}`,\n  wrongPluginStructure: `Error: Plugin config should be either string with plugin name or object with plugin name, e.g. { name: 'emmett-expressjs' }`,\n};\nexport const importPluginsConfig = async (options?: {\n  configPath?: string | undefined;\n}): Promise<EmmettPluginsConfig | EmmettError> => {\n  const configPath = path.join(\n    process.cwd(),\n    options?.configPath ?? './dist/emmett.config.js',\n  );\n\n  console.log('IMPORTING' + configPath);\n\n  try {\n    const imported = (await import(configPath)) as {\n      default: Partial<EmmettPluginsConfig>;\n    };\n\n    if (!imported.default) {\n      return new EmmettError(PluginsConfigImportError.missingDefaultExport);\n    }\n\n    if (!imported.default.plugins || !Array.isArray(imported.default.plugins)) {\n      return new EmmettError(\n        PluginsConfigImportError.missingPluginsPropertyExport,\n      );\n    }\n\n    if (!imported.default.plugins.every(isPluginConfig)) {\n      return new EmmettError(PluginsConfigImportError.wrongPluginStructure);\n    }\n\n    return { plugins: imported.default.plugins };\n  } catch (error) {\n    if (!options?.configPath) {\n      console.warn('Didn`t find config file: ' + configPath, error);\n      return { plugins: [] };\n    }\n    return new EmmettError(\n      `Error: Couldn't load file:` + (error as Error).toString(),\n    );\n  }\n};\n\nexport const loadPlugins = async (options?: {\n  pluginType?: EmmettPluginType;\n  configPath?: string;\n}): Promise<EmmettPlugin[]> => {\n  try {\n    const pluginsConfig = await importPluginsConfig({\n      configPath: options?.configPath,\n    });\n\n    if (pluginsConfig instanceof EmmettError) throw pluginsConfig;\n\n    if (pluginsConfig.plugins.length === 0) {\n      console.log(`No extensions specified in config ${options?.configPath}.`);\n      return [];\n    }\n\n    const pluginsToLoad = filterPluginsByType(\n      pluginsConfig.plugins,\n      options?.pluginType,\n    );\n\n    const pluginsPromises = pluginsToLoad.map(async (pluginConfig) => {\n      const importPath = getImportPath(pluginConfig, options?.pluginType);\n      try {\n        const plugin = (await import(importPath)) as { default: EmmettPlugin };\n\n        console.info(`Loaded plugin: ${importPath}`);\n\n        if (!plugin.default) {\n          throw new Error(`Plugin: ${importPath} is missing default export`);\n        }\n\n        return plugin.default;\n      } catch (error) {\n        console.error(`Failed to load extension \"${importPath}\":`, error);\n        return undefined;\n      }\n    });\n\n    return (await Promise.all(pluginsPromises)).filter(\n      (plugin) => plugin !== undefined,\n    );\n  } catch (error) {\n    console.error(`Failed to load config ${options?.configPath}:`, error);\n    return [];\n  }\n};\n\nexport const registerCliPlugins = async (\n  program: CliCommand,\n  plugins: EmmettCliPlugin[],\n): Promise<void> => {\n  const result: EmmettCliPlugin[] = [];\n\n  for (const plugin of plugins) {\n    const pluginName = plugin.name;\n\n    if (!('registerCommands' in plugin)) {\n      console.warn(`No registerCommands function found in ${pluginName}`);\n    }\n    await plugin.registerCommands(program as EmmettCliCommand);\n    console.log(`Loaded extension: ${plugin.name}`);\n    result.push(plugin);\n  }\n};\n\nconst filterPluginsByType = (\n  plugins: EmmettPluginConfig[],\n  pluginType?: EmmettPluginType,\n): EmmettPluginConfig[] =>\n  plugins.filter(\n    (p) =>\n      typeof p === 'string' ||\n      (pluginType &&\n        (p.register === undefined ||\n          p.register.some((r) => r.pluginType === pluginType))),\n  );\n\nconst getImportPath = (\n  pluginConfig: EmmettPluginConfig,\n  pluginType: EmmettPluginType | undefined,\n) => {\n  if (typeof pluginConfig === 'string') {\n    return pluginType ? `${pluginConfig}/${pluginType}` : pluginConfig;\n  }\n\n  const pluginSubpath =\n    pluginConfig.register.find((r) => pluginType && r.pluginType === pluginType)\n      ?.path ?? pluginType;\n\n  return pluginSubpath\n    ? `${pluginConfig.name}/${pluginSubpath}`\n    : pluginConfig.name;\n};\n"]}