{"version":3,"file":"index.base.mjs","sources":["../src/migrate.ts"],"sourcesContent":["import camelcase from \"camelcase\";\nimport { Manifest, loadString, getResourceModule } from \"@kosko/yaml\";\nimport stringify from \"fast-safe-stringify\";\nimport { BUILD_TARGET } from \"@kosko/build-scripts\";\n\n/**\n * @public\n */\nexport enum MigrateFormat {\n  /**\n   * CommonJS.\n   */\n  CJS = \"cjs\",\n\n  /**\n   * ECMAScript modules (ESM).\n   */\n  ESM = \"esm\"\n}\n\n/**\n * @public\n */\nexport interface MigrateOptions {\n  /**\n   * Output format.\n   *\n   * @defaultValue Node.js `cjs`\n   * @defaultValue Others `esm`\n   */\n  format?: MigrateFormat;\n}\n\nconst DEFAULT_FORMAT: MigrateFormat =\n  BUILD_TARGET === \"node\" ? MigrateFormat.CJS : MigrateFormat.ESM;\n\ninterface Component {\n  readonly name: string;\n  readonly text: string;\n  readonly imports: readonly Import[];\n}\n\ninterface Import {\n  readonly names: readonly string[];\n  readonly path: string;\n}\n\nfunction jsonStringify(data: unknown): string {\n  return stringify(data, undefined, \"  \");\n}\n\nasync function generateComponent(manifest: Manifest): Promise<Component> {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const { apiVersion, kind, ...data } = manifest;\n  const name = camelcase(kind);\n  const mod = await getResourceModule(manifest);\n\n  if (!mod) {\n    return {\n      name,\n      text: jsonStringify(manifest),\n      imports: []\n    };\n  }\n\n  return {\n    name,\n    text: `new ${mod.export}(${jsonStringify(data)})`,\n    imports: [\n      {\n        path: mod.path,\n        names: [mod.export]\n      }\n    ]\n  };\n}\n\nasync function generateForList(\n  items: readonly Manifest[]\n): Promise<Component[]> {\n  const result: Component[] = [];\n\n  for (const data of items) {\n    if (\n      data.apiVersion === \"v1\" &&\n      data.kind === \"List\" &&\n      Array.isArray(data.items)\n    ) {\n      result.push(...(await generateForList(data.items)));\n    } else {\n      result.push(await generateComponent(data));\n    }\n  }\n\n  return result;\n}\n\nfunction uniqComponentName(components: readonly Component[]): Component[] {\n  const nameMap: { [key: string]: number } = {};\n\n  return components.map((component) => {\n    let name = component.name;\n    const idx = nameMap[name];\n\n    if (idx) {\n      nameMap[name]++;\n      name += idx;\n    } else {\n      nameMap[name] = 1;\n    }\n\n    return {\n      ...component,\n      name\n    };\n  });\n}\n\nfunction collectImports(components: readonly Component[]): Import[] {\n  const importMap: { [key: string]: Set<string> } = {};\n\n  for (const component of components) {\n    for (const { path, names } of component.imports) {\n      if (!importMap[path]) importMap[path] = new Set();\n\n      for (const name of names) {\n        importMap[path].add(name);\n      }\n    }\n  }\n\n  return Object.keys(importMap).map((path) => ({\n    path,\n    names: [...importMap[path].values()]\n  }));\n}\n\n/**\n * Migrate Kubernetes manifests into a Kosko component.\n *\n * @param data - Array of Kubernetes manifests\n * @public\n */\nexport async function migrate(\n  data: readonly Manifest[],\n  options: MigrateOptions = {}\n): Promise<string> {\n  const { format = DEFAULT_FORMAT } = options;\n  const components = uniqComponentName(await generateForList(data));\n  let output = \"\";\n\n  if (format === MigrateFormat.CJS) {\n    output += `\"use strict\";\\n\\n`;\n  }\n\n  for (const { path, names } of collectImports(components)) {\n    if (format === MigrateFormat.CJS) {\n      output += `const { ${names.join(\", \")} } = require(\"${path}\");\\n`;\n    } else {\n      output += `import { ${names.join(\", \")} } from \"${path}\";\\n`;\n    }\n  }\n\n  for (const { name, text } of components) {\n    output += `\\nconst ${name} = ${text};\\n`;\n  }\n\n  const names = components.map((c) => c.name).join(\", \");\n\n  if (format === MigrateFormat.CJS) {\n    output += `\\nmodule.exports = [${names}];\\n`;\n  } else {\n    output += `\\nexport default [${names}];\\n`;\n  }\n\n  return output;\n}\n\n/**\n * Migrate Kubernetes YAML into a kosko component.\n *\n * @param input - Kubernetes YAML string\n * @public\n */\nexport async function migrateString(\n  input: string,\n  options?: MigrateOptions\n): Promise<string> {\n  return migrate(await loadString(input), options);\n}\n\nexport { type Manifest } from \"@kosko/yaml\";\n"],"names":["MigrateFormat","DEFAULT_FORMAT","BUILD_TARGET","jsonStringify","data","stringify","undefined","generateComponent","manifest","apiVersion","kind","name","camelcase","mod","getResourceModule","text","export","imports","path","names","generateForList","items","result","Array","isArray","push","migrate","options","format","components","uniqComponentName","nameMap","map","component","idx","output","collectImports","importMap","Set","add","Object","keys","values","join","c","migrateString","input","loadString"],"mappings":"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"}