@nanoforge-dev/cli 1.6.1-beta.22c536d ā 1.6.1-beta.6ba1d3f
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/command.loader.js +6 -2
- package/dist/command.loader.js.map +1 -1
- package/dist/nf.js +7 -3
- package/package.json +2 -2
package/dist/command.loader.js
CHANGED
|
@@ -1219,10 +1219,14 @@ var AbstractCollection = class {
|
|
|
1219
1219
|
onFail
|
|
1220
1220
|
});
|
|
1221
1221
|
}
|
|
1222
|
-
buildCommandLine(name, options, flags = [
|
|
1222
|
+
buildCommandLine(name, options, flags = [
|
|
1223
|
+
"--no-dry-run",
|
|
1224
|
+
"--allow-private",
|
|
1225
|
+
"--no-debug"
|
|
1226
|
+
]) {
|
|
1223
1227
|
return [
|
|
1224
|
-
`${this.collection}:${name}`,
|
|
1225
1228
|
...flags,
|
|
1229
|
+
`'${getModulePath(this.collection + "/collection.json")}:${name}'`,
|
|
1226
1230
|
...this.serializeOptions(options)
|
|
1227
1231
|
];
|
|
1228
1232
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.loader.js","names":["join","process","join","join","join","join","join"],"sources":["../src/lib/ui/emojis.ts","../src/lib/ui/messages.ts","../src/lib/ui/prefixes.ts","../src/lib/ui/spinner.ts","../src/lib/utils/errors.ts","../src/lib/input/base-inputs.ts","../src/lib/input/ask-inputs.ts","../src/lib/input/inputs/directory.input.ts","../src/lib/input/inputs/config.input.ts","../src/lib/input/inputs/editor.input.ts","../src/lib/question/questions/confirm.question.ts","../src/lib/question/questions/input.question.ts","../src/lib/question/questions/number.question.ts","../src/lib/question/questions/select.question.ts","../src/lib/input/inputs/name.input.ts","../src/lib/input/inputs/path.input.ts","../src/lib/input/inputs/server.input.ts","../src/lib/input/inputs/watch.input.ts","../src/lib/input/inputs/create/type.input.ts","../src/lib/input/inputs/dev/generate.input.ts","../src/lib/input/inputs/editor/open.input.ts","../src/lib/input/inputs/install/lib.input.ts","../src/lib/input/inputs/install/names.input.ts","../src/lib/input/inputs/login-out/api-key.input.ts","../src/lib/input/inputs/login-out/local.input.ts","../src/lib/input/inputs/new/docker.input.ts","../src/lib/input/inputs/new/init-functions.input.ts","../src/lib/input/inputs/new/language.input.ts","../src/lib/input/inputs/new/lint.input.ts","../src/lib/input/inputs/new/package-manager.input.ts","../src/lib/input/inputs/new/server.input.ts","../src/lib/input/inputs/new/skip-install.input.ts","../src/lib/input/inputs/new/strict.input.ts","../src/lib/runner/process-logger.ts","../src/lib/utils/path.ts","../src/lib/utils/spinner.ts","../src/lib/package-manager/package-manager.ts","../src/lib/runner/runner.ts","../src/lib/runner/runner.factory.ts","../src/lib/package-manager/package-manager-name.ts","../src/lib/package-manager/package-manager-configs.ts","../src/lib/package-manager/package-manager.factory.ts","../src/lib/utils/files.ts","../src/lib/utils/run-safe.ts","../src/lib/config/config.type.ts","../src/lib/constants.ts","../src/lib/utils/object.ts","../src/lib/config/config-defaults.ts","../src/lib/config/config-loader.ts","../src/action/common/config.ts","../src/action/abstract.action.ts","../src/action/actions/build.action.ts","../src/lib/schematics/collection.ts","../src/lib/schematics/abstract.collection.ts","../src/lib/schematics/nanoforge.collection.ts","../src/lib/schematics/collection.factory.ts","../src/lib/utils/formatting.ts","../src/lib/schematics/schematic.option.ts","../src/action/common/schematics.ts","../src/action/actions/create.action.ts","../src/action/actions/dev.action.ts","../src/action/actions/editor.action.ts","../src/action/actions/generate.action.ts","../src/lib/global-config/global-config-defaults.ts","../src/lib/global-config/global-config-handler.ts","../src/lib/http/http-client.ts","../src/lib/http/repository.ts","../src/lib/http/client.ts","../src/lib/manifest/manifest-resolver.ts","../src/lib/registry/registry.ts","../src/action/actions/install.action.ts","../src/action/actions/login.action.ts","../src/action/actions/logout.action.ts","../src/lib/git/git-runner.ts","../src/lib/input/inputs/new/git-remote.input.ts","../src/lib/input/inputs/new/git.input.ts","../src/action/actions/new.action.ts","../src/lib/manifest/manifest.type.ts","../src/lib/manifest/manifest-loader.ts","../src/action/actions/publish.action.ts","../src/action/actions/start.action.ts","../src/action/actions/unpublish.action.ts","../src/command/abstract.command.ts","../src/command/commands/build.command.ts","../src/command/commands/create.command.ts","../src/command/commands/dev.command.ts","../src/command/commands/editor.command.ts","../src/command/commands/generate.command.ts","../src/command/commands/install.command.ts","../src/command/commands/login.command.ts","../src/command/commands/logout.command.ts","../src/command/commands/new.command.ts","../src/command/commands/publish.command.ts","../src/command/commands/start.command.ts","../src/command/commands/unpublish.command.ts","../src/command/command.loader.ts"],"sourcesContent":["import { get } from \"node-emoji\";\n\nexport const Emojis = {\n HEART: get(\"heart\"),\n COFFEE: get(\"coffee\"),\n BEER: get(\"beer\"),\n BROKEN_HEART: get(\"broken_heart\"),\n CRYING: get(\"crying_cat_face\"),\n HEART_EYES: get(\"heart_eyes_cat\"),\n JOY: get(\"joy_cat\"),\n KISSING: get(\"kissing_cat\"),\n SCREAM: get(\"scream_cat\"),\n ROCKET: get(\"rocket\"),\n SMIRK: get(\"smirk_cat\"),\n RAISED_HANDS: get(\"raised_hands\"),\n POINT_RIGHT: get(\"point_right\"),\n SPARKLES: get(\"sparkles\"),\n BOOM: get(\"boom\"),\n PRAY: get(\"pray\"),\n WINE: get(\"wine_glass\"),\n};\n","import { bold, green } from \"ansis\";\n\nimport { Emojis } from \"./emojis\";\n\nconst success = (text: string) => `${Emojis.ROCKET} ${text}`;\nconst failure = (text: string) => `${Emojis.SCREAM} ${text}`;\n\nexport const Messages = {\n // --- Build ---\n BUILD_START: \"NanoForge Build\",\n BUILD_SUCCESS: success(\"Build succeeded!\"),\n BUILD_FAILED: failure(\"Build failed!\"),\n BUILD_WATCH_START: \"Watching for changes...\",\n BUILD_PART_IN_PROGRESS: (part: string) => `Building ${part}`,\n BUILD_PART_WATCH_IN_PROGRESS: (part: string) => `${part} updated, rebuilding`,\n BUILD_PART_SUCCESS: (name: string) => success(`Build of ${name} succeeded!`),\n BUILD_PART_FAILED: (part: string, command: string) =>\n failure(`Build of ${part} failed!\\nTry running manually: ${bold(command)}`),\n\n // --- Install ---\n INSTALL_START: \"NanoForge Installation\",\n INSTALL_SUCCESS: success(\"Installation completed!\"),\n INSTALL_FAILED: failure(\"Installation failed!\"),\n INSTALL_NAMES_QUESTION: \"Which libraries do you want to install?\",\n INSTALL_PACKAGES_IN_PROGRESS: \"Install Nanoforge Packages\",\n\n // --- Login ---\n LOGIN_START: \"NanoForge Login\",\n LOGIN_SUCCESS: success(\"Login completed!\"),\n LOGIN_FAILED: failure(\"Login failed!\"),\n LOGIN_API_KEY_QUESTION: \"What is your registry api key?\",\n\n // --- Logout ---\n LOGOUT_START: \"NanoForge Logout\",\n LOGOUT_SUCCESS: success(\"Logout completed!\"),\n LOGOUT_FAILED: failure(\"Logout failed!\"),\n\n // --- New Project ---\n NEW_START: \"NanoForge Project Creation\",\n NEW_SUCCESS: success(\"Project successfully created!\"),\n NEW_FAILED: failure(\"Project creation failed!\"),\n NEW_GENERATION_START: \"Creating project...\",\n NEW_NAME_QUESTION: \"What is the name of your project?\",\n NEW_PACKAGE_MANAGER_QUESTION: \"Which package manager do you want to use?\",\n NEW_LANGUAGE_QUESTION: \"Which language do you want to use?\",\n NEW_STRICT_QUESTION: \"Do you want to use strict type checking?\",\n NEW_SERVER_QUESTION: \"Do you want to generate a server for multiplayer?\",\n NEW_SKIP_INSTALL_QUESTION: \"Do you want to skip dependency installation?\",\n NEW_DOCKER_QUESTION: \"Do you want to add a Dockerfile for containerization?\",\n NEW_GIT_QUESTION: \"Do you want to create a git repository?\",\n NEW_GIT_REMOTE_QUESTION: \"Do you want to setup a git remote? (leave empty if you don't want to)\",\n\n // --- Create ---\n CREATE_START: \"NanoForge Component/System Creation\",\n CREATE_SUCCESS: success(\"Element successfully created!\"),\n CREATE_FAILED: failure(\"Creation failed!\"),\n CREATE_NAME_QUESTION: \"What is the name of your component/system?\",\n\n // --- Generate ---\n GENERATE_START: \"NanoForge Generate\",\n GENERATE_SUCCESS: success(\"Generation succeeded!\"),\n GENERATE_FAILED: failure(\"Generation failed!\"),\n GENERATE_WATCH_START: \"Watching for changes...\",\n\n // --- Dev ---\n DEV_START: \"NanoForge Dev Mode\",\n DEV_SUCCESS: \"Dev mode ended\",\n DEV_FAILED: failure(\"Dev mode failed!\"),\n\n // --- Start ---\n START_START: \"NanoForge Start\",\n START_SUCCESS: success(\"Start completed!\"),\n START_FAILED: failure(\"Start failed!\"),\n START_PART_IN_PROGRESS: (part: string) => `Starting ${part}...`,\n START_PART_SUCCESS: (part: string) => success(`${part} terminated.`),\n START_PART_FAILED: (part: string) => failure(`${part} failed!`),\n\n EDITOR_START: \"NanoForge Editor\",\n EDITOR_SUCCESS: \"Editor ended\",\n EDITOR_FAILED: failure(\"Editor failed!\"),\n\n // --- Publish ---\n PUBLISH_START: \"NanoForge Publish\",\n PUBLISH_SUCCESS: success(\"Publish completed!\"),\n PUBLISH_FAILED: failure(\"Publish failed!\"),\n PUBLISH_IN_PROGRESS: (name: string) => `Publishing ${name}...`,\n\n // --- Unpublish ---\n UNPUBLISH_START: \"NanoForge Unpublish\",\n UNPUBLISH_SUCCESS: success(\"Unpublish completed!\"),\n UNPUBLISH_FAILED: failure(\"Unpublish failed!\"),\n UNPUBLISH_IN_PROGRESS: (name: string) => `Unpublishing ${name}...`,\n\n // --- Schematics ---\n SCHEMATIC_IN_PROGRESS: (name: string) => `Generating ${name}...`,\n SCHEMATIC_WATCH_IN_PROGRESS: (name: string) => `Change detected, regenerating ${name}...`,\n SCHEMATIC_SUCCESS: (name: string) => success(`${name} generated successfully!`),\n SCHEMATIC_FAILED: (name: string) => failure(`${name} generation failed.`),\n\n // --- Package Manager ---\n PACKAGE_MANAGER_INSTALLATION_IN_PROGRESS: `Installing dependencies... ${Emojis.COFFEE}`,\n PACKAGE_MANAGER_INSTALLATION_NOTHING: \"Nothing to install.\",\n PACKAGE_MANAGER_INSTALLATION_SUCCEED: (names?: string[]) =>\n names\n ? success(`Packages installed: ${names.map((n) => green(n)).join(\", \")}`)\n : success(\"Packages installed!\"),\n PACKAGE_MANAGER_INSTALLATION_FAILED: (command: string) =>\n failure(`Package installation failed!\\nTry running manually: ${bold(command)}`),\n\n // --- Git init ---\n GIT_INIT_IN_PROGRESS: `Initializing git repository... ${Emojis.COFFEE}`,\n GIT_INIT_SUCCEED: success(\"Git repository initialized!\"),\n GIT_INIT_FAILED: (command: string) =>\n failure(`Git repository initialization failed!\\nTry running manually: ${bold(command)}`),\n\n // --- Git remote ---\n GIT_REMOTE_IN_PROGRESS: `Adding git remote... ${Emojis.COFFEE}`,\n GIT_REMOTE_SUCCEED: success(\"Git remote added!\"),\n GIT_REMOTE_FAILED: (command: string) =>\n failure(`Git remote addition failed!\\nTry running manually: ${bold(command)}`),\n\n // --- Runner ---\n RUNNER_EXECUTION_ERROR: (command: string) => `\\nFailed to execute command: ${bold(command)}`,\n};\n","import { bgRgb } from \"ansis\";\n\nexport const Prefixes = {\n INFO: bgRgb(60, 190, 100).bold.rgb(0, 0, 0)(\" Info \"),\n ERROR: bgRgb(210, 0, 75).bold.rgb(0, 0, 0)(\" Error \"),\n};\n","import ora from \"ora\";\n\nexport const getSpinner = (message: string) => ora({ text: message });\n","import { cyan, red } from \"ansis\";\n\nexport class CLIError extends Error {\n public readonly suggestion?: string;\n\n constructor(message: string, suggestion?: string) {\n super(message);\n this.name = this.constructor.name;\n this.suggestion = suggestion;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ConfigNotFoundError extends CLIError {\n constructor(configPath: string) {\n super(\n `Configuration file not found at path: ${configPath}.`,\n \"Please run 'nf new' or provide a valid --config path.\",\n );\n }\n}\n\nexport class BuildError extends CLIError {\n constructor(details: string) {\n super(\n `Build failed: ${details}`,\n \"Check the logs above for syntax errors or configuration issues.\",\n );\n }\n}\n\nexport class InvalidCommandArgumentError extends CLIError {\n constructor(argName: string, expected: string) {\n super(\n `Invalid argument '${argName}'. Expected: ${expected}.`,\n \"Verify the command syntax using the --help flag.\",\n );\n }\n}\n\nexport class RegistryAuthenticationError extends CLIError {\n constructor() {\n super(\"You must be logged in to perform this action.\", \"Run 'nf login' to authenticate.\");\n }\n}\n\nexport class ProjectInitializationError extends CLIError {\n constructor(details: string) {\n super(\n `Failed to create new project: ${details}`,\n \"Verify your permissions and that the target directory is empty.\",\n );\n }\n}\n\nexport class ManifestError extends CLIError {\n constructor(detail: string) {\n super(\n `Manifest Error: ${detail}`,\n \"Check your nanoforge.manifest.json file for syntax or formatting errors.\",\n );\n }\n}\n\nexport class FileSystemError extends CLIError {\n constructor(action: string, targetPath: string) {\n super(\n `File System Error [${action}]: ${targetPath}`,\n \"Verify your file permissions and ensure the path exists.\",\n );\n }\n}\n\nexport class ApiRequestError extends CLIError {\n constructor(status: number, cause?: unknown) {\n const causeStr = cause && typeof cause === \"object\" ? JSON.stringify(cause, null, 2) : cause;\n super(\n `API Request failed (Status ${status})${causeStr ? `\\nDetails: ${causeStr}` : \"\"}`,\n \"Check your network connection, API key, or the registry status.\",\n );\n }\n}\n\nconst getErrorString = (error: Error): string => {\n const stack = error.stack ? error.stack : error.message;\n const cause =\n error.cause && typeof error.cause === \"object\"\n ? JSON.stringify(error.cause, null, 2)\n : error.cause;\n return `${stack}${cause ? `\\n${cause}` : \"\"}`;\n};\n\nexport const getErrorMessage = (error: unknown): string | undefined => {\n if (error instanceof Error) return getErrorString(error);\n if (typeof error === \"string\") return error;\n return undefined;\n};\n\nexport const handleActionError = (context: string, error: unknown): never => {\n console.error();\n console.error(red(context));\n\n if (error instanceof CLIError) {\n console.error(error.message);\n\n if (error.suggestion) {\n console.info(cyan(`\\nš” Suggestion: ${error.suggestion}`));\n }\n\n process.exit(1);\n }\n\n const msg = getErrorMessage(error);\n if (msg) console.error(msg);\n process.exit(1);\n};\n\nexport const promptError = (err: Error): never => {\n if (err.name === \"ExitPromptError\") {\n process.exit(1);\n }\n throw err;\n};\n","import { InvalidCommandArgumentError } from \"@utils/errors\";\n\nimport { type Input } from \"./input.type\";\n\nexport const getStringInput = (input: Input, field: string): string | undefined => {\n const value = input.get(field)?.value;\n if (value === undefined) return undefined;\n if (typeof value === \"string\") return value;\n throw new InvalidCommandArgumentError(field, \"string\");\n};\n\nexport const getStringInputWithDefault = (\n input: Input,\n field: string,\n defaultValue: string,\n): string => {\n return getStringInput(input, field) ?? defaultValue;\n};\n\nexport const getBooleanInput = (input: Input, field: string): boolean | undefined => {\n const value = input.get(field)?.value;\n if (value === undefined) return undefined;\n if (typeof value === \"boolean\") return value;\n throw new InvalidCommandArgumentError(field, \"boolean\");\n};\n\nexport const getBooleanInputWithDefault = (\n input: Input,\n field: string,\n defaultValue: boolean,\n): boolean => {\n return getBooleanInput(input, field) ?? defaultValue;\n};\n\nexport const getArrayInput = (input: Input, field: string): string[] | undefined => {\n const value = input.get(field)?.value;\n if (value === undefined) return undefined;\n if (typeof value === \"object\" && Array.isArray(value)) return value;\n throw new InvalidCommandArgumentError(field, \"array\");\n};\n\nexport const getArrayInputWithDefault = (\n input: Input,\n field: string,\n defaultValue: string[],\n): string[] => {\n return getArrayInput(input, field) ?? defaultValue;\n};\n","import { CLIError } from \"@utils/errors\";\n\nexport const getInputOrAsk = async <T>(\n baseInput: T | undefined,\n askCb: () => Promise<T>,\n defaultValue?: T,\n): Promise<T> => {\n if (baseInput !== undefined) return baseInput;\n const res = await askCb();\n if (res !== undefined) return res;\n if (defaultValue !== undefined) return defaultValue;\n throw new CLIError(\"No input provided. Please provide a valid value.\");\n};\n","import { getStringInput, getStringInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport function getDirectoryInput(inputs: Input): string;\nexport function getDirectoryInput(inputs: Input, withDefault: false): string | undefined;\nexport function getDirectoryInput(inputs: Input, withDefault = true): string | undefined {\n if (withDefault) return getStringInputWithDefault(inputs, \"directory\", \".\");\n return getStringInput(inputs, \"directory\");\n}\n","import { getStringInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport const getConfigInput = (inputs: Input): string => {\n return getStringInputWithDefault(inputs, \"config\", \".\");\n};\n","import { getBooleanInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport const getEditorInput = (inputs: Input): boolean => {\n return getBooleanInputWithDefault(inputs, \"editor\", false);\n};\n","import { confirm } from \"@inquirer/prompts\";\n\nimport { promptError } from \"@utils/errors\";\n\ninterface ConfirmOptions {\n default: boolean;\n}\n\nexport const askConfirm = async (\n question: string,\n baseOptions?: Partial<ConfirmOptions>,\n): Promise<boolean | never> => {\n const options: ConfirmOptions = {\n default: false,\n ...(baseOptions ?? {}),\n };\n return await confirm({\n message: question,\n default: options.default,\n }).catch(promptError);\n};\n","import { input } from \"@inquirer/prompts\";\n\nimport { promptError } from \"@utils/errors\";\n\ninterface InputOptions {\n default?: string;\n required: boolean;\n}\n\ninterface InputArrayOptions {\n default?: string;\n required: boolean;\n split: string;\n filter: boolean;\n}\n\nexport const askInput = async (\n question: string,\n baseOptions?: Partial<InputOptions>,\n): Promise<string | never> => {\n const options: InputOptions = {\n required: false,\n ...(baseOptions ?? {}),\n };\n return await input({\n message: question,\n required: options.required,\n default: options.default,\n }).catch(promptError);\n};\n\nexport const askInputArray = async (\n question: string,\n baseOptions?: Partial<InputArrayOptions>,\n): Promise<string[] | never> => {\n const options: InputArrayOptions = {\n required: false,\n split: \" \",\n filter: true,\n ...(baseOptions ?? {}),\n };\n const res = (\n await input({\n message: question,\n required: options.required,\n default: options.default,\n }).catch(promptError)\n ).split(options.split);\n return options.filter ? res.filter((r) => r.length) : res;\n};\n","import { number } from \"@inquirer/prompts\";\n\nimport { CLIError, promptError } from \"@utils/errors\";\n\ninterface NumberOptions {\n default?: number;\n min?: number | undefined;\n max?: number | undefined;\n step?: number | \"any\" | undefined;\n required: boolean;\n}\n\nexport const askNumber = async (\n question: string,\n baseOptions?: Partial<NumberOptions>,\n): Promise<number | never> => {\n const options: NumberOptions = {\n required: false,\n ...(baseOptions ?? {}),\n };\n const res = await number({\n message: question,\n default: options.default,\n min: options.min,\n max: options.max,\n step: options.step,\n required: options.required,\n }).catch(promptError);\n\n if (res === undefined || isNaN(res) || !isFinite(res))\n throw new CLIError(\"Invalid number provided.\");\n return res;\n};\n","import { checkbox, select } from \"@inquirer/prompts\";\n\nimport { promptError } from \"@utils/errors\";\n\ninterface SelectChoice<T> {\n value: T;\n name?: string;\n description?: string;\n short?: string;\n disabled?: boolean | string;\n type?: never;\n}\n\ntype SelectChoices<T> = string[] | SelectChoice<T>[];\n\ninterface MultiSelectChoice<T> {\n value: T;\n name?: string;\n checkedName?: string;\n description?: string;\n short?: string;\n disabled?: boolean | string;\n checked?: boolean;\n type?: never;\n}\n\ntype MultiSelectChoices<T> = string[] | MultiSelectChoice<T>[];\n\ninterface SelectOptions<T> {\n default?: T;\n loop: boolean;\n}\n\ninterface MultiSelectOptions {\n loop: boolean;\n required: boolean;\n}\nexport const askSelect = async <T extends string = string>(\n question: string,\n choices: SelectChoices<T>,\n baseOptions?: Partial<SelectOptions<T>>,\n): Promise<T | never> => {\n const options: SelectOptions<T> = {\n loop: true,\n ...(baseOptions ?? {}),\n };\n return (await select({\n message: question,\n choices,\n loop: options.loop,\n default: options.default,\n }).catch(promptError)) as T;\n};\n\nexport const askMultiSelect = async <T extends string = string>(\n question: string,\n choices: MultiSelectChoices<T>,\n baseOptions?: Partial<MultiSelectOptions>,\n): Promise<T[] | never> => {\n const options: MultiSelectOptions = {\n loop: true,\n required: false,\n ...(baseOptions ?? {}),\n };\n return (await checkbox({\n message: question,\n choices,\n loop: options.loop,\n required: options.required,\n }).catch(promptError)) as T[];\n};\n","import { askInput } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../ask-inputs\";\nimport { getStringInput } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nconst getNameInput = (inputs: Input) => {\n return getStringInput(inputs, \"name\");\n};\n\nexport const getNewNameInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNameInput(inputs), () =>\n askInput(Messages.NEW_NAME_QUESTION, {\n required: true,\n default: \"nanoforge-app\",\n }),\n );\n};\n\nexport const getCreateNameInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNameInput(inputs), () =>\n askInput(Messages.CREATE_NAME_QUESTION, {\n required: true,\n default: \"example\",\n }),\n );\n};\n","import { getStringInput, getStringInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport const getPathInput = (inputs: Input) => {\n return getStringInput(inputs, \"path\");\n};\n\nexport const getPathInputWithDefault = (inputs: Input, defaultValue: string) => {\n return getStringInputWithDefault(inputs, \"path\", defaultValue);\n};\n","import { getBooleanInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport function getServerInput(inputs: Input): boolean {\n return getBooleanInputWithDefault(inputs, \"server\", false);\n}\n","import { getBooleanInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport const getWatchInput = (inputs: Input): boolean => {\n return getBooleanInputWithDefault(inputs, \"watch\", false);\n};\n","import { getStringInput } from \"@lib/input\";\nimport { type Input } from \"@lib/input\";\n\nimport { InvalidCommandArgumentError } from \"@utils/errors\";\n\nexport const getCreateTypeInput = (inputs: Input): \"component\" | \"system\" => {\n const res = getStringInput(inputs, \"type\");\n if (res && [\"component\", \"system\"].includes(res)) return res as \"component\" | \"system\";\n throw new InvalidCommandArgumentError(\"type\", \"'component' or 'system'\");\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport const getDevGenerateInput = (inputs: Input): boolean => {\n return getBooleanInputWithDefault(inputs, \"generate\", false);\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport const getEditorOpenInput = (inputs: Input, defaultValue: boolean): boolean => {\n return getBooleanInputWithDefault(inputs, \"open\", defaultValue);\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport function getInstallLibInput(inputs: Input): boolean {\n return getBooleanInputWithDefault(inputs, \"lib\", false);\n}\n","import { askInputArray } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getArrayInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNamesInput = (inputs: Input) => {\n return getArrayInput(inputs, \"names\");\n};\n\nexport const getInstallNamesInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNamesInput(inputs), () =>\n askInputArray(Messages.INSTALL_NAMES_QUESTION, { required: true }),\n );\n};\n","import { askInput } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getStringInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getApiKeyInput = (inputs: Input) => {\n return getStringInput(inputs, \"apiKey\");\n};\n\nexport const getLoginApiKeyInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getApiKeyInput(inputs), () =>\n askInput(Messages.LOGIN_API_KEY_QUESTION, {\n required: true,\n }),\n );\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport function getLocalInput(inputs: Input): boolean {\n return getBooleanInputWithDefault(inputs, \"local\", false);\n}\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewDockerInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"docker\");\n};\n\nexport const getNewDockerOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewDockerInput(inputs), () =>\n askConfirm(Messages.NEW_DOCKER_QUESTION, { default: true }),\n );\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport const getNewInitFunctionsWithDefault = (inputs: Input) => {\n return getBooleanInputWithDefault(inputs, \"initFunctions\", false);\n};\n","import { askSelect } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getStringInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getLanguageInput = (inputs: Input) => {\n return getStringInput(inputs, \"language\");\n};\n\nexport const getNewLanguageInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getLanguageInput(inputs), () =>\n askSelect<\"ts\" | \"js\">(Messages.NEW_LANGUAGE_QUESTION, [{ value: \"ts\" }, { value: \"js\" }], {\n default: \"ts\",\n }),\n );\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport const getNewLintInput = (inputs: Input): boolean => {\n return getBooleanInputWithDefault(inputs, \"lint\", true);\n};\n","import { askSelect } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getStringInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getPackageManagerInput = (inputs: Input) => {\n return getStringInput(inputs, \"packageManager\");\n};\n\nexport const getNewPackageManagerInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getPackageManagerInput(inputs), () =>\n askSelect<\"npm\" | \"yarn\" | \"pnpm\" | \"bun\">(\n Messages.NEW_PACKAGE_MANAGER_QUESTION,\n [{ value: \"npm\" }, { value: \"yarn\" }, { value: \"pnpm\" }, { value: \"bun\" }],\n {\n default: \"npm\",\n },\n ),\n );\n};\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewServerInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"server\");\n};\n\nexport const getNewServerOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewServerInput(inputs), () =>\n askConfirm(Messages.NEW_SERVER_QUESTION, { default: false }),\n );\n};\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewSkipInstallInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"skipInstall\");\n};\n\nexport const getNewSkipInstallOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewSkipInstallInput(inputs), () =>\n askConfirm(Messages.NEW_SKIP_INSTALL_QUESTION, { default: false }),\n );\n};\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewStrictInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"strict\");\n};\n\nexport const getNewStrictOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewStrictInput(inputs), () =>\n askConfirm(Messages.NEW_STRICT_QUESTION, { default: true }),\n );\n};\n","import { green, red, yellow } from \"ansis\";\n\nconst formatLines = (chunk: string | ArrayBuffer): string[] => {\n return chunk\n .toString()\n .replace(/\\r\\n|\\n/g, \"\\n\")\n .replace(/^\\n+|\\n+$/g, \"\")\n .split(\"\\n\");\n};\n\nconst timestamp = (): string => yellow(`[${new Date().toISOString()}]`);\n\nexport const createStdoutLogger = (name: string) => (chunk: string) => {\n const prefix = green(`(${name}) INFO -`);\n for (const line of formatLines(chunk)) {\n console.info(`${timestamp()} ${prefix} ${line}`);\n }\n};\n\nexport const createStderrLogger = (name: string) => (chunk: string) => {\n const prefix = red(`(${name}) ERROR -`);\n for (const line of formatLines(chunk)) {\n console.error(`${timestamp()} ${prefix} ${line}`);\n }\n};\n","import fs from \"fs\";\nimport { join, resolve } from \"path\";\n\nimport { FileSystemError } from \"@utils/errors\";\n\nexport const getCwd = (directory: string) => {\n return resolve(directory);\n};\n\nexport const getModulePath = (name: string, removeLast = false) => {\n const path = import.meta.resolve(name).replace(/^file:\\/\\//, \"\");\n if (removeLast) return path.split(\"/\").slice(0, -1).join(\"/\");\n return path;\n};\n\nexport const resolveCLINodeBinaryPath = (name: string) => {\n let base = join(getModulePath(\"./\", true), \"..\");\n while (base.length >= 1) {\n const path = join(base, \"node_modules\", \".bin\", name);\n try {\n fs.accessSync(path);\n return path;\n } catch {\n base = join(base, \"..\");\n }\n }\n throw new FileSystemError(\"resolve binary\", name);\n};\n","import { red } from \"ansis\";\nimport { type Ora } from \"ora\";\n\nimport { getSpinner } from \"@lib/ui\";\n\ninterface SpinnerTaskResult<T> {\n success: boolean;\n value?: T;\n error?: unknown;\n}\n\nexport const withSpinner = async <T>(\n task: (spinner: Ora) => Promise<T>,\n loadingMessage: string,\n successMessage?: string,\n failureMessage?: string,\n onError?: () => void,\n): Promise<SpinnerTaskResult<T>> => {\n const spinner = getSpinner(loadingMessage);\n spinner.start();\n\n try {\n const value = await task(spinner);\n spinner.succeed(successMessage);\n return { success: true, value };\n } catch (error: unknown) {\n spinner.fail(red(failureMessage));\n if (onError) onError();\n return { success: false, error };\n }\n};\n","import { red } from \"ansis\";\n\nimport { createStderrLogger, createStdoutLogger } from \"@lib/runner/process-logger\";\nimport { type RunOptions, type Runner } from \"@lib/runner/runner\";\nimport { Messages } from \"@lib/ui\";\n\nimport { CLIError } from \"@utils/errors\";\nimport { getCwd } from \"@utils/path\";\nimport { withSpinner } from \"@utils/spinner\";\n\nimport { type PackageManagerCommands } from \"./package-manager-commands\";\n\nexport class PackageManager {\n constructor(\n public readonly name: string,\n private readonly commands: PackageManagerCommands,\n private readonly runner: Runner,\n ) {}\n\n public async install(directory: string): Promise<boolean> {\n const args = [this.commands.install, this.commands.silentFlag];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n Messages.PACKAGE_MANAGER_INSTALLATION_IN_PROGRESS,\n Messages.PACKAGE_MANAGER_INSTALLATION_SUCCEED(),\n Messages.PACKAGE_MANAGER_INSTALLATION_FAILED(this.formatFailCommand([this.commands.install])),\n );\n\n return result.success;\n }\n\n public async addProduction(directory: string, dependencies: string[]): Promise<boolean> {\n return this.addDependencies(this.commands.saveFlag, directory, dependencies);\n }\n\n public async addDevelopment(directory: string, dependencies: string[]): Promise<boolean> {\n return this.addDependencies(this.commands.saveDevFlag, directory, dependencies);\n }\n\n public async build(\n name: string,\n directory: string,\n entry: string,\n output: string,\n flags: string[] = [],\n watch = false,\n ): Promise<boolean> {\n this.assertSupports(\"build\");\n\n const message = watch\n ? Messages.BUILD_PART_WATCH_IN_PROGRESS(name)\n : Messages.BUILD_PART_IN_PROGRESS(name);\n\n const args = [\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.commands.build!,\n this.commands.silentFlag,\n entry,\n \"--outdir\",\n output,\n ...flags,\n ];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n message,\n Messages.BUILD_PART_SUCCESS(name),\n Messages.BUILD_PART_FAILED(name, this.formatFailCommand(args)),\n );\n\n return result.success;\n }\n\n public async run(\n name: string,\n directory: string,\n script: string,\n params: string[],\n env: Record<string, string> = {},\n flags: string[] = [],\n silent = false,\n ): Promise<boolean> {\n console.info(Messages.START_PART_IN_PROGRESS(name));\n\n try {\n const args = this.buildRunArgs(script, params, flags, silent);\n await this.exec(args, directory, {\n env,\n listeners: {\n onStdout: createStdoutLogger(name),\n onStderr: createStderrLogger(name),\n },\n });\n console.info(Messages.START_PART_SUCCESS(name));\n return true;\n } catch {\n console.error(red(Messages.START_PART_FAILED(name)));\n return false;\n }\n }\n\n public async runFile(\n name: string,\n directory: string,\n script: string,\n params: string[],\n env: Record<string, string> = {},\n flags: string[] = [],\n silent = false,\n ): Promise<boolean> {\n console.info(Messages.START_PART_IN_PROGRESS(name));\n\n try {\n const args = this.buildRunFileArgs(script, params, flags, silent);\n await this.exec(args, directory, {\n env,\n listeners: {\n onStdout: createStdoutLogger(name),\n onStderr: createStderrLogger(name),\n },\n });\n console.info(Messages.START_PART_SUCCESS(name));\n return true;\n } catch {\n console.error(red(Messages.START_PART_FAILED(name)));\n return false;\n }\n }\n\n public async runDev(\n directory: string,\n command: string,\n env: Record<string, string> = {},\n flags: string[] = [],\n collect = true,\n ): Promise<boolean> {\n try {\n const base = [this.commands.exec, command];\n if (this.commands.runArgsFlag) base.push(this.commands.runArgsFlag);\n await this.exec([...base, ...flags], directory, { collect, env });\n return true;\n } catch {\n return false;\n }\n }\n\n private async addDependencies(\n saveFlag: string,\n directory: string,\n dependencies: string[],\n ): Promise<boolean> {\n if (!dependencies.length) {\n this.logEmpty(Messages.PACKAGE_MANAGER_INSTALLATION_NOTHING);\n return true;\n }\n\n const args = [this.commands.add, saveFlag, ...dependencies];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n Messages.PACKAGE_MANAGER_INSTALLATION_IN_PROGRESS,\n Messages.PACKAGE_MANAGER_INSTALLATION_SUCCEED(),\n Messages.PACKAGE_MANAGER_INSTALLATION_FAILED(this.formatFailCommand(args)),\n );\n\n return result.success;\n }\n\n private assertSupports(feature: keyof PackageManagerCommands): void {\n if (!this.commands[feature]) {\n throw new CLIError(`Package manager \"${this.name}\" does not support \"${feature}\"`);\n }\n }\n\n private buildRunArgs(\n script: string,\n params: string[],\n flags: string[],\n silent: boolean,\n ): string[] {\n const args = [...flags, this.commands.run];\n if (silent) args.push(this.commands.silentFlag);\n args.push(script);\n if (params.length === 0) return args;\n if (this.commands.runArgsFlag) args.push(this.commands.runArgsFlag);\n return args.concat(params);\n }\n\n private buildRunFileArgs(\n script: string,\n params: string[],\n flags: string[],\n silent: boolean,\n ): string[] {\n if (!this.commands.runFile) throw new CLIError(\"Package manager does not support runFile\");\n const args = [...flags, this.commands.runFile];\n if (silent) args.push(this.commands.silentFlag);\n args.push(script);\n if (params.length === 0) return args;\n if (this.commands.runArgsFlag) args.push(this.commands.runArgsFlag);\n return args.concat(params);\n }\n\n private exec(\n args: string[],\n directory: string,\n options: {\n collect?: boolean;\n env?: Record<string, string>;\n listeners?: RunOptions[\"listeners\"];\n onFail?: () => void;\n } = {},\n ): Promise<string | null> {\n return this.runner.run(args, {\n collect: options.collect ?? true,\n cwd: getCwd(directory),\n env: options.env,\n listeners: options.listeners,\n onFail: options.onFail,\n });\n }\n\n private formatFailCommand(args: string[]): string {\n return this.runner.fullCommand(args);\n }\n\n private logEmpty(message: string): void {\n console.info();\n console.info(message);\n console.info();\n }\n}\n","import { red } from \"ansis\";\nimport { type ChildProcess, type SpawnOptions, spawn } from \"child_process\";\nimport * as process from \"node:process\";\n\nexport interface RunOptions {\n collect?: boolean;\n cwd?: string;\n env?: Record<string, string>;\n listeners?: RunnerListeners;\n onFail?: () => void;\n}\n\nexport interface RunnerListeners {\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n}\n\nexport class Runner {\n constructor(\n private readonly binary: string,\n private readonly baseArgs: string[] = [],\n ) {}\n\n public async run(args: string[], options: RunOptions = {}): Promise<string | null> {\n const { collect = false, cwd = process.cwd(), env, listeners, onFail } = options;\n const spawnOpts = this.buildSpawnOptions(collect, cwd, env);\n const fullArgs = [...this.baseArgs, ...args];\n\n return new Promise<string | null>((resolve, reject) => {\n const child = spawn(`${this.binary} ${fullArgs.join(\" \")}`, spawnOpts);\n const output = this.attachOutputHandlers(child, listeners);\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(this.formatOutput(output, collect));\n } else {\n this.handleFailure(output, fullArgs, onFail);\n reject(this.createError(fullArgs, code));\n }\n });\n });\n }\n\n public fullCommand(args: string[]): string {\n return [this.binary, ...this.baseArgs, ...args].join(\" \");\n }\n\n private buildSpawnOptions(\n collect: boolean,\n cwd: string,\n env?: Record<string, string>,\n ): SpawnOptions {\n return {\n cwd,\n stdio: collect ? \"pipe\" : \"inherit\",\n shell: true,\n env: { ...process.env, ...env },\n };\n }\n\n private attachOutputHandlers(child: ChildProcess, listeners?: RunnerListeners): string[] {\n const output: string[] = [];\n const defaultHandler = (data: Buffer) => output.push(data.toString().replace(/\\r\\n|\\n/, \"\"));\n\n child.stdout?.on(\"data\", listeners?.onStdout ?? defaultHandler);\n child.stderr?.on(\"data\", listeners?.onStderr ?? defaultHandler);\n\n return output;\n }\n\n private formatOutput(output: string[], collect: boolean): string | null {\n return collect && output.length ? output.join(\"\\n\") : null;\n }\n\n private handleFailure(output: string[], args: string[], onFail?: () => void): void {\n if (onFail) onFail();\n this.logFailedCommand(args);\n this.logCapturedOutput(output);\n }\n\n private logFailedCommand(args: string[]): void {\n console.error(red(`\\nFailed to execute command: ${this.binary} ${args.join(\" \")}`));\n }\n\n private logCapturedOutput(output: string[]): void {\n if (output.length) {\n console.error();\n console.error(output.join(\"\\n\"));\n console.error();\n }\n }\n\n private createError(args: string[], code: number | null): Error {\n return new Error(`Command \"${this.binary} ${args.join(\" \")}\" exited with code ${code}`);\n }\n}\n","import { CLIError } from \"@utils/errors\";\nimport { getModulePath, resolveCLINodeBinaryPath } from \"@utils/path\";\n\nimport { Runner } from \"./runner\";\n\nexport class RunnerFactory {\n public static create(binary: string, args?: string[]): Runner {\n return new Runner(binary, args);\n }\n\n public static createLocal(binary: string, args?: string[]): Runner {\n return new Runner(resolveCLINodeBinaryPath(binary), args);\n }\n\n public static createSchematic(): Runner {\n const binaryPath = this.resolveSchematicBinary();\n return new Runner(\"node\", [`\"${binaryPath}\"`]);\n }\n\n private static resolveSchematicBinary(): string {\n try {\n return getModulePath(\"@angular-devkit/schematics-cli/bin/schematics.js\");\n } catch {\n throw new CLIError(\"'schematics' binary path could not be found!\");\n }\n }\n}\n","export enum PackageManagerName {\n BUN = \"bun\",\n LOCAL_BUN = \"local_bun\",\n NPM = \"npm\",\n PNPM = \"pnpm\",\n YARN = \"yarn\",\n}\n","import { type PackageManagerCommands } from \"./package-manager-commands\";\nimport { PackageManagerName } from \"./package-manager-name\";\n\nexport const PM_CONFIGS: Record<\n PackageManagerName,\n { binary: string; commands: PackageManagerCommands }\n> = {\n [PackageManagerName.BUN]: {\n binary: \"bun\",\n commands: {\n install: \"install\",\n add: \"add\",\n update: \"update\",\n remove: \"remove\",\n exec: \"exec\",\n run: \"run\",\n saveFlag: \"--save\",\n saveDevFlag: \"--dev\",\n silentFlag: \"--silent\",\n },\n },\n [PackageManagerName.LOCAL_BUN]: {\n binary: \"bun\",\n commands: {\n install: \"install\",\n add: \"add\",\n update: \"update\",\n remove: \"remove\",\n exec: \"exec\",\n run: \"run\",\n build: \"build\",\n runFile: \"run\",\n saveFlag: \"--save\",\n saveDevFlag: \"--dev\",\n silentFlag: \"--silent\",\n },\n },\n [PackageManagerName.NPM]: {\n binary: \"npm\",\n commands: {\n install: \"install\",\n add: \"install\",\n update: \"update\",\n remove: \"uninstall\",\n exec: \"exec\",\n run: \"run\",\n runArgsFlag: \"--\",\n saveFlag: \"--save\",\n saveDevFlag: \"--save-dev\",\n silentFlag: \"--silent\",\n },\n },\n [PackageManagerName.PNPM]: {\n binary: \"pnpm\",\n commands: {\n install: \"install\",\n add: \"add\",\n update: \"update\",\n remove: \"remove\",\n exec: \"exec\",\n run: \"run\",\n saveFlag: \"-P\",\n saveDevFlag: \"-D\",\n silentFlag: \"--silent\",\n },\n },\n [PackageManagerName.YARN]: {\n binary: \"yarn\",\n commands: {\n install: \"install\",\n add: \"add\",\n update: \"update\",\n remove: \"remove\",\n exec: \"exec\",\n run: \"run\",\n saveFlag: \"\",\n saveDevFlag: \"-D\",\n silentFlag: \"--silent\",\n },\n },\n};\n","import fs from \"fs\";\nimport { resolve } from \"path\";\n\nimport { RunnerFactory } from \"@lib/runner\";\n\nimport { CLIError } from \"@utils/errors\";\n\nimport { PackageManager } from \"./package-manager\";\nimport { PM_CONFIGS } from \"./package-manager-configs\";\nimport { PackageManagerName } from \"./package-manager-name\";\n\nconst LOCK_FILE_MAP: Record<string, PackageManagerName> = {\n \"bun.lock\": PackageManagerName.BUN,\n \"package-lock.json\": PackageManagerName.NPM,\n \"pnpm-lock.yaml\": PackageManagerName.PNPM,\n \"yarn.lock\": PackageManagerName.YARN,\n};\n\nexport class PackageManagerFactory {\n public static create(name: PackageManagerName | string): PackageManager {\n const config = PM_CONFIGS[name as PackageManagerName];\n if (!config) {\n throw new CLIError(`Package manager '${name}' is not managed/supported.`);\n }\n\n const runner = this.createRunner(name as PackageManagerName, config.binary);\n return new PackageManager(name, config.commands, runner);\n }\n\n public static async find(directory = \".\"): Promise<PackageManager> {\n const detected = await this.detectFromLockFile(directory);\n return this.create(detected);\n }\n\n private static createRunner(name: PackageManagerName, binary: string) {\n if (name === PackageManagerName.LOCAL_BUN) {\n return RunnerFactory.createLocal(\"bun\");\n }\n return RunnerFactory.create(binary);\n }\n\n private static async detectFromLockFile(directory: string): Promise<PackageManagerName> {\n try {\n const files = await fs.promises.readdir(resolve(directory));\n for (const [lockFile, pmName] of Object.entries(LOCK_FILE_MAP)) {\n if (files.includes(lockFile)) return pmName;\n }\n } catch {\n // directory unreadable, fall through to default\n }\n return PackageManagerName.NPM;\n }\n}\n","import fs from \"fs\";\nimport { join } from \"path\";\n\nimport { FileSystemError } from \"@utils/errors\";\n\nexport const copyFiles = (from: string, to: string) => {\n if (!fs.existsSync(from)) return;\n if (!fs.existsSync(to)) throw new FileSystemError(\"directory not found\", to);\n fs.readdirSync(from, { recursive: true }).forEach((file) => {\n fs.copyFileSync(join(from, file.toString()), join(to, file.toString()));\n });\n};\n\nexport const resetFolder = (folder: string) => {\n if (fs.existsSync(folder)) fs.rmSync(folder, { recursive: true, force: true });\n fs.mkdirSync(folder, { recursive: true });\n};\n","import { red } from \"ansis\";\n\nimport { getErrorMessage } from \"@utils/errors\";\n\nexport const runSafe = async <T>(fn: () => Promise<T>, fallback?: T): Promise<T | undefined> => {\n try {\n return await fn();\n } catch (error: unknown) {\n const msg = getErrorMessage(error);\n if (msg) console.error(red(msg));\n return fallback;\n }\n};\n","import { Expose, Type } from \"class-transformer\";\nimport { IsBoolean, IsEnum, IsNotEmpty, IsPort, IsString, ValidateNested } from \"class-validator\";\n\nexport class BuildConfig {\n @Expose()\n @IsString()\n @IsNotEmpty()\n entry!: string;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n staticDir!: string;\n}\n\nexport class EditorConfig {\n @Expose()\n @IsString()\n @IsNotEmpty()\n entry!: string;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n save!: string;\n}\n\nexport class DirsConfig {\n @Expose()\n @IsString()\n @IsNotEmpty()\n components!: string;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n systems!: string;\n}\n\nexport class ClientConfig {\n @Expose()\n @IsBoolean()\n enable!: boolean;\n\n @Expose()\n @IsPort()\n port!: string;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n outDir!: string;\n\n @Expose()\n @Type(() => BuildConfig)\n @ValidateNested()\n build!: BuildConfig;\n\n @Expose()\n @Type(() => EditorConfig)\n @ValidateNested()\n editor!: EditorConfig;\n\n @Expose()\n @Type(() => DirsConfig)\n @ValidateNested()\n dirs!: DirsConfig;\n}\n\nexport class ServerConfig {\n @Expose()\n @IsBoolean()\n enable!: boolean;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n outDir!: string;\n\n @Expose()\n @Type(() => BuildConfig)\n @ValidateNested()\n build!: BuildConfig;\n\n @Expose()\n @Type(() => EditorConfig)\n @ValidateNested()\n editor!: EditorConfig;\n\n @Expose()\n @Type(() => DirsConfig)\n @ValidateNested()\n dirs!: DirsConfig;\n}\n\nexport class SslConfig {\n @Expose()\n @IsBoolean()\n enable!: boolean;\n\n @Expose()\n @IsString()\n cert!: string;\n\n @Expose()\n @IsString()\n key!: string;\n}\n\nexport class Config {\n @Expose()\n @IsString()\n @IsNotEmpty()\n name!: string;\n\n @Expose()\n @IsEnum([\"ts\", \"js\"])\n language!: \"ts\" | \"js\";\n\n @Expose()\n @IsBoolean()\n initFunctions!: boolean;\n\n @Expose()\n @Type(() => ClientConfig)\n @ValidateNested()\n client!: ClientConfig;\n\n @Expose()\n @Type(() => ServerConfig)\n @ValidateNested()\n server!: ServerConfig;\n\n @Expose()\n @Type(() => SslConfig)\n @ValidateNested()\n ssl!: SslConfig;\n}\n","export const CONFIG_FILE_NAME = \"nanoforge.config.json\";\nexport const MANIFEST_FILE_NAME = \"nanoforge.manifest.json\";\nexport const GLOBAL_CONFIG_FILE_NAME = \".nanoforgerc\";\nexport const DEFAULT_DIRECTORY = \".\";\nexport const NANOFORGE_DIR = \".nanoforge\";\nexport const REGISTRY_URL = process.env.REGISTRY_URL;\n","export const isObject = (item: any) => {\n return item && typeof item === \"object\" && !Array.isArray(item);\n};\n\nexport const deepMerge = (target: any, ...sources: [any, ...any[]]): any => {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return deepMerge(target, ...sources);\n};\n\nexport const isEmpty = (target: any) => Object.keys(target).length === 0;\n","import { type Config } from \"./config.type\";\n\nexport const CONFIG_DEFAULTS: Config = {\n name: \"nanoforge-app\",\n language: \"ts\",\n initFunctions: true,\n ssl: {\n enable: false,\n cert: \"\",\n key: \"\",\n },\n client: {\n enable: true,\n port: \"3000\",\n outDir: \".nanoforge/client\",\n build: {\n entry: \"client/main.ts\",\n staticDir: \"client/static\",\n },\n editor: {\n entry: \".nanoforge/editor/client/main.ts\",\n save: \".nanoforge/client.save.json\",\n },\n dirs: {\n components: \"client/components\",\n systems: \"client/systems\",\n },\n },\n server: {\n enable: false,\n outDir: \".nanoforge/server\",\n build: {\n entry: \"server/main.ts\",\n staticDir: \"server/static\",\n },\n editor: {\n entry: \".nanoforge/editor/server/main.ts\",\n save: \".nanoforge/server.save.json\",\n },\n dirs: {\n components: \"server/components\",\n systems: \"server/systems\",\n },\n },\n};\n","import { plainToInstance } from \"class-transformer\";\nimport { validate } from \"class-validator\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { CLIError, ConfigNotFoundError, FileSystemError } from \"@utils/errors\";\nimport { deepMerge } from \"@utils/object\";\n\nimport { CONFIG_DEFAULTS } from \"./config-defaults\";\nimport { Config } from \"./config.type\";\n\nlet config: Config | null;\n\nconst getConfigPath = (directory: string, name?: string) => {\n if (name) {\n return join(directory, name);\n } else {\n for (const n of [CONFIG_FILE_NAME]) {\n const path = join(directory, n);\n if (existsSync(path)) return path;\n }\n throw new ConfigNotFoundError(join(directory, CONFIG_FILE_NAME));\n }\n};\n\nexport const loadConfig = async (\n directory: string,\n name?: string,\n noThrow: boolean = false,\n): Promise<Config> => {\n if (config) return config;\n\n let rawData;\n\n const path = getConfigPath(directory, name);\n try {\n rawData = deepMerge(CONFIG_DEFAULTS, JSON.parse(readFileSync(path, \"utf-8\")));\n } catch {\n rawData = noThrow ? CONFIG_DEFAULTS : null;\n }\n if (!rawData) throw new FileSystemError(\"read config file\", path);\n\n const data = plainToInstance(Config, rawData, {\n excludeExtraneousValues: true,\n });\n const errors = await validate(data);\n if (errors.length > 0)\n throw new CLIError(`Invalid config:\\n${errors.toString().replace(/,/g, \"\\n\")}`);\n\n config = data;\n return config;\n};\n","import { type Config, loadConfig } from \"@lib/config\";\nimport { type Input, getConfigInput } from \"@lib/input\";\n\nexport const getConfig = (inputs: Input, dir: string, noThrow?: boolean): Promise<Config> => {\n return loadConfig(dir, getConfigInput(inputs), noThrow);\n};\n","import { type Input } from \"@lib/input\";\nimport { Prefixes } from \"@lib/ui\";\n\nimport { handleActionError } from \"@utils/errors\";\n\nexport interface HandleResult {\n success?: boolean;\n keepAlive?: boolean;\n error?: unknown;\n}\n\nexport abstract class AbstractAction {\n protected abstract startMessage: string;\n protected abstract successMessage: string;\n protected abstract failureMessage: string;\n\n public abstract handle(\n args?: Input,\n options?: Input,\n extraFlags?: string[],\n ): Promise<HandleResult>;\n\n public async run(args?: Input, options?: Input, extraFlags?: string[]): Promise<void> {\n this.logStart();\n\n try {\n const result = await this.handle(args, options, extraFlags);\n this.resolveResult(result);\n } catch (error: unknown) {\n handleActionError(this.failureMessage, error);\n }\n }\n\n private logStart(): void {\n console.info();\n console.info(`${Prefixes.INFO} ${this.startMessage}`);\n console.info();\n }\n\n private resolveResult(result: HandleResult): void {\n const success = result?.success !== false;\n const keepAlive = result?.keepAlive === true;\n\n if (keepAlive) return;\n\n console.info();\n\n if (!success) {\n handleActionError(this.failureMessage, result.error);\n process.exit(1);\n }\n\n if (this.successMessage) console.info(this.successMessage);\n process.exit(0);\n }\n}\n","import { watch } from \"chokidar\";\nimport { dirname, join } from \"node:path\";\n\nimport { type Config } from \"@lib/config\";\nimport {\n type Input,\n getDirectoryInput,\n getEditorInput,\n getStringInputWithDefault,\n getWatchInput,\n} from \"@lib/input\";\nimport { PackageManagerFactory, PackageManagerName } from \"@lib/package-manager\";\nimport { Messages } from \"@lib/ui\";\n\nimport { copyFiles, resetFolder } from \"@utils/files\";\nimport { getCwd } from \"@utils/path\";\nimport { runSafe } from \"@utils/run-safe\";\n\nimport { getConfig } from \"~/action/common/config\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\ninterface BuildTarget {\n name: string;\n entry: string;\n static: string;\n output: string;\n platform: \"browser\" | \"node\";\n}\n\nexport class BuildAction extends AbstractAction {\n protected startMessage = Messages.BUILD_START;\n protected successMessage = Messages.BUILD_SUCCESS;\n protected failureMessage = Messages.BUILD_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const config = await getConfig(options, directory);\n const isEditor = getEditorInput(options);\n const isWatch = getWatchInput(options);\n\n const targets = this.resolveTargets(config, options, isEditor);\n const results = await this.buildAll(targets, directory, isWatch);\n\n if (isWatch) {\n return this.enterWatchMode();\n }\n\n return { success: results.every(Boolean) };\n }\n\n private resolveTargets(config: Config, options: Input, isEditor: boolean): BuildTarget[] {\n const targets: BuildTarget[] = [];\n\n if (config.client.enable)\n targets.push(\n this.createTarget(\n \"Client\",\n\n \"browser\",\n getStringInputWithDefault(\n options,\n \"clientEntry\",\n !isEditor ? config.client.build.entry : config.client.editor.entry,\n ),\n getStringInputWithDefault(options, \"clientStaticDir\", config.client.build.staticDir),\n getStringInputWithDefault(options, \"clientOutDir\", config.client.outDir),\n ),\n );\n if (config.server.enable)\n targets.push(\n this.createTarget(\n \"Server\",\n \"node\",\n getStringInputWithDefault(\n options,\n \"serverEntry\",\n !isEditor ? config.server.build.entry : config.server.editor.entry,\n ),\n getStringInputWithDefault(options, \"serverStaticDir\", config.server.build.staticDir),\n getStringInputWithDefault(options, \"serverOutDir\", config.server.outDir),\n ),\n );\n\n return targets;\n }\n\n private createTarget(\n name: string,\n platform: \"browser\" | \"node\",\n entryFile: string,\n staticDir: string,\n outDir: string,\n ): BuildTarget {\n return {\n name,\n entry: entryFile,\n static: staticDir,\n output: outDir,\n platform,\n };\n }\n\n private async buildAll(\n targets: BuildTarget[],\n directory: string,\n isWatch: boolean,\n ): Promise<boolean[]> {\n const results: boolean[] = [];\n for (const target of targets) {\n const result = await this.buildTarget(target, directory, isWatch);\n results.push(result);\n }\n return results;\n }\n\n private async buildTarget(\n target: BuildTarget,\n directory: string,\n isWatch: boolean,\n ): Promise<boolean> {\n const packageManager = PackageManagerFactory.create(PackageManagerName.LOCAL_BUN);\n\n const executeBuild = (rebuild = false) =>\n runSafe(() => {\n this.resetOut(target.output, directory);\n this.copyFiles(target, directory);\n return packageManager.build(\n target.name,\n directory,\n target.entry,\n target.output,\n [\"--asset-naming\", \"[name].[ext]\", \"--target\", target.platform],\n rebuild,\n );\n }, false);\n\n if (isWatch) {\n this.watchDirectory(directory, target.entry, () => executeBuild(true));\n }\n\n const result = await executeBuild();\n return result !== false;\n }\n\n private watchDirectory(directory: string, entry: string, onChange: () => void): void {\n const watchPath = dirname(join(getCwd(directory), entry));\n watch(watchPath).on(\"change\", onChange);\n }\n\n private enterWatchMode(): HandleResult {\n console.info();\n console.info(Messages.BUILD_WATCH_START);\n console.info();\n return { keepAlive: true };\n }\n\n private resetOut(outDir: string, directory: string): void {\n resetFolder(getCwd(join(directory, outDir)));\n }\n\n private copyFiles(target: BuildTarget, directory: string): void {\n const from = getCwd(join(directory, target.static));\n const to = getCwd(join(directory, target.output));\n copyFiles(from, to);\n }\n}\n","export enum Collection {\n NANOFORGE = \"@nanoforge-dev/schematics\",\n}\n","import { type Runner } from \"@lib/runner/runner\";\n\nimport { getCwd } from \"@utils/path\";\n\nimport { type Schematic } from \"./nanoforge.collection\";\nimport { type SchematicOption } from \"./schematic.option\";\n\nexport abstract class AbstractCollection {\n protected constructor(\n protected collection: string,\n protected runner: Runner,\n protected cwd?: string,\n ) {}\n\n public async execute(\n name: string,\n options: SchematicOption[],\n flags?: string[],\n onFail?: () => void,\n ): Promise<void> {\n const command = this.buildCommandLine(name, options, flags);\n await this.runner.run(command, {\n collect: true,\n cwd: this.cwd ? getCwd(this.cwd) : undefined,\n onFail,\n });\n }\n\n public abstract getSchematics(): Schematic[];\n\n private buildCommandLine(\n name: string,\n options: SchematicOption[],\n flags: string[] = [],\n ): string[] {\n return [`${this.collection}:${name}`, ...flags, ...this.serializeOptions(options)];\n }\n\n private serializeOptions(options: SchematicOption[]): string[] {\n return options.flatMap((option) => option.toCommandString());\n }\n}\n","import { type Runner } from \"@lib/runner/runner\";\n\nimport { CLIError } from \"@utils/errors\";\n\nimport { AbstractCollection } from \"./abstract.collection\";\nimport { type SchematicOption } from \"./schematic.option\";\n\nexport interface Schematic {\n name: string;\n alias: string;\n description: string;\n}\n\nexport class NanoforgeCollection extends AbstractCollection {\n private static schematics: Schematic[] = [\n {\n name: \"application\",\n alias: \"application\",\n description: \"Generate a new application\",\n },\n {\n name: \"configuration\",\n alias: \"config\",\n description: \"Generate a CLI configuration file\",\n },\n {\n name: \"part-base\",\n alias: \"base\",\n description: \"Generate a NanoForge Part Base\",\n },\n {\n name: \"part-main\",\n alias: \"main\",\n description: \"Generate a NanoForge Part Main file\",\n },\n {\n name: \"docker\",\n alias: \"docker\",\n description: \"Generate a Dockerfile for the application\",\n },\n {\n name: \"component\",\n alias: \"component\",\n description: \"Generate a Component for an application\",\n },\n {\n name: \"system\",\n alias: \"system\",\n description: \"Generate a System for an application\",\n },\n ];\n\n constructor(runner: Runner, cwd?: string) {\n super(\"@nanoforge-dev/schematics\", runner, cwd);\n }\n\n public override async execute(\n name: string,\n options: SchematicOption[],\n flags?: string[],\n failSpinner?: () => void,\n ) {\n const schematic: string = this.validate(name);\n await super.execute(schematic, options, flags, failSpinner);\n }\n\n public getSchematics(): Schematic[] {\n return NanoforgeCollection.schematics;\n }\n\n private validate(name: string) {\n const schematic = NanoforgeCollection.schematics.find(\n (s) => s.name === name || s.alias === name,\n );\n\n if (schematic === undefined || schematic === null) {\n throw new CLIError(\n `Invalid schematic \"${name}\". Please, ensure that \"${name}\" exists in this collection.`,\n );\n }\n return schematic.name;\n }\n}\n","import { RunnerFactory } from \"@lib/runner\";\n\nimport { CLIError } from \"@utils/errors\";\n\nimport { type AbstractCollection } from \"./abstract.collection\";\nimport { Collection } from \"./collection\";\nimport { NanoforgeCollection } from \"./nanoforge.collection\";\n\nexport class CollectionFactory {\n public static create(collection: Collection | string, directory: string): AbstractCollection {\n const schematicRunner = RunnerFactory.createSchematic();\n\n if (collection === Collection.NANOFORGE) {\n return new NanoforgeCollection(schematicRunner, directory);\n }\n throw new CLIError(`Unknown collection: ${collection}`);\n }\n}\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n\nexport const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n","import { toKebabCase } from \"@utils/formatting\";\n\nexport class SchematicOption {\n constructor(\n private name: string,\n private value: boolean | string | Array<SchematicOption>,\n ) {}\n\n get normalizedName() {\n return toKebabCase(this.name);\n }\n\n public toCommandString(prefix?: string): string[] {\n const normalizedName = `${prefix ? `${prefix}.` : \"\"}${this.normalizedName}`;\n if (typeof this.value === \"string\") {\n if (this.name === \"name\") {\n return [`--${normalizedName}=${this.format()}`];\n } else if (this.name === \"version\" || this.name === \"path\") {\n return [`--${normalizedName}=${this.value}`];\n } else {\n return [`--${normalizedName}=\"${this.value}\"`];\n }\n } else if (typeof this.value === \"boolean\") {\n const str = normalizedName;\n return this.value ? [`--${str}=true`] : [`--${str}=false`];\n } else if (Array.isArray(this.value)) {\n return this.value.reduce(\n (old: string[], option: SchematicOption) => [\n ...old,\n ...option.toCommandString(normalizedName),\n ],\n [],\n );\n } else {\n return [`--${normalizedName}=${this.value}`];\n }\n }\n\n private format() {\n return toKebabCase(this.value as string)\n .split(\"\")\n .reduce((content, char) => {\n if (char === \"(\" || char === \")\" || char === \"[\" || char === \"]\") {\n return `${content}\\\\${char}`;\n }\n return `${content}${char}`;\n }, \"\");\n }\n}\n","import { watch } from \"chokidar\";\n\nimport { type AbstractCollection, SchematicOption } from \"@lib/schematics\";\nimport { Messages } from \"@lib/ui\";\nimport { getSpinner } from \"@lib/ui/spinner\";\n\nexport const executeSchematic = async (\n name: string,\n collection: AbstractCollection,\n schematicName: string,\n options: object,\n fileToWatch?: string,\n): Promise<void> => {\n const execute = async (isRebuild = false) => {\n const message = isRebuild\n ? Messages.SCHEMATIC_WATCH_IN_PROGRESS(name)\n : Messages.SCHEMATIC_IN_PROGRESS(name);\n const spinner = getSpinner(message);\n spinner.start();\n\n await collection.execute(schematicName, mapSchematicOptions(options), undefined, () =>\n spinner.fail(Messages.SCHEMATIC_FAILED(name)),\n );\n\n spinner.succeed(Messages.SCHEMATIC_SUCCESS(name));\n };\n\n if (fileToWatch) {\n watch(fileToWatch).on(\"change\", () => execute(true));\n }\n\n await execute();\n};\n\nexport const mapSchematicOptions = (inputs: object): SchematicOption[] => {\n return Object.entries(inputs).reduce((acc: SchematicOption[], [key, value]) => {\n if (value === undefined) return acc;\n\n const mapped =\n typeof value === \"object\"\n ? new SchematicOption(key, mapSchematicOptions(value))\n : new SchematicOption(key, value);\n\n acc.push(mapped);\n return acc;\n }, []);\n};\n","import {\n type Input,\n getCreateNameInputOrAsk,\n getCreateTypeInput,\n getDirectoryInput,\n getPathInputWithDefault,\n getServerInput,\n} from \"@lib/input\";\nimport { Collection, CollectionFactory } from \"@lib/schematics\";\nimport { Messages } from \"@lib/ui\";\n\nimport { capitalize } from \"@utils/formatting\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\nimport { getConfig } from \"../common/config\";\nimport { executeSchematic } from \"../common/schematics\";\n\ninterface CreateValues {\n name: string;\n directory: string;\n part: \"client\" | \"server\";\n language: \"ts\" | \"js\";\n}\n\nexport class CreateAction extends AbstractAction {\n protected startMessage = Messages.CREATE_START;\n protected successMessage = Messages.CREATE_SUCCESS;\n protected failureMessage = Messages.CREATE_FAILED;\n\n public async handle(args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const config = await getConfig(options, directory, true);\n\n const type = getCreateTypeInput(args);\n\n const name = await getCreateNameInputOrAsk(options);\n const isServer = getServerInput(options);\n const path = getPathInputWithDefault(\n options,\n config[isServer ? \"server\" : \"client\"].dirs[type === \"component\" ? \"components\" : \"systems\"],\n );\n\n await this.generateElement(directory, type, {\n name,\n directory: path,\n part: isServer ? \"server\" : \"client\",\n language: config.language,\n });\n\n return {};\n }\n\n private async generateElement(\n directory: string,\n type: \"component\" | \"system\",\n values: CreateValues,\n ): Promise<void> {\n const collection = CollectionFactory.create(Collection.NANOFORGE, directory);\n await executeSchematic(capitalize(type), collection, type, values);\n }\n}\n","import { type Input, getDevGenerateInput, getDirectoryInput, getEditorInput } from \"@lib/input\";\nimport { PackageManagerFactory } from \"@lib/package-manager\";\nimport { Messages } from \"@lib/ui\";\n\nimport { runSafe } from \"@utils/run-safe\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class DevAction extends AbstractAction {\n protected startMessage = Messages.DEV_START;\n protected successMessage = Messages.DEV_SUCCESS;\n protected failureMessage = Messages.DEV_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const generate = getDevGenerateInput(options);\n\n const editor = getEditorInput(options);\n const tasks = this.buildTaskList(directory, generate, editor);\n await Promise.all(tasks);\n\n return { keepAlive: true };\n }\n\n private buildTaskList(directory: string, generate: boolean, editor: boolean): Promise<void>[] {\n const tasks: Promise<void>[] = [];\n const extraFlags = editor ? [\"--editor\"] : [];\n\n if (generate) {\n tasks.push(this.runSubCommand(\"generate\", directory, { silent: true, extraFlags }));\n }\n\n tasks.push(this.runSubCommand(\"build\", directory, { silent: true, extraFlags }));\n tasks.push(this.runSubCommand(\"start\", directory, { silent: false }));\n\n return tasks;\n }\n\n private async runSubCommand(\n command: string,\n directory: string,\n options: { silent: boolean; extraFlags?: string[] },\n ): Promise<void> {\n await runSafe(async () => {\n const packageManager = await PackageManagerFactory.find(directory);\n const args = [command, \"--watch\", ...(options.extraFlags ?? [])];\n await packageManager.runDev(directory, \"nf\", {}, args, options.silent);\n });\n }\n}\n","import open from \"open\";\nimport { join } from \"path\";\n\nimport { type Input, getDirectoryInput, getEditorOpenInput, getPathInput } from \"@lib/input\";\nimport { PackageManagerFactory, PackageManagerName } from \"@lib/package-manager\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getModulePath } from \"@utils/path\";\nimport { runSafe } from \"@utils/run-safe\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class EditorAction extends AbstractAction {\n protected startMessage = Messages.EDITOR_START;\n protected successMessage = Messages.EDITOR_SUCCESS;\n protected failureMessage = Messages.EDITOR_FAILED;\n\n public async handle(args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const path = getPathInput(args);\n const shouldOpen = getEditorOpenInput(options, !!path);\n const query = path ? `?projectPath=${encodeURIComponent(path)}` : \"\";\n const url = `http://localhost:3000/load-project${query}`;\n\n console.log(`\\nš Editor running! Open it in your browser: \\x1b[36m${url}\\x1b[0m\\n`);\n\n void this.startEditor(directory);\n if (shouldOpen) await this.openBrowser(url);\n\n return { keepAlive: true };\n }\n\n private async startEditor(directory: string): Promise<void> {\n const editorPath = join(\n getModulePath(\"@nanoforge-dev/editor/package.json\", true),\n \"dist\",\n \"index.js\",\n );\n\n await runSafe(async () => {\n const packageManager = PackageManagerFactory.create(PackageManagerName.LOCAL_BUN);\n await packageManager.run(\"Editor\", directory, editorPath, [], {}, [], true);\n });\n }\n\n private async openBrowser(url: string): Promise<void> {\n await open(url);\n }\n}\n","import { join } from \"node:path\";\n\nimport { type Config } from \"@lib/config\";\nimport { type Input, getDirectoryInput, getEditorInput, getWatchInput } from \"@lib/input\";\nimport { Collection, CollectionFactory } from \"@lib/schematics\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getCwd } from \"@utils/path\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\nimport { getConfig } from \"../common/config\";\nimport { executeSchematic } from \"../common/schematics\";\n\ninterface GenerateValues {\n directory: string;\n language: string;\n initFunctions: boolean;\n}\n\nexport class GenerateAction extends AbstractAction {\n protected startMessage = Messages.GENERATE_START;\n protected successMessage = Messages.GENERATE_SUCCESS;\n protected failureMessage = Messages.GENERATE_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const config = await getConfig(options, directory);\n const isEditor = getEditorInput(options);\n const isWatch = getWatchInput(options);\n\n await this.generateParts(config, directory, isEditor, isWatch);\n\n if (isWatch) {\n return this.enterWatchMode();\n }\n\n return {};\n }\n\n private extractValues(config: Config): GenerateValues {\n return {\n directory: \".\",\n language: config.language,\n initFunctions: config.initFunctions,\n };\n }\n\n private async generateParts(\n config: Config,\n directory: string,\n isEditor: boolean,\n watch: boolean,\n ): Promise<void> {\n const collection = CollectionFactory.create(Collection.NANOFORGE, directory);\n const values = this.extractValues(config);\n\n if (config.client.enable)\n await executeSchematic(\n \"Client main file\",\n collection,\n \"part-main\",\n {\n ...values,\n part: \"client\",\n outFile: !isEditor ? config.client.build.entry : config.client.editor.entry,\n saveFile: config.client.editor.save,\n editor: isEditor,\n },\n watch ? this.watchPath(directory, values.directory, config.client.editor.save) : undefined,\n );\n\n if (config.server.enable)\n await executeSchematic(\n \"Server main file\",\n collection,\n \"part-main\",\n {\n ...values,\n part: \"server\",\n outFile: !isEditor ? config.server.build.entry : config.server.editor.entry,\n saveFile: config.server.editor.save,\n editor: isEditor,\n },\n this.watchPath(directory, values.directory, config.server.editor.save),\n );\n }\n\n private watchPath(directory: string, subDir: string, saveFile: string): string {\n return join(getCwd(directory), subDir, saveFile);\n }\n\n private enterWatchMode(): HandleResult {\n console.info();\n console.info(Messages.GENERATE_WATCH_START);\n console.info();\n return { keepAlive: true };\n }\n}\n","import { type GlobalConfig } from \"./global-config.type\";\n\nexport const GLOBAL_CONFIG_DEFAULTS: GlobalConfig = {};\n","import { read, readUserConfig, write, writeUserConfig } from \"rc9\";\n\nimport { GLOBAL_CONFIG_FILE_NAME } from \"@lib/constants\";\nimport { type DeepPartial } from \"@lib/types\";\n\nimport { deepMerge, isEmpty } from \"@utils/object\";\n\nimport { GLOBAL_CONFIG_DEFAULTS } from \"./global-config-defaults\";\nimport { type GlobalConfig } from \"./global-config.type\";\n\ntype CReader = (options: { name: string; dir?: string }) => GlobalConfig;\n\nexport class GlobalConfigHandler {\n static read(dir?: string): GlobalConfig {\n const dirConfig = this._readConfig(read, false, dir);\n if (dirConfig) return dirConfig;\n const cwdConfig = this._readConfig(read, false, process.cwd());\n if (cwdConfig) return cwdConfig;\n return this._readConfig(readUserConfig, true);\n }\n\n static write(config: DeepPartial<GlobalConfig>, local: boolean = false, dir?: string): void {\n const options = {\n name: GLOBAL_CONFIG_FILE_NAME,\n dir,\n };\n if (local) write(config, options);\n else writeUserConfig(config, options);\n }\n\n private static _readConfig(func: CReader, force: true): GlobalConfig;\n private static _readConfig(func: CReader, force?: false, dir?: string): GlobalConfig | null;\n private static _readConfig(func: CReader, force?: boolean, dir?: string): GlobalConfig | null {\n const res = func({\n name: GLOBAL_CONFIG_FILE_NAME,\n dir,\n });\n if (!force) {\n if (isEmpty(res)) return null;\n }\n return deepMerge(GLOBAL_CONFIG_DEFAULTS, res);\n }\n}\n","export type RequestOptions = Omit<RequestInit, \"body\" | \"method\">;\n\nexport interface MiddlewareParams {\n path: string;\n fullPath: string;\n options: RequestOptions;\n}\n\nexport type FullResponse = Response & { content: any };\n\nexport type MiddlewareNext = (params?: MiddlewareParams) => Promise<FullResponse>;\n\nexport type Middleware = (\n params: MiddlewareParams,\n next: MiddlewareNext,\n) => Promise<FullResponse | undefined> | undefined;\n\ntype BaseRequest = (path: string, options: RequestOptions) => Promise<FullResponse>;\n\nexport class HttpClient {\n private readonly _baseUrl: string;\n private readonly _baseOptions: RequestOptions;\n private readonly _middlewares: Middleware[];\n\n constructor(baseUrl: string, options?: RequestOptions) {\n this._baseUrl = baseUrl;\n this._baseOptions = options ?? {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n };\n this._middlewares = [];\n }\n\n get(path: string, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"GET\",\n });\n });\n }\n\n post(path: string, body?: string | FormData, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"POST\",\n body: body,\n });\n });\n }\n\n put(path: string, body?: string | FormData, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"PUT\",\n body: body,\n });\n });\n }\n\n patch(path: string, body?: string | FormData, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, async (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"PATCH\",\n body: body,\n });\n });\n }\n\n delete(path: string, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"DELETE\",\n body: \"{}\",\n }) as Promise<FullResponse>;\n });\n }\n\n useMiddlewares(...middlewares: Middleware[]): HttpClient {\n for (const middleware of middlewares) this._middlewares.push(middleware);\n return this;\n }\n\n private async _request(path: string, request: RequestInit): Promise<FullResponse> {\n const res = (await fetch(path, request)) as FullResponse;\n res.content = null;\n return res;\n }\n\n private _applyMiddlewares(\n path: string,\n options: RequestOptions | undefined,\n callback: BaseRequest,\n ): Promise<FullResponse> {\n const baseParams = {\n path,\n fullPath: this._getUrl(path),\n options: {\n ...this._baseOptions,\n ...options,\n headers: {\n ...this._baseOptions.headers,\n ...options?.headers,\n },\n },\n };\n const middlewares = this._middlewares.slice();\n let response: FullResponse;\n\n const execution = async (params?: MiddlewareParams): Promise<FullResponse> => {\n if (!params) params = baseParams;\n\n const middleware = middlewares.shift();\n\n if (!middleware) response = (await callback(params.fullPath, params.options)) as FullResponse;\n else response = (await middleware(params, execution)) ?? response;\n\n return response;\n };\n\n return execution(baseParams);\n }\n\n private _getUrl(path: string): string {\n return `${this._baseUrl}${path}`;\n }\n}\n","import { ApiRequestError } from \"@utils/errors\";\n\nimport type { HttpClient, RequestOptions } from \"./http-client\";\n\nexport class Repository {\n private readonly _client: HttpClient;\n\n constructor(client: HttpClient) {\n this._client = client;\n }\n\n get<R extends object = object>(path: string, options?: RequestOptions): Promise<R> {\n return this.runRequest(\"get\", path, options);\n }\n\n getFile(path: string, options?: RequestOptions): Promise<Blob> {\n return this.runFileRequest(\"get\", path, options);\n }\n\n post<R extends object = object, I extends object = object>(\n path: string,\n body?: I | FormData,\n options?: RequestOptions,\n ): Promise<R> {\n return this.runRequestBody(\"post\", path, body ?? {}, options);\n }\n\n put<R extends object = object, I extends object = object>(\n path: string,\n body?: I | FormData,\n options?: RequestOptions,\n ): Promise<R> {\n return this.runRequestBody(\"put\", path, body ?? {}, options);\n }\n\n patch<R extends object = object, I extends object = object>(\n path: string,\n body?: I | FormData,\n options?: RequestOptions,\n ): Promise<R> {\n return this.runRequestBody(\"patch\", path, body ?? {}, options);\n }\n\n delete<R extends object = object>(path: string, options?: RequestOptions): Promise<R> {\n return this.runRequest(\"delete\", path, options);\n }\n\n private async runRequest<R>(\n request: \"get\" | \"delete\",\n path: string,\n options?: RequestOptions,\n ): Promise<R> {\n const res = await this._client[request](path, options);\n const data = (await res.json()) as R;\n if (!res.ok) throw new ApiRequestError(res.status, data[\"error\" as keyof R]);\n return data;\n }\n\n private async runFileRequest(\n request: \"get\",\n path: string,\n options?: RequestOptions,\n ): Promise<Blob> {\n const res = await this._client[request](path, options);\n if (!res.ok)\n throw new ApiRequestError(res.status, ((await res.json()) as { error: any })[\"error\"]);\n return await res.blob();\n }\n\n private async runRequestBody<R, I>(\n request: \"post\" | \"put\" | \"patch\",\n path: string,\n body?: I | FormData,\n options?: RequestOptions,\n ): Promise<R> {\n const res = await this._client[request](\n path,\n body === undefined ? undefined : body instanceof FormData ? body : JSON.stringify(body),\n options,\n );\n const data = (await res.json()) as R;\n if (!res.ok) throw new ApiRequestError(res.status, data[\"error\" as keyof R]);\n return data;\n }\n}\n","import { REGISTRY_URL } from \"@lib/constants\";\n\nimport { RegistryAuthenticationError } from \"@utils/errors\";\n\nimport { HttpClient } from \"./http-client\";\nimport { Repository } from \"./repository\";\n\nconst client = new HttpClient(REGISTRY_URL ?? \"\");\n\nexport const api = new Repository(client);\n\nexport const withAuth = (\n apiKey?: string,\n force: boolean = false,\n headers: object = {\n \"Content-Type\": \"application/json\",\n },\n) => {\n if (!apiKey && force) {\n throw new RegistryAuthenticationError();\n }\n return new Repository(\n new HttpClient(REGISTRY_URL ?? \"\", {\n headers: {\n Authorization: apiKey,\n ...headers,\n },\n }),\n );\n};\n","import { GlobalConfigHandler } from \"@lib/global-config\";\nimport { type Repository, withAuth } from \"@lib/http\";\nimport { type FullManifest, type Manifest } from \"@lib/manifest/manifest.type\";\n\ninterface ManifestDeps {\n nf: Record<string, FullManifest>;\n npm: [string, string][];\n}\n\nexport const resolveManifestDependencies = async (\n names: string[],\n dir?: string,\n): Promise<ManifestDeps> => {\n const client = withAuth(GlobalConfigHandler.read(dir).apiKey, false);\n return concatDeps(await Promise.all(names.map(async (d) => resolveDeps(d, client))));\n};\n\nconst resolveManifest = async (name: string, client: Repository): Promise<FullManifest | never> => {\n return await client.get(`/registry/${name}`);\n};\n\nconst resolveDeps = async (name: string, client: Repository): Promise<ManifestDeps> => {\n const manifest = await resolveManifest(name, client);\n const baseDeps = manifest.dependencies ?? [];\n const deps = await Promise.all(baseDeps.map(async (d) => resolveDeps(d, client)));\n return concatDeps(\n [{ nf: { [manifest.name]: manifest }, npm: getNpmDeps(manifest) }].concat(deps),\n );\n};\n\nconst getNpmDeps = (manifest: Manifest): [string, string][] => {\n return Object.entries({ ...manifest.npmDependencies, ...manifest.libDependencies });\n};\n\nconst concatDeps = (deps: ManifestDeps[]): ManifestDeps => {\n return {\n npm: deps.map(({ npm }) => npm).flat(),\n nf: Object.fromEntries(deps.map(({ nf }) => Object.entries(nf)).flat()),\n };\n};\n","import fs from \"fs\";\nimport { join } from \"path\";\n\nimport { GlobalConfigHandler } from \"@lib/global-config\";\nimport { type Repository, withAuth } from \"@lib/http\";\nimport { type FullManifest, type Manifest } from \"@lib/manifest\";\n\nimport { CLIError } from \"@utils/errors\";\nimport { getCwd } from \"@utils/path\";\n\nexport class Registry {\n static async publish(manifest: Manifest, dir?: string): Promise<void> {\n const client = this._getClient(dir, true, false);\n const filename = manifest.publish?.paths?.package ?? \"index.ts\";\n const file = await this._getPackageFile(filename, dir);\n\n const data = new FormData();\n for (const key of Object.keys(manifest)) {\n const value = manifest[key as keyof Manifest];\n if (!value) continue;\n data.append(key, typeof value === \"string\" ? value : JSON.stringify(value));\n }\n data.append(\"_packageFile\", file, filename);\n await client.put(`/registry/${manifest.name}`, data);\n }\n\n static async unpublish(manifest: Manifest, dir?: string): Promise<void> {\n const client = this._getClient(dir, true);\n\n await client.delete(`/registry/${manifest.name}`);\n }\n\n static async install(manifests: FullManifest[], dir: string): Promise<void> {\n const cwd = getCwd(dir);\n const client = this._getClient(dir, false);\n for (const manifest of manifests) {\n await this.installPackage(client, manifest, cwd);\n }\n }\n\n private static async installPackage(\n client: Repository,\n manifest: FullManifest,\n dir: string,\n ): Promise<void> {\n const file = await client.getFile(`/registry/${manifest.name}/-/${manifest._file}`);\n const path = join(dir, this.getTypeSubFolder(manifest.type));\n fs.mkdirSync(path, { recursive: true });\n fs.writeFileSync(join(path, manifest._file), await file.bytes());\n }\n\n private static getTypeSubFolder(type: string): string {\n if (type === \"component\") return \"components\";\n if (type === \"system\") return \"systems\";\n return \".\";\n }\n\n private static _getClient(dir?: string, force?: boolean, headers: boolean = true): Repository {\n const config = GlobalConfigHandler.read(dir);\n return withAuth(config.apiKey, force, !headers ? {} : undefined);\n }\n\n private static _getPackageFile(filename: string, dir?: string): Promise<Blob> {\n const path = join(getCwd(dir ?? \".\"), filename);\n if (!fs.existsSync(path))\n throw new CLIError(\n \"Package not found, please specify path in the nanoforge.manifest.json : `publish.paths.package`!\",\n );\n try {\n fs.accessSync(path, fs.constants.R_OK);\n return fs.openAsBlob(path);\n } catch {\n throw new CLIError(\"Cannot read package file, please verify your file permissions!\");\n }\n }\n}\n","import { join } from \"path\";\n\nimport {\n type Input,\n getDirectoryInput,\n getInstallLibInput,\n getInstallNamesInputOrAsk,\n getServerInput,\n} from \"@lib/input\";\nimport { resolveManifestDependencies } from \"@lib/manifest/manifest-resolver\";\nimport { PackageManagerFactory } from \"@lib/package-manager\";\nimport { Registry } from \"@lib/registry\";\nimport { Messages } from \"@lib/ui\";\n\nimport { withSpinner } from \"@utils/spinner\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class InstallAction extends AbstractAction {\n protected startMessage = Messages.INSTALL_START;\n protected successMessage = Messages.INSTALL_SUCCESS;\n protected failureMessage = Messages.INSTALL_FAILED;\n\n public async handle(args: Input, options: Input): Promise<HandleResult> {\n const names = await getInstallNamesInputOrAsk(args);\n const directory = getDirectoryInput(options);\n const isLib = getInstallLibInput(options);\n const isServer = getServerInput(options);\n\n return isLib\n ? this._installLibs(directory, names)\n : this._installNfPackages(directory, names, isServer);\n }\n\n private async _installLibs(directory: string, names: string[]): Promise<HandleResult> {\n const packageManager = await PackageManagerFactory.find(directory);\n return { success: await packageManager.addDevelopment(directory, names) };\n }\n\n private async _installNfPackages(\n directory: string,\n names: string[],\n isServer?: boolean,\n ): Promise<HandleResult> {\n const deps = await resolveManifestDependencies(names, directory);\n const part = isServer ? \"server\" : \"client\";\n\n const libSuccess = await this._installLibs(\n directory,\n deps.npm.map(([name, version]) => `${name}@${version}`),\n );\n\n if (!libSuccess) return { success: false };\n\n return withSpinner(\n () => Registry.install(Object.values(deps.nf), join(directory, part)),\n Messages.INSTALL_PACKAGES_IN_PROGRESS,\n );\n }\n}\n","import { GlobalConfigHandler } from \"@lib/global-config\";\nimport { withAuth } from \"@lib/http\";\nimport { type Input, getDirectoryInput, getLocalInput, getLoginApiKeyInputOrAsk } from \"@lib/input\";\nimport { Messages } from \"@lib/ui\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class LoginAction extends AbstractAction {\n protected startMessage = Messages.LOGIN_START;\n protected successMessage = Messages.LOGIN_SUCCESS;\n protected failureMessage = Messages.LOGIN_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const isLocal = getLocalInput(options);\n const apiKey = await getLoginApiKeyInputOrAsk(options);\n\n await withAuth(apiKey, true).post(\"/registry-key/verify\");\n\n GlobalConfigHandler.write(\n {\n apiKey,\n },\n isLocal,\n directory,\n );\n\n return { success: true };\n }\n}\n","import { GlobalConfigHandler } from \"@lib/global-config\";\nimport { type Input, getDirectoryInput, getLocalInput } from \"@lib/input\";\nimport { Messages } from \"@lib/ui\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class LogoutAction extends AbstractAction {\n protected startMessage = Messages.LOGOUT_START;\n protected successMessage = Messages.LOGOUT_SUCCESS;\n protected failureMessage = Messages.LOGOUT_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const isLocal = getLocalInput(options);\n\n GlobalConfigHandler.write(\n {\n apiKey: undefined,\n },\n isLocal,\n directory,\n );\n\n return { success: true };\n }\n}\n","import { type RunOptions, Runner } from \"@lib/runner/runner\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getCwd } from \"@utils/path\";\nimport { withSpinner } from \"@utils/spinner\";\n\nconst GIT = \"git\";\nconst GIT_COMMANDS = {\n init: \"init\",\n remote: \"remote\",\n};\n\nexport class GitRunner {\n private readonly runner: Runner;\n\n constructor() {\n this.runner = new Runner(GIT);\n }\n\n public async init(directory: string): Promise<boolean> {\n const args = [GIT_COMMANDS.init];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n Messages.GIT_INIT_IN_PROGRESS,\n Messages.GIT_INIT_SUCCEED,\n Messages.GIT_INIT_FAILED(this.formatFailCommand(args)),\n );\n\n return result.success;\n }\n\n public async addRemote(directory: string, remote: string): Promise<boolean> {\n const args = [GIT_COMMANDS.remote, \"add\", \"origin\", remote];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n Messages.GIT_REMOTE_IN_PROGRESS,\n Messages.GIT_REMOTE_SUCCEED,\n Messages.GIT_REMOTE_FAILED(this.formatFailCommand(args)),\n );\n\n return result.success;\n }\n\n private exec(\n args: string[],\n directory: string,\n options: {\n collect?: boolean;\n env?: Record<string, string>;\n listeners?: RunOptions[\"listeners\"];\n onFail?: () => void;\n } = {},\n ): Promise<string | null> {\n return this.runner.run(args, {\n collect: options.collect ?? true,\n cwd: getCwd(directory),\n env: options.env,\n listeners: options.listeners,\n onFail: options.onFail,\n });\n }\n\n private formatFailCommand(args: string[]): string {\n return this.runner.fullCommand(args);\n }\n}\n","import { askInput } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getStringInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getGitRemoteInput = (inputs: Input) => {\n return getStringInput(inputs, \"gitRemote\");\n};\n\nexport const getNewGitRemoteInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getGitRemoteInput(inputs), () =>\n askInput(Messages.NEW_GIT_REMOTE_QUESTION, {\n required: false,\n default: \"\",\n }),\n );\n};\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewGitInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"git\");\n};\n\nexport const getNewGitOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewGitInput(inputs), () =>\n askConfirm(Messages.NEW_GIT_QUESTION, { default: true }),\n );\n};\n","import { join } from \"node:path\";\n\nimport { GitRunner } from \"@lib/git/git-runner\";\nimport {\n type Input,\n getDirectoryInput,\n getEditorInput,\n getNewDockerOrAsk,\n getNewInitFunctionsWithDefault,\n getNewLanguageInputOrAsk,\n getNewLintInput,\n getNewNameInputOrAsk,\n getNewPackageManagerInputOrAsk,\n getNewServerOrAsk,\n getNewSkipInstallOrAsk,\n getNewStrictOrAsk,\n getPathInput,\n} from \"@lib/input\";\nimport { getNewGitRemoteInputOrAsk } from \"@lib/input/inputs/new/git-remote.input\";\nimport { getNewGitOrAsk } from \"@lib/input/inputs/new/git.input\";\nimport { PackageManagerFactory } from \"@lib/package-manager\";\nimport { Collection, CollectionFactory } from \"@lib/schematics\";\nimport { Messages } from \"@lib/ui\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\nimport { executeSchematic } from \"../common/schematics\";\n\ninterface NewValues {\n name: string;\n directory: string;\n packageManager: string;\n language: string;\n strict: boolean;\n server: boolean;\n initFunctions: boolean;\n skipInstall: boolean;\n docker: boolean;\n lint: boolean;\n editor: boolean;\n git: boolean;\n gitRemote: string | null;\n}\n\nexport class NewAction extends AbstractAction {\n protected startMessage = Messages.NEW_START;\n protected successMessage = Messages.NEW_SUCCESS;\n protected failureMessage = Messages.NEW_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const cwdDirectory = getDirectoryInput(options);\n const values = await this.collectValues(options);\n\n await this.scaffold(values, cwdDirectory);\n\n let res = true;\n\n const distDir = join(cwdDirectory, values.directory);\n\n if (!values.skipInstall) {\n res = await this.installDependencies(values.packageManager, distDir);\n }\n\n if (values.git) await this.setupGitRepository(values.gitRemote, distDir);\n\n return { success: res };\n }\n\n private async collectValues(inputs: Input): Promise<NewValues> {\n const values: Omit<NewValues, \"directory\" | \"gitRemote\"> = {\n name: await getNewNameInputOrAsk(inputs),\n packageManager: await getNewPackageManagerInputOrAsk(inputs),\n language: await getNewLanguageInputOrAsk(inputs),\n strict: await getNewStrictOrAsk(inputs),\n server: await getNewServerOrAsk(inputs),\n initFunctions: getNewInitFunctionsWithDefault(inputs),\n skipInstall: await getNewSkipInstallOrAsk(inputs),\n docker: await getNewDockerOrAsk(inputs),\n lint: getNewLintInput(inputs),\n editor: getEditorInput(inputs),\n git: await getNewGitOrAsk(inputs),\n };\n\n return {\n ...values,\n directory: getPathInput(inputs) ?? values.name,\n gitRemote: values.git ? (await getNewGitRemoteInputOrAsk(inputs)) || null : null,\n };\n }\n\n private async scaffold(values: NewValues, directory: string): Promise<void> {\n const collection = CollectionFactory.create(Collection.NANOFORGE, directory);\n\n console.info();\n console.info(Messages.NEW_GENERATION_START);\n console.info();\n\n await this.generateApplication(collection, values);\n await this.generateConfiguration(collection, values);\n await this.generateClientParts(collection, values);\n if (values.docker) await this.generateDocker(collection, values);\n\n if (values.server) {\n await this.generateServerParts(collection, values);\n }\n }\n\n private generateApplication(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n return executeSchematic(\"Application\", collection, \"application\", {\n name: values.name,\n directory: values.directory,\n packageManager: values.packageManager,\n language: values.language,\n strict: values.strict,\n server: values.server,\n lint: values.lint,\n editor: values.editor,\n });\n }\n\n private generateConfiguration(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n return executeSchematic(\"Configuration\", collection, \"configuration\", {\n name: values.name,\n directory: values.directory,\n server: values.server,\n language: values.language,\n initFunctions: values.initFunctions,\n });\n }\n\n private async generateClientParts(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n const partOptions = this.partOptions(values, \"client\");\n\n await executeSchematic(\"Client base\", collection, \"part-base\", {\n ...partOptions,\n server: values.server,\n });\n await executeSchematic(\"Client main file\", collection, \"part-main\", {\n ...partOptions,\n });\n }\n\n private async generateServerParts(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n const partOptions = this.partOptions(values, \"server\");\n\n await executeSchematic(\"Server base\", collection, \"part-base\", {\n ...partOptions,\n server: values.server,\n });\n await executeSchematic(\"Server main file\", collection, \"part-main\", {\n ...partOptions,\n });\n }\n\n private async generateDocker(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n await executeSchematic(\"Docker\", collection, \"docker\", {\n directory: values.directory,\n packageManager: values.packageManager,\n });\n }\n\n private partOptions(values: NewValues, part: \"client\" | \"server\") {\n return {\n part,\n directory: values.directory,\n language: values.language,\n initFunctions: values.initFunctions,\n };\n }\n\n private async installDependencies(\n packageManagerName: string,\n directory: string,\n ): Promise<boolean> {\n const packageManager = PackageManagerFactory.create(packageManagerName);\n return await packageManager.install(directory);\n }\n\n private async setupGitRepository(gitRemote: string | null, dir: string): Promise<boolean> {\n const runner = new GitRunner();\n let res;\n\n res = await runner.init(dir);\n if (res && gitRemote) res = await runner.addRemote(dir, gitRemote);\n return res;\n }\n}\n","import { Expose, Type } from \"class-transformer\";\nimport {\n IsEnum,\n IsNotEmpty,\n IsObject,\n IsOptional,\n IsString,\n Matches,\n ValidateNested,\n} from \"class-validator\";\n\nexport enum ManifestPackageTypeEnum {\n COMPONENT = \"component\",\n SYSTEM = \"system\",\n}\n\nclass PathsPublishManifest {\n @Expose()\n @IsString()\n @IsNotEmpty()\n @IsOptional()\n package?: string;\n}\n\nclass PublishManifest {\n @Expose()\n @IsOptional()\n @ValidateNested()\n @Type(() => PathsPublishManifest)\n paths?: PathsPublishManifest;\n}\n\nexport class Manifest {\n @Expose()\n @IsString()\n @Matches(/^[A-Za-z0-9-]+\\/[A-Za-z0-9-]+$/)\n @IsNotEmpty()\n name!: string;\n\n @Expose()\n @IsString()\n @IsEnum(ManifestPackageTypeEnum)\n @IsNotEmpty()\n type!: ManifestPackageTypeEnum;\n\n @Expose()\n @IsString()\n @IsOptional()\n description?: string;\n\n @Expose()\n @IsString({ each: true })\n @IsOptional()\n tags?: string[];\n\n @Expose()\n @IsString({ each: true })\n @IsNotEmpty({ each: true })\n @IsOptional()\n dependencies?: string[];\n\n @Expose()\n @IsOptional()\n @ValidateNested()\n @Type(() => PublishManifest)\n publish?: PublishManifest;\n\n @Expose()\n @IsObject()\n @IsOptional()\n libDependencies?: Record<string, string>;\n\n @Expose()\n @IsObject()\n @IsOptional()\n npmDependencies?: Record<string, string>;\n}\n\nexport interface FullManifest {\n name: string;\n type: ManifestPackageTypeEnum;\n description?: string;\n dependencies?: string[];\n libDependencies?: Record<string, string>;\n npmDependencies?: Record<string, string>;\n publish?: {\n paths?: {\n package?: string;\n };\n };\n _file: string;\n}\n","import { plainToInstance } from \"class-transformer\";\nimport { validate } from \"class-validator\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { MANIFEST_FILE_NAME } from \"@lib/constants\";\n\nimport { ManifestError } from \"@utils/errors\";\nimport { deepMerge } from \"@utils/object\";\n\nimport { Manifest } from \"./manifest.type\";\n\nconst getManifestPath = (directory: string) => {\n for (const n of [MANIFEST_FILE_NAME]) {\n const path = join(directory, n);\n if (existsSync(path)) return path;\n }\n throw new ManifestError(`No manifest file found in directory: ${directory}`);\n};\n\nexport const loadManifest = async (directory: string): Promise<Manifest> => {\n let rawData;\n\n const path = getManifestPath(directory);\n try {\n rawData = deepMerge({}, JSON.parse(readFileSync(path, \"utf-8\")));\n } catch {\n rawData = null;\n }\n if (!rawData) {\n throw new ManifestError(`Unable to read or parse file at ${path}`);\n }\n\n const data = plainToInstance(Manifest, rawData, {\n excludeExtraneousValues: true,\n });\n\n const errors = await validate(data);\n if (errors.length > 0) {\n throw new ManifestError(`Validation failed\\n${errors.toString()}`);\n }\n return data;\n};\n","import { type Input, getDirectoryInput } from \"@lib/input\";\nimport { loadManifest } from \"@lib/manifest\";\nimport { Registry } from \"@lib/registry\";\nimport { Messages } from \"@lib/ui\";\n\nimport { withSpinner } from \"@utils/spinner\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class PublishAction extends AbstractAction {\n protected startMessage = Messages.PUBLISH_START;\n protected successMessage = Messages.PUBLISH_SUCCESS;\n protected failureMessage = Messages.PUBLISH_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n\n const manifest = await loadManifest(directory);\n\n return withSpinner(\n () => Registry.publish(manifest, directory),\n Messages.PUBLISH_IN_PROGRESS(manifest.name),\n );\n }\n}\n","import dotenv from \"dotenv\";\nimport { join, resolve } from \"path\";\n\nimport { type Config } from \"@lib/config\";\nimport {\n type Input,\n getDirectoryInput,\n getStringInput,\n getStringInputWithDefault,\n getWatchInput,\n} from \"@lib/input\";\nimport { PackageManagerFactory } from \"@lib/package-manager\";\nimport { Messages } from \"@lib/ui\";\n\nimport { CLIError } from \"@utils/errors\";\nimport { getCwd, getModulePath } from \"@utils/path\";\nimport { runSafe } from \"@utils/run-safe\";\n\nimport { getConfig } from \"~/action/common/config\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\ninterface SSLOptions {\n cert: string;\n key: string;\n}\n\ninterface FullEnv {\n client: Record<string, string>;\n server: Record<string, string>;\n}\n\nexport class StartAction extends AbstractAction {\n protected startMessage = Messages.START_START;\n protected successMessage = Messages.START_SUCCESS;\n protected failureMessage = Messages.START_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const config = await getConfig(options, directory);\n const clientDir = getStringInputWithDefault(options, \"clientDir\", config.client.outDir);\n const serverDir = getStringInputWithDefault(options, \"serverDir\", config.server.outDir);\n const watch = getWatchInput(options);\n const port = getStringInputWithDefault(options, \"port\", config.client.port);\n const ssl = this.resolveSSL(options, config);\n\n const tasks = this.buildStartTasks(config, directory, {\n clientDir,\n serverDir,\n watch,\n port,\n ssl,\n });\n await Promise.all(tasks);\n\n return { keepAlive: true };\n }\n\n private resolveSSL(options: Input, config: Config): SSLOptions | undefined {\n const cliCert = getStringInput(options, \"cert\");\n const cliKey = getStringInput(options, \"key\");\n const isSslRequested = Boolean(cliCert || cliKey || config.ssl?.enable);\n\n if (!isSslRequested) return undefined;\n\n const cert = cliCert ? cliCert : config.ssl?.cert;\n const key = cliKey ? cliKey : config.ssl?.key;\n\n if (!cert) {\n throw new CLIError(\n \"No certificate found for SSL.\",\n \"Please provide a certificate path with --cert or configure 'ssl.cert' in your nanoforge.config.json.\",\n );\n }\n\n if (!key) {\n throw new CLIError(\n \"No key found for SSL.\",\n \"Please provide a key path with --key or configure 'ssl.key' in your nanoforge.config.json.\",\n );\n }\n\n return {\n cert,\n key,\n };\n }\n\n private buildStartTasks(\n config: Config,\n directory: string,\n options: {\n clientDir: string;\n serverDir: string;\n watch: boolean;\n port: string;\n ssl?: SSLOptions;\n },\n ): Promise<void>[] {\n const env = this.parseEnv(directory);\n const tasks: Promise<void>[] = [];\n const { clientDir, serverDir, watch, port, ssl } = options;\n\n if (config.server.enable)\n tasks.push(this.startServer(directory, config, { serverDir, watch }, env));\n\n if (config.client.enable)\n tasks.push(\n this.startClient(directory, config, { clientDir, serverDir, watch, port, ssl }, env),\n );\n\n return tasks;\n }\n\n private async startClient(\n directory: string,\n config: Config,\n options: {\n clientDir: string;\n serverDir: string;\n watch: boolean;\n port: string;\n ssl?: SSLOptions;\n },\n env: FullEnv,\n ): Promise<void> {\n const loaderPath = getModulePath(\"@nanoforge-dev/loader-client/package.json\", true);\n\n const params = this.buildClientParams(directory, config, options);\n await this.runLoader(\"Client\", loaderPath, params, env.client);\n }\n\n private async startServer(\n directory: string,\n config: Config,\n options: { serverDir: string; watch: boolean },\n env: FullEnv,\n ): Promise<void> {\n const loaderPath = getModulePath(\"@nanoforge-dev/loader-server/package.json\", true);\n\n const params = this.buildServerParams(directory, config, options);\n await this.runLoader(\"Server\", loaderPath, params, env.server);\n }\n\n private buildClientParams(\n directory: string,\n config: Config,\n options: {\n clientDir: string;\n serverDir: string;\n watch: boolean;\n port: string;\n ssl?: SSLOptions;\n },\n ): string[] {\n const params: Record<string, string | boolean> = {\n \"-d\": getCwd(join(directory, options.clientDir)),\n \"-p\": options.port,\n };\n if (options.watch) params[\"--watch\"] = true;\n\n if (options.watch) {\n params[\"--watch\"] = true;\n if (config.server.enable) {\n params[\"--watch-server-dir\"] = getCwd(join(directory, options.serverDir));\n }\n }\n\n if (options.ssl) {\n params[\"--cert\"] = options.ssl.cert;\n params[\"--key\"] = options.ssl.key;\n }\n\n return this.buildParams(params);\n }\n\n private buildServerParams(\n directory: string,\n _config: Config,\n options: {\n serverDir: string;\n watch: boolean;\n },\n ): string[] {\n const params: Record<string, string | boolean> = {\n \"-d\": getCwd(join(directory, options.serverDir)),\n };\n if (options.watch) params[\"--watch\"] = true;\n\n return this.buildParams(params);\n }\n\n private buildParams(params: Record<string, string | boolean>): string[] {\n return Object.entries(params)\n .map(([key, value]) => (typeof value === \"string\" ? [key, value] : [key]))\n .flat();\n }\n\n private parseEnv(dir: string): FullEnv {\n const prefix = \"NANOFORGE_\";\n const clientPrefix = `${prefix}CLIENT_`;\n const serverPrefix = `${prefix}SERVER_`;\n\n const rawEnv = {\n ...process.env,\n };\n dotenv.config({\n path: resolve(getCwd(join(dir, \".env\"))),\n processEnv: rawEnv,\n });\n const baseEnv = Object.entries(rawEnv).filter(\n ([key, value]) => key.startsWith(prefix) && !!value,\n ) as [string, string][];\n\n return {\n client: Object.fromEntries(\n baseEnv\n .filter(([key]) => !key.startsWith(serverPrefix))\n .map(([key, value]) => [key.replace(clientPrefix, prefix), value]),\n ),\n server: Object.fromEntries(\n baseEnv\n .filter(([key]) => !key.startsWith(clientPrefix))\n .map(([key, value]) => [key.replace(serverPrefix, prefix), value]),\n ),\n };\n }\n\n private async runLoader(\n name: string,\n directory: string,\n params: string[],\n env: Record<string, string>,\n ): Promise<void> {\n await runSafe(async () => {\n const packageManager = await PackageManagerFactory.find(directory);\n await packageManager.run(name, directory, \"start\", params, env, [], true);\n });\n }\n}\n","import { type Input, getDirectoryInput } from \"@lib/input\";\nimport { loadManifest } from \"@lib/manifest\";\nimport { Registry } from \"@lib/registry\";\nimport { Messages } from \"@lib/ui\";\n\nimport { withSpinner } from \"@utils/spinner\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class UnpublishAction extends AbstractAction {\n protected startMessage = Messages.UNPUBLISH_START;\n protected successMessage = Messages.UNPUBLISH_SUCCESS;\n protected failureMessage = Messages.UNPUBLISH_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n\n const manifest = await loadManifest(directory);\n\n return withSpinner(\n () => Registry.unpublish(manifest, directory),\n Messages.UNPUBLISH_IN_PROGRESS(manifest.name),\n );\n }\n}\n","import { type Command } from \"commander\";\n\nimport { type Input, type InputValue } from \"@lib/input\";\n\nimport { type AbstractAction } from \"~/action/abstract.action\";\n\nexport abstract class AbstractCommand {\n constructor(protected action: AbstractAction) {}\n\n public abstract load(program: Command): void;\n\n protected static mapToInput(mapping: Record<string, InputValue[\"value\"]>): Input {\n const input: Input = new Map();\n for (const [key, value] of Object.entries(mapping)) {\n input.set(key, { value });\n }\n return input;\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface BuildOptions {\n directory?: string;\n config?: string;\n clientEntry?: string;\n serverEntry?: string;\n clientStaticDir?: string;\n serverStaticDir?: string;\n clientOutDir?: string;\n serverOutDir?: string;\n editor?: boolean;\n watch?: boolean;\n}\n\nexport class BuildCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"build\")\n .description(\"build your game\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"--client-entry <clientEntry>\", \"specify the entry file of the client\")\n .option(\"--server-entry <serverEntry>\", \"specify the entry file of the server\")\n .option(\"--client-static-dir <clientStaticDir>\", \"specify the static directory of the client\")\n .option(\"--server-static-dir <serverStaticDir>\", \"specify the static directory of the server\")\n .option(\"--client-out-dir <clientOutDir>\", \"specify the output directory of the client\")\n .option(\"--server-out-dir <serverOutDir>\", \"specify the output directory of the server\")\n .option(\"--editor\", \"specify if the project must build with editor config\")\n .option(\"--watch\", \"build app in watching mode\", false)\n .action(async (rawOptions: BuildOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n clientEntry: rawOptions.clientEntry,\n serverEntry: rawOptions.serverEntry,\n clientStaticDir: rawOptions.clientStaticDir,\n serverStaticDir: rawOptions.serverStaticDir,\n clientOutDir: rawOptions.clientOutDir,\n serverOutDir: rawOptions.serverOutDir,\n editor: rawOptions.editor,\n watch: rawOptions.watch,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface CreateOptions {\n directory?: string;\n config: string;\n name?: string;\n server: boolean;\n path?: string;\n}\n\nexport class CreateCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"create <type>\")\n .description(\"create nanoforge components or systems\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"-n, --name <name>\", \"name of the component/system\")\n .option(\n \"-s, --server\",\n \"install components/systems on server (default install on client)\",\n false,\n )\n .option(\n \"-p, --path <path>\",\n \"path to the component/system folder (default: <part>/<components|systems>)\",\n )\n .action(async (type: string, rawOptions: CreateOptions) => {\n const args = AbstractCommand.mapToInput({\n type,\n });\n\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n name: rawOptions.name,\n server: rawOptions.server,\n path: rawOptions.path,\n });\n\n await this.action.run(args, options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface DevOptions {\n directory?: string;\n config?: string;\n generate?: boolean;\n editor?: boolean;\n}\n\nexport class DevCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"dev\")\n .description(\"run your game in dev mode\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"--generate\", \"generate app from config\", false)\n .option(\"-e, --editor\", \"run the editor\", false)\n .action(async (rawOptions: DevOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n generate: rawOptions.generate,\n editor: rawOptions.editor,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface EditorOptions {\n directory?: string;\n open?: boolean;\n}\n\nexport class EditorCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"editor [path]\")\n .description(\"start the editor\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\n \"--open\",\n \"open the editor on the default web browser (default: true if path is specified, false otherwise)\",\n )\n .option(\"--no-open\", \"do not open the editor on the default web browser\")\n .action(async (path: string, rawOptions: EditorOptions) => {\n const args = AbstractCommand.mapToInput({\n path,\n });\n\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n open: rawOptions.open,\n });\n\n await this.action.run(args, options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface GenerateOptions {\n directory?: string;\n config?: string;\n editor?: boolean;\n watch?: boolean;\n}\n\nexport class GenerateCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"generate\")\n .description(\"generate nanoforge files from config\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"--editor\", \"specify if the project must generate editor main file\")\n .option(\"--watch\", \"generate app in watching mode\", false)\n .action(async (rawOptions: GenerateOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n editor: rawOptions.editor,\n watch: rawOptions.watch,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface InstallOptions {\n directory?: string;\n lib?: boolean;\n server?: boolean;\n}\n\nexport class InstallCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"install [names...]\")\n .alias(\"add\")\n .description(\"add Nanoforge components and systems to your project\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-l, --lib\", \"install library instead of component/system\", false)\n .option(\n \"-s, --server\",\n \"install components/systems on server (default install on client)\",\n false,\n )\n .action(async (names: string[], rawOptions: InstallOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n lib: rawOptions.lib,\n server: rawOptions.server,\n });\n const args = AbstractCommand.mapToInput({\n names: names.length ? names : undefined,\n });\n\n await this.action.run(args, options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface LoginOptions {\n directory?: string;\n local?: boolean;\n apiKey?: string;\n}\n\nexport class LoginCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"login\")\n .description(\"login to Nanoforge registry\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-l, --local\", \"login only for the project\", false)\n .option(\"-k, --api-key <key>\", \"api key for Nanoforge registry\")\n .action(async (rawOptions: LoginOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n local: rawOptions.local,\n apiKey: rawOptions.apiKey,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface LogoutOptions {\n directory?: string;\n local?: boolean;\n}\n\nexport class LogoutCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"logout\")\n .description(\"logout from Nanoforge registry\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-l, --local\", \"logout only for the project\")\n .action(async (rawOptions: LogoutOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n local: rawOptions.local,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface NewOptions {\n directory?: string;\n name?: string;\n path?: string;\n packageManager?: string;\n language?: string;\n strict?: boolean;\n server?: boolean;\n initFunctions?: boolean;\n skipInstall?: boolean;\n docker?: boolean;\n lint?: boolean;\n editor?: boolean;\n git?: boolean;\n gitRemote?: string | false;\n}\n\nexport class NewCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"new\")\n .description(\"create a new nanoforge project\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"--name <name>\", \"specify the name of your project\")\n .option(\n \"--path <path>\",\n \"specify the relative path where your project will be created (default: name of the project)\",\n )\n .option(\"--package-manager <packageManager>\", \"specify the package manager of your project\")\n .option(\"--language <language>\", \"specify the language of your project\")\n .option(\"--strict\", \"use strict mode\")\n .option(\"--no-strict\", \"do not use strict mode\")\n .option(\"--server\", \"create a server\")\n .option(\"--no-server\", \"do not create a server\")\n .option(\"--init-functions\", \"initialize functions\")\n .option(\"--no-init-functions\", \"do not initialize functions\")\n .option(\"--skip-install\", \"skip installing dependencies\")\n .option(\"--no-skip-install\", \"do not skip installing dependencies\")\n .option(\"--docker\", \"generate docker files\")\n .option(\"--no-docker\", \"do not generate docker files\")\n .option(\"--no-lint\", \"do not generate lint files\")\n .option(\"--editor\", \"do add editor dependencies\")\n .option(\"--git\", \"generate git repository\")\n .option(\"--no-git\", \"do not generate git repository\")\n .option(\n \"--git-remote <gitRemote>\",\n \"setup git remote to git repository (required if --git is used)\",\n )\n .option(\"--no-git-remote\", \"do not setup git remote to git repository\")\n .action(async (rawOptions: NewOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n name: rawOptions.name,\n path: rawOptions.path,\n packageManager: rawOptions.packageManager,\n language: rawOptions.language,\n strict: rawOptions.strict,\n server: rawOptions.server,\n initFunctions: rawOptions.initFunctions,\n skipInstall: rawOptions.skipInstall,\n docker: rawOptions.docker,\n lint: rawOptions.lint,\n editor: rawOptions.editor,\n git: rawOptions.git,\n });\n\n if (typeof rawOptions.gitRemote === \"boolean\")\n options.set(\"gitRemote\", { value: rawOptions.gitRemote ? undefined : \"\" });\n else if (rawOptions.gitRemote) options.set(\"gitRemote\", { value: rawOptions.gitRemote });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface PublishOptions {\n directory?: string;\n}\n\nexport class PublishCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"publish\")\n .description(\"publish package to Nanoforge registry\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .action(async (rawOptions: PublishOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface StartOptions {\n directory?: string;\n config?: string;\n port?: string;\n clientDir?: string;\n serverDir?: string;\n watch?: boolean;\n cert?: string;\n key?: string;\n}\n\nexport class StartCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"start\")\n .description(\"start your game\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"-p, --port <port>\", \"specify the port of the loader (the website to load the game)\")\n .option(\"--client-dir <clientDirectory>\", \"specify the directory of the client\")\n .option(\"--server-dir <serverDirectory>\", \"specify the directory of the server\")\n .option(\"--watch\", \"run app in watching mode\", false)\n .option(\"--cert <cert>\", \"path to the SSL certificate for HTTPS\")\n .option(\"--key <key>\", \"path to the SSL key for HTTPS\")\n .action(async (rawOptions: StartOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n port: rawOptions.port,\n clientDir: rawOptions.clientDir,\n serverDir: rawOptions.serverDir,\n watch: rawOptions.watch,\n cert: rawOptions.cert,\n key: rawOptions.key,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface UnpublishOptions {\n directory?: string;\n}\n\nexport class UnpublishCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"unpublish\")\n .description(\"unpublish package to Nanoforge registry\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .action(async (rawOptions: UnpublishOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { red } from \"ansis\";\nimport { type Command } from \"commander\";\n\nimport { Prefixes } from \"@lib/ui\";\n\nimport {\n BuildAction,\n CreateAction,\n DevAction,\n EditorAction,\n GenerateAction,\n InstallAction,\n LoginAction,\n LogoutAction,\n NewAction,\n PublishAction,\n StartAction,\n UnpublishAction,\n} from \"~/action\";\n\nimport { BuildCommand } from \"./commands/build.command\";\nimport { CreateCommand } from \"./commands/create.command\";\nimport { DevCommand } from \"./commands/dev.command\";\nimport { EditorCommand } from \"./commands/editor.command\";\nimport { GenerateCommand } from \"./commands/generate.command\";\nimport { InstallCommand } from \"./commands/install.command\";\nimport { LoginCommand } from \"./commands/login.command\";\nimport { LogoutCommand } from \"./commands/logout.command\";\nimport { NewCommand } from \"./commands/new.command\";\nimport { PublishCommand } from \"./commands/publish.command\";\nimport { StartCommand } from \"./commands/start.command\";\nimport { UnpublishCommand } from \"./commands/unpublish.command\";\n\nexport class CommandLoader {\n public static async load(program: Command): Promise<void> {\n new NewCommand(new NewAction()).load(program);\n new InstallCommand(new InstallAction()).load(program);\n new BuildCommand(new BuildAction()).load(program);\n new StartCommand(new StartAction()).load(program);\n new DevCommand(new DevAction()).load(program);\n new EditorCommand(new EditorAction()).load(program);\n new GenerateCommand(new GenerateAction()).load(program);\n new CreateCommand(new CreateAction()).load(program);\n new LoginCommand(new LoginAction()).load(program);\n new LogoutCommand(new LogoutAction()).load(program);\n new PublishCommand(new PublishAction()).load(program);\n new UnpublishCommand(new UnpublishAction()).load(program);\n this.handleInvalidCommand(program);\n }\n\n private static handleInvalidCommand(program: Command) {\n program.on(\"command:*\", () => {\n console.error(`\\n${Prefixes.ERROR} Invalid command: ${red`%s`}`, program.args.join(\" \"));\n console.log(`See ${red`--help`} for a list of available commands.\\n`);\n process.exit(1);\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"command.loader.js","names":["join","process","join","join","join","join","join"],"sources":["../src/lib/ui/emojis.ts","../src/lib/ui/messages.ts","../src/lib/ui/prefixes.ts","../src/lib/ui/spinner.ts","../src/lib/utils/errors.ts","../src/lib/input/base-inputs.ts","../src/lib/input/ask-inputs.ts","../src/lib/input/inputs/directory.input.ts","../src/lib/input/inputs/config.input.ts","../src/lib/input/inputs/editor.input.ts","../src/lib/question/questions/confirm.question.ts","../src/lib/question/questions/input.question.ts","../src/lib/question/questions/number.question.ts","../src/lib/question/questions/select.question.ts","../src/lib/input/inputs/name.input.ts","../src/lib/input/inputs/path.input.ts","../src/lib/input/inputs/server.input.ts","../src/lib/input/inputs/watch.input.ts","../src/lib/input/inputs/create/type.input.ts","../src/lib/input/inputs/dev/generate.input.ts","../src/lib/input/inputs/editor/open.input.ts","../src/lib/input/inputs/install/lib.input.ts","../src/lib/input/inputs/install/names.input.ts","../src/lib/input/inputs/login-out/api-key.input.ts","../src/lib/input/inputs/login-out/local.input.ts","../src/lib/input/inputs/new/docker.input.ts","../src/lib/input/inputs/new/init-functions.input.ts","../src/lib/input/inputs/new/language.input.ts","../src/lib/input/inputs/new/lint.input.ts","../src/lib/input/inputs/new/package-manager.input.ts","../src/lib/input/inputs/new/server.input.ts","../src/lib/input/inputs/new/skip-install.input.ts","../src/lib/input/inputs/new/strict.input.ts","../src/lib/runner/process-logger.ts","../src/lib/utils/path.ts","../src/lib/utils/spinner.ts","../src/lib/package-manager/package-manager.ts","../src/lib/runner/runner.ts","../src/lib/runner/runner.factory.ts","../src/lib/package-manager/package-manager-name.ts","../src/lib/package-manager/package-manager-configs.ts","../src/lib/package-manager/package-manager.factory.ts","../src/lib/utils/files.ts","../src/lib/utils/run-safe.ts","../src/lib/config/config.type.ts","../src/lib/constants.ts","../src/lib/utils/object.ts","../src/lib/config/config-defaults.ts","../src/lib/config/config-loader.ts","../src/action/common/config.ts","../src/action/abstract.action.ts","../src/action/actions/build.action.ts","../src/lib/schematics/collection.ts","../src/lib/schematics/abstract.collection.ts","../src/lib/schematics/nanoforge.collection.ts","../src/lib/schematics/collection.factory.ts","../src/lib/utils/formatting.ts","../src/lib/schematics/schematic.option.ts","../src/action/common/schematics.ts","../src/action/actions/create.action.ts","../src/action/actions/dev.action.ts","../src/action/actions/editor.action.ts","../src/action/actions/generate.action.ts","../src/lib/global-config/global-config-defaults.ts","../src/lib/global-config/global-config-handler.ts","../src/lib/http/http-client.ts","../src/lib/http/repository.ts","../src/lib/http/client.ts","../src/lib/manifest/manifest-resolver.ts","../src/lib/registry/registry.ts","../src/action/actions/install.action.ts","../src/action/actions/login.action.ts","../src/action/actions/logout.action.ts","../src/lib/git/git-runner.ts","../src/lib/input/inputs/new/git-remote.input.ts","../src/lib/input/inputs/new/git.input.ts","../src/action/actions/new.action.ts","../src/lib/manifest/manifest.type.ts","../src/lib/manifest/manifest-loader.ts","../src/action/actions/publish.action.ts","../src/action/actions/start.action.ts","../src/action/actions/unpublish.action.ts","../src/command/abstract.command.ts","../src/command/commands/build.command.ts","../src/command/commands/create.command.ts","../src/command/commands/dev.command.ts","../src/command/commands/editor.command.ts","../src/command/commands/generate.command.ts","../src/command/commands/install.command.ts","../src/command/commands/login.command.ts","../src/command/commands/logout.command.ts","../src/command/commands/new.command.ts","../src/command/commands/publish.command.ts","../src/command/commands/start.command.ts","../src/command/commands/unpublish.command.ts","../src/command/command.loader.ts"],"sourcesContent":["import { get } from \"node-emoji\";\n\nexport const Emojis = {\n HEART: get(\"heart\"),\n COFFEE: get(\"coffee\"),\n BEER: get(\"beer\"),\n BROKEN_HEART: get(\"broken_heart\"),\n CRYING: get(\"crying_cat_face\"),\n HEART_EYES: get(\"heart_eyes_cat\"),\n JOY: get(\"joy_cat\"),\n KISSING: get(\"kissing_cat\"),\n SCREAM: get(\"scream_cat\"),\n ROCKET: get(\"rocket\"),\n SMIRK: get(\"smirk_cat\"),\n RAISED_HANDS: get(\"raised_hands\"),\n POINT_RIGHT: get(\"point_right\"),\n SPARKLES: get(\"sparkles\"),\n BOOM: get(\"boom\"),\n PRAY: get(\"pray\"),\n WINE: get(\"wine_glass\"),\n};\n","import { bold, green } from \"ansis\";\n\nimport { Emojis } from \"./emojis\";\n\nconst success = (text: string) => `${Emojis.ROCKET} ${text}`;\nconst failure = (text: string) => `${Emojis.SCREAM} ${text}`;\n\nexport const Messages = {\n // --- Build ---\n BUILD_START: \"NanoForge Build\",\n BUILD_SUCCESS: success(\"Build succeeded!\"),\n BUILD_FAILED: failure(\"Build failed!\"),\n BUILD_WATCH_START: \"Watching for changes...\",\n BUILD_PART_IN_PROGRESS: (part: string) => `Building ${part}`,\n BUILD_PART_WATCH_IN_PROGRESS: (part: string) => `${part} updated, rebuilding`,\n BUILD_PART_SUCCESS: (name: string) => success(`Build of ${name} succeeded!`),\n BUILD_PART_FAILED: (part: string, command: string) =>\n failure(`Build of ${part} failed!\\nTry running manually: ${bold(command)}`),\n\n // --- Install ---\n INSTALL_START: \"NanoForge Installation\",\n INSTALL_SUCCESS: success(\"Installation completed!\"),\n INSTALL_FAILED: failure(\"Installation failed!\"),\n INSTALL_NAMES_QUESTION: \"Which libraries do you want to install?\",\n INSTALL_PACKAGES_IN_PROGRESS: \"Install Nanoforge Packages\",\n\n // --- Login ---\n LOGIN_START: \"NanoForge Login\",\n LOGIN_SUCCESS: success(\"Login completed!\"),\n LOGIN_FAILED: failure(\"Login failed!\"),\n LOGIN_API_KEY_QUESTION: \"What is your registry api key?\",\n\n // --- Logout ---\n LOGOUT_START: \"NanoForge Logout\",\n LOGOUT_SUCCESS: success(\"Logout completed!\"),\n LOGOUT_FAILED: failure(\"Logout failed!\"),\n\n // --- New Project ---\n NEW_START: \"NanoForge Project Creation\",\n NEW_SUCCESS: success(\"Project successfully created!\"),\n NEW_FAILED: failure(\"Project creation failed!\"),\n NEW_GENERATION_START: \"Creating project...\",\n NEW_NAME_QUESTION: \"What is the name of your project?\",\n NEW_PACKAGE_MANAGER_QUESTION: \"Which package manager do you want to use?\",\n NEW_LANGUAGE_QUESTION: \"Which language do you want to use?\",\n NEW_STRICT_QUESTION: \"Do you want to use strict type checking?\",\n NEW_SERVER_QUESTION: \"Do you want to generate a server for multiplayer?\",\n NEW_SKIP_INSTALL_QUESTION: \"Do you want to skip dependency installation?\",\n NEW_DOCKER_QUESTION: \"Do you want to add a Dockerfile for containerization?\",\n NEW_GIT_QUESTION: \"Do you want to create a git repository?\",\n NEW_GIT_REMOTE_QUESTION: \"Do you want to setup a git remote? (leave empty if you don't want to)\",\n\n // --- Create ---\n CREATE_START: \"NanoForge Component/System Creation\",\n CREATE_SUCCESS: success(\"Element successfully created!\"),\n CREATE_FAILED: failure(\"Creation failed!\"),\n CREATE_NAME_QUESTION: \"What is the name of your component/system?\",\n\n // --- Generate ---\n GENERATE_START: \"NanoForge Generate\",\n GENERATE_SUCCESS: success(\"Generation succeeded!\"),\n GENERATE_FAILED: failure(\"Generation failed!\"),\n GENERATE_WATCH_START: \"Watching for changes...\",\n\n // --- Dev ---\n DEV_START: \"NanoForge Dev Mode\",\n DEV_SUCCESS: \"Dev mode ended\",\n DEV_FAILED: failure(\"Dev mode failed!\"),\n\n // --- Start ---\n START_START: \"NanoForge Start\",\n START_SUCCESS: success(\"Start completed!\"),\n START_FAILED: failure(\"Start failed!\"),\n START_PART_IN_PROGRESS: (part: string) => `Starting ${part}...`,\n START_PART_SUCCESS: (part: string) => success(`${part} terminated.`),\n START_PART_FAILED: (part: string) => failure(`${part} failed!`),\n\n EDITOR_START: \"NanoForge Editor\",\n EDITOR_SUCCESS: \"Editor ended\",\n EDITOR_FAILED: failure(\"Editor failed!\"),\n\n // --- Publish ---\n PUBLISH_START: \"NanoForge Publish\",\n PUBLISH_SUCCESS: success(\"Publish completed!\"),\n PUBLISH_FAILED: failure(\"Publish failed!\"),\n PUBLISH_IN_PROGRESS: (name: string) => `Publishing ${name}...`,\n\n // --- Unpublish ---\n UNPUBLISH_START: \"NanoForge Unpublish\",\n UNPUBLISH_SUCCESS: success(\"Unpublish completed!\"),\n UNPUBLISH_FAILED: failure(\"Unpublish failed!\"),\n UNPUBLISH_IN_PROGRESS: (name: string) => `Unpublishing ${name}...`,\n\n // --- Schematics ---\n SCHEMATIC_IN_PROGRESS: (name: string) => `Generating ${name}...`,\n SCHEMATIC_WATCH_IN_PROGRESS: (name: string) => `Change detected, regenerating ${name}...`,\n SCHEMATIC_SUCCESS: (name: string) => success(`${name} generated successfully!`),\n SCHEMATIC_FAILED: (name: string) => failure(`${name} generation failed.`),\n\n // --- Package Manager ---\n PACKAGE_MANAGER_INSTALLATION_IN_PROGRESS: `Installing dependencies... ${Emojis.COFFEE}`,\n PACKAGE_MANAGER_INSTALLATION_NOTHING: \"Nothing to install.\",\n PACKAGE_MANAGER_INSTALLATION_SUCCEED: (names?: string[]) =>\n names\n ? success(`Packages installed: ${names.map((n) => green(n)).join(\", \")}`)\n : success(\"Packages installed!\"),\n PACKAGE_MANAGER_INSTALLATION_FAILED: (command: string) =>\n failure(`Package installation failed!\\nTry running manually: ${bold(command)}`),\n\n // --- Git init ---\n GIT_INIT_IN_PROGRESS: `Initializing git repository... ${Emojis.COFFEE}`,\n GIT_INIT_SUCCEED: success(\"Git repository initialized!\"),\n GIT_INIT_FAILED: (command: string) =>\n failure(`Git repository initialization failed!\\nTry running manually: ${bold(command)}`),\n\n // --- Git remote ---\n GIT_REMOTE_IN_PROGRESS: `Adding git remote... ${Emojis.COFFEE}`,\n GIT_REMOTE_SUCCEED: success(\"Git remote added!\"),\n GIT_REMOTE_FAILED: (command: string) =>\n failure(`Git remote addition failed!\\nTry running manually: ${bold(command)}`),\n\n // --- Runner ---\n RUNNER_EXECUTION_ERROR: (command: string) => `\\nFailed to execute command: ${bold(command)}`,\n};\n","import { bgRgb } from \"ansis\";\n\nexport const Prefixes = {\n INFO: bgRgb(60, 190, 100).bold.rgb(0, 0, 0)(\" Info \"),\n ERROR: bgRgb(210, 0, 75).bold.rgb(0, 0, 0)(\" Error \"),\n};\n","import ora from \"ora\";\n\nexport const getSpinner = (message: string) => ora({ text: message });\n","import { cyan, red } from \"ansis\";\n\nexport class CLIError extends Error {\n public readonly suggestion?: string;\n\n constructor(message: string, suggestion?: string) {\n super(message);\n this.name = this.constructor.name;\n this.suggestion = suggestion;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ConfigNotFoundError extends CLIError {\n constructor(configPath: string) {\n super(\n `Configuration file not found at path: ${configPath}.`,\n \"Please run 'nf new' or provide a valid --config path.\",\n );\n }\n}\n\nexport class BuildError extends CLIError {\n constructor(details: string) {\n super(\n `Build failed: ${details}`,\n \"Check the logs above for syntax errors or configuration issues.\",\n );\n }\n}\n\nexport class InvalidCommandArgumentError extends CLIError {\n constructor(argName: string, expected: string) {\n super(\n `Invalid argument '${argName}'. Expected: ${expected}.`,\n \"Verify the command syntax using the --help flag.\",\n );\n }\n}\n\nexport class RegistryAuthenticationError extends CLIError {\n constructor() {\n super(\"You must be logged in to perform this action.\", \"Run 'nf login' to authenticate.\");\n }\n}\n\nexport class ProjectInitializationError extends CLIError {\n constructor(details: string) {\n super(\n `Failed to create new project: ${details}`,\n \"Verify your permissions and that the target directory is empty.\",\n );\n }\n}\n\nexport class ManifestError extends CLIError {\n constructor(detail: string) {\n super(\n `Manifest Error: ${detail}`,\n \"Check your nanoforge.manifest.json file for syntax or formatting errors.\",\n );\n }\n}\n\nexport class FileSystemError extends CLIError {\n constructor(action: string, targetPath: string) {\n super(\n `File System Error [${action}]: ${targetPath}`,\n \"Verify your file permissions and ensure the path exists.\",\n );\n }\n}\n\nexport class ApiRequestError extends CLIError {\n constructor(status: number, cause?: unknown) {\n const causeStr = cause && typeof cause === \"object\" ? JSON.stringify(cause, null, 2) : cause;\n super(\n `API Request failed (Status ${status})${causeStr ? `\\nDetails: ${causeStr}` : \"\"}`,\n \"Check your network connection, API key, or the registry status.\",\n );\n }\n}\n\nconst getErrorString = (error: Error): string => {\n const stack = error.stack ? error.stack : error.message;\n const cause =\n error.cause && typeof error.cause === \"object\"\n ? JSON.stringify(error.cause, null, 2)\n : error.cause;\n return `${stack}${cause ? `\\n${cause}` : \"\"}`;\n};\n\nexport const getErrorMessage = (error: unknown): string | undefined => {\n if (error instanceof Error) return getErrorString(error);\n if (typeof error === \"string\") return error;\n return undefined;\n};\n\nexport const handleActionError = (context: string, error: unknown): never => {\n console.error();\n console.error(red(context));\n\n if (error instanceof CLIError) {\n console.error(error.message);\n\n if (error.suggestion) {\n console.info(cyan(`\\nš” Suggestion: ${error.suggestion}`));\n }\n\n process.exit(1);\n }\n\n const msg = getErrorMessage(error);\n if (msg) console.error(msg);\n process.exit(1);\n};\n\nexport const promptError = (err: Error): never => {\n if (err.name === \"ExitPromptError\") {\n process.exit(1);\n }\n throw err;\n};\n","import { InvalidCommandArgumentError } from \"@utils/errors\";\n\nimport { type Input } from \"./input.type\";\n\nexport const getStringInput = (input: Input, field: string): string | undefined => {\n const value = input.get(field)?.value;\n if (value === undefined) return undefined;\n if (typeof value === \"string\") return value;\n throw new InvalidCommandArgumentError(field, \"string\");\n};\n\nexport const getStringInputWithDefault = (\n input: Input,\n field: string,\n defaultValue: string,\n): string => {\n return getStringInput(input, field) ?? defaultValue;\n};\n\nexport const getBooleanInput = (input: Input, field: string): boolean | undefined => {\n const value = input.get(field)?.value;\n if (value === undefined) return undefined;\n if (typeof value === \"boolean\") return value;\n throw new InvalidCommandArgumentError(field, \"boolean\");\n};\n\nexport const getBooleanInputWithDefault = (\n input: Input,\n field: string,\n defaultValue: boolean,\n): boolean => {\n return getBooleanInput(input, field) ?? defaultValue;\n};\n\nexport const getArrayInput = (input: Input, field: string): string[] | undefined => {\n const value = input.get(field)?.value;\n if (value === undefined) return undefined;\n if (typeof value === \"object\" && Array.isArray(value)) return value;\n throw new InvalidCommandArgumentError(field, \"array\");\n};\n\nexport const getArrayInputWithDefault = (\n input: Input,\n field: string,\n defaultValue: string[],\n): string[] => {\n return getArrayInput(input, field) ?? defaultValue;\n};\n","import { CLIError } from \"@utils/errors\";\n\nexport const getInputOrAsk = async <T>(\n baseInput: T | undefined,\n askCb: () => Promise<T>,\n defaultValue?: T,\n): Promise<T> => {\n if (baseInput !== undefined) return baseInput;\n const res = await askCb();\n if (res !== undefined) return res;\n if (defaultValue !== undefined) return defaultValue;\n throw new CLIError(\"No input provided. Please provide a valid value.\");\n};\n","import { getStringInput, getStringInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport function getDirectoryInput(inputs: Input): string;\nexport function getDirectoryInput(inputs: Input, withDefault: false): string | undefined;\nexport function getDirectoryInput(inputs: Input, withDefault = true): string | undefined {\n if (withDefault) return getStringInputWithDefault(inputs, \"directory\", \".\");\n return getStringInput(inputs, \"directory\");\n}\n","import { getStringInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport const getConfigInput = (inputs: Input): string => {\n return getStringInputWithDefault(inputs, \"config\", \".\");\n};\n","import { getBooleanInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport const getEditorInput = (inputs: Input): boolean => {\n return getBooleanInputWithDefault(inputs, \"editor\", false);\n};\n","import { confirm } from \"@inquirer/prompts\";\n\nimport { promptError } from \"@utils/errors\";\n\ninterface ConfirmOptions {\n default: boolean;\n}\n\nexport const askConfirm = async (\n question: string,\n baseOptions?: Partial<ConfirmOptions>,\n): Promise<boolean | never> => {\n const options: ConfirmOptions = {\n default: false,\n ...(baseOptions ?? {}),\n };\n return await confirm({\n message: question,\n default: options.default,\n }).catch(promptError);\n};\n","import { input } from \"@inquirer/prompts\";\n\nimport { promptError } from \"@utils/errors\";\n\ninterface InputOptions {\n default?: string;\n required: boolean;\n}\n\ninterface InputArrayOptions {\n default?: string;\n required: boolean;\n split: string;\n filter: boolean;\n}\n\nexport const askInput = async (\n question: string,\n baseOptions?: Partial<InputOptions>,\n): Promise<string | never> => {\n const options: InputOptions = {\n required: false,\n ...(baseOptions ?? {}),\n };\n return await input({\n message: question,\n required: options.required,\n default: options.default,\n }).catch(promptError);\n};\n\nexport const askInputArray = async (\n question: string,\n baseOptions?: Partial<InputArrayOptions>,\n): Promise<string[] | never> => {\n const options: InputArrayOptions = {\n required: false,\n split: \" \",\n filter: true,\n ...(baseOptions ?? {}),\n };\n const res = (\n await input({\n message: question,\n required: options.required,\n default: options.default,\n }).catch(promptError)\n ).split(options.split);\n return options.filter ? res.filter((r) => r.length) : res;\n};\n","import { number } from \"@inquirer/prompts\";\n\nimport { CLIError, promptError } from \"@utils/errors\";\n\ninterface NumberOptions {\n default?: number;\n min?: number | undefined;\n max?: number | undefined;\n step?: number | \"any\" | undefined;\n required: boolean;\n}\n\nexport const askNumber = async (\n question: string,\n baseOptions?: Partial<NumberOptions>,\n): Promise<number | never> => {\n const options: NumberOptions = {\n required: false,\n ...(baseOptions ?? {}),\n };\n const res = await number({\n message: question,\n default: options.default,\n min: options.min,\n max: options.max,\n step: options.step,\n required: options.required,\n }).catch(promptError);\n\n if (res === undefined || isNaN(res) || !isFinite(res))\n throw new CLIError(\"Invalid number provided.\");\n return res;\n};\n","import { checkbox, select } from \"@inquirer/prompts\";\n\nimport { promptError } from \"@utils/errors\";\n\ninterface SelectChoice<T> {\n value: T;\n name?: string;\n description?: string;\n short?: string;\n disabled?: boolean | string;\n type?: never;\n}\n\ntype SelectChoices<T> = string[] | SelectChoice<T>[];\n\ninterface MultiSelectChoice<T> {\n value: T;\n name?: string;\n checkedName?: string;\n description?: string;\n short?: string;\n disabled?: boolean | string;\n checked?: boolean;\n type?: never;\n}\n\ntype MultiSelectChoices<T> = string[] | MultiSelectChoice<T>[];\n\ninterface SelectOptions<T> {\n default?: T;\n loop: boolean;\n}\n\ninterface MultiSelectOptions {\n loop: boolean;\n required: boolean;\n}\nexport const askSelect = async <T extends string = string>(\n question: string,\n choices: SelectChoices<T>,\n baseOptions?: Partial<SelectOptions<T>>,\n): Promise<T | never> => {\n const options: SelectOptions<T> = {\n loop: true,\n ...(baseOptions ?? {}),\n };\n return (await select({\n message: question,\n choices,\n loop: options.loop,\n default: options.default,\n }).catch(promptError)) as T;\n};\n\nexport const askMultiSelect = async <T extends string = string>(\n question: string,\n choices: MultiSelectChoices<T>,\n baseOptions?: Partial<MultiSelectOptions>,\n): Promise<T[] | never> => {\n const options: MultiSelectOptions = {\n loop: true,\n required: false,\n ...(baseOptions ?? {}),\n };\n return (await checkbox({\n message: question,\n choices,\n loop: options.loop,\n required: options.required,\n }).catch(promptError)) as T[];\n};\n","import { askInput } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../ask-inputs\";\nimport { getStringInput } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nconst getNameInput = (inputs: Input) => {\n return getStringInput(inputs, \"name\");\n};\n\nexport const getNewNameInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNameInput(inputs), () =>\n askInput(Messages.NEW_NAME_QUESTION, {\n required: true,\n default: \"nanoforge-app\",\n }),\n );\n};\n\nexport const getCreateNameInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNameInput(inputs), () =>\n askInput(Messages.CREATE_NAME_QUESTION, {\n required: true,\n default: \"example\",\n }),\n );\n};\n","import { getStringInput, getStringInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport const getPathInput = (inputs: Input) => {\n return getStringInput(inputs, \"path\");\n};\n\nexport const getPathInputWithDefault = (inputs: Input, defaultValue: string) => {\n return getStringInputWithDefault(inputs, \"path\", defaultValue);\n};\n","import { getBooleanInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport function getServerInput(inputs: Input): boolean {\n return getBooleanInputWithDefault(inputs, \"server\", false);\n}\n","import { getBooleanInputWithDefault } from \"../base-inputs\";\nimport { type Input } from \"../input.type\";\n\nexport const getWatchInput = (inputs: Input): boolean => {\n return getBooleanInputWithDefault(inputs, \"watch\", false);\n};\n","import { getStringInput } from \"@lib/input\";\nimport { type Input } from \"@lib/input\";\n\nimport { InvalidCommandArgumentError } from \"@utils/errors\";\n\nexport const getCreateTypeInput = (inputs: Input): \"component\" | \"system\" => {\n const res = getStringInput(inputs, \"type\");\n if (res && [\"component\", \"system\"].includes(res)) return res as \"component\" | \"system\";\n throw new InvalidCommandArgumentError(\"type\", \"'component' or 'system'\");\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport const getDevGenerateInput = (inputs: Input): boolean => {\n return getBooleanInputWithDefault(inputs, \"generate\", false);\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport const getEditorOpenInput = (inputs: Input, defaultValue: boolean): boolean => {\n return getBooleanInputWithDefault(inputs, \"open\", defaultValue);\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport function getInstallLibInput(inputs: Input): boolean {\n return getBooleanInputWithDefault(inputs, \"lib\", false);\n}\n","import { askInputArray } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getArrayInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNamesInput = (inputs: Input) => {\n return getArrayInput(inputs, \"names\");\n};\n\nexport const getInstallNamesInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNamesInput(inputs), () =>\n askInputArray(Messages.INSTALL_NAMES_QUESTION, { required: true }),\n );\n};\n","import { askInput } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getStringInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getApiKeyInput = (inputs: Input) => {\n return getStringInput(inputs, \"apiKey\");\n};\n\nexport const getLoginApiKeyInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getApiKeyInput(inputs), () =>\n askInput(Messages.LOGIN_API_KEY_QUESTION, {\n required: true,\n }),\n );\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport function getLocalInput(inputs: Input): boolean {\n return getBooleanInputWithDefault(inputs, \"local\", false);\n}\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewDockerInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"docker\");\n};\n\nexport const getNewDockerOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewDockerInput(inputs), () =>\n askConfirm(Messages.NEW_DOCKER_QUESTION, { default: true }),\n );\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport const getNewInitFunctionsWithDefault = (inputs: Input) => {\n return getBooleanInputWithDefault(inputs, \"initFunctions\", false);\n};\n","import { askSelect } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getStringInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getLanguageInput = (inputs: Input) => {\n return getStringInput(inputs, \"language\");\n};\n\nexport const getNewLanguageInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getLanguageInput(inputs), () =>\n askSelect<\"ts\" | \"js\">(Messages.NEW_LANGUAGE_QUESTION, [{ value: \"ts\" }, { value: \"js\" }], {\n default: \"ts\",\n }),\n );\n};\n","import { getBooleanInputWithDefault } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nexport const getNewLintInput = (inputs: Input): boolean => {\n return getBooleanInputWithDefault(inputs, \"lint\", true);\n};\n","import { askSelect } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getStringInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getPackageManagerInput = (inputs: Input) => {\n return getStringInput(inputs, \"packageManager\");\n};\n\nexport const getNewPackageManagerInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getPackageManagerInput(inputs), () =>\n askSelect<\"npm\" | \"yarn\" | \"pnpm\" | \"bun\">(\n Messages.NEW_PACKAGE_MANAGER_QUESTION,\n [{ value: \"npm\" }, { value: \"yarn\" }, { value: \"pnpm\" }, { value: \"bun\" }],\n {\n default: \"npm\",\n },\n ),\n );\n};\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewServerInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"server\");\n};\n\nexport const getNewServerOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewServerInput(inputs), () =>\n askConfirm(Messages.NEW_SERVER_QUESTION, { default: false }),\n );\n};\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewSkipInstallInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"skipInstall\");\n};\n\nexport const getNewSkipInstallOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewSkipInstallInput(inputs), () =>\n askConfirm(Messages.NEW_SKIP_INSTALL_QUESTION, { default: false }),\n );\n};\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewStrictInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"strict\");\n};\n\nexport const getNewStrictOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewStrictInput(inputs), () =>\n askConfirm(Messages.NEW_STRICT_QUESTION, { default: true }),\n );\n};\n","import { green, red, yellow } from \"ansis\";\n\nconst formatLines = (chunk: string | ArrayBuffer): string[] => {\n return chunk\n .toString()\n .replace(/\\r\\n|\\n/g, \"\\n\")\n .replace(/^\\n+|\\n+$/g, \"\")\n .split(\"\\n\");\n};\n\nconst timestamp = (): string => yellow(`[${new Date().toISOString()}]`);\n\nexport const createStdoutLogger = (name: string) => (chunk: string) => {\n const prefix = green(`(${name}) INFO -`);\n for (const line of formatLines(chunk)) {\n console.info(`${timestamp()} ${prefix} ${line}`);\n }\n};\n\nexport const createStderrLogger = (name: string) => (chunk: string) => {\n const prefix = red(`(${name}) ERROR -`);\n for (const line of formatLines(chunk)) {\n console.error(`${timestamp()} ${prefix} ${line}`);\n }\n};\n","import fs from \"fs\";\nimport { join, resolve } from \"path\";\n\nimport { FileSystemError } from \"@utils/errors\";\n\nexport const getCwd = (directory: string) => {\n return resolve(directory);\n};\n\nexport const getModulePath = (name: string, removeLast = false) => {\n const path = import.meta.resolve(name).replace(/^file:\\/\\//, \"\");\n if (removeLast) return path.split(\"/\").slice(0, -1).join(\"/\");\n return path;\n};\n\nexport const resolveCLINodeBinaryPath = (name: string) => {\n let base = join(getModulePath(\"./\", true), \"..\");\n while (base.length >= 1) {\n const path = join(base, \"node_modules\", \".bin\", name);\n try {\n fs.accessSync(path);\n return path;\n } catch {\n base = join(base, \"..\");\n }\n }\n throw new FileSystemError(\"resolve binary\", name);\n};\n","import { red } from \"ansis\";\nimport { type Ora } from \"ora\";\n\nimport { getSpinner } from \"@lib/ui\";\n\ninterface SpinnerTaskResult<T> {\n success: boolean;\n value?: T;\n error?: unknown;\n}\n\nexport const withSpinner = async <T>(\n task: (spinner: Ora) => Promise<T>,\n loadingMessage: string,\n successMessage?: string,\n failureMessage?: string,\n onError?: () => void,\n): Promise<SpinnerTaskResult<T>> => {\n const spinner = getSpinner(loadingMessage);\n spinner.start();\n\n try {\n const value = await task(spinner);\n spinner.succeed(successMessage);\n return { success: true, value };\n } catch (error: unknown) {\n spinner.fail(red(failureMessage));\n if (onError) onError();\n return { success: false, error };\n }\n};\n","import { red } from \"ansis\";\n\nimport { createStderrLogger, createStdoutLogger } from \"@lib/runner/process-logger\";\nimport { type RunOptions, type Runner } from \"@lib/runner/runner\";\nimport { Messages } from \"@lib/ui\";\n\nimport { CLIError } from \"@utils/errors\";\nimport { getCwd } from \"@utils/path\";\nimport { withSpinner } from \"@utils/spinner\";\n\nimport { type PackageManagerCommands } from \"./package-manager-commands\";\n\nexport class PackageManager {\n constructor(\n public readonly name: string,\n private readonly commands: PackageManagerCommands,\n private readonly runner: Runner,\n ) {}\n\n public async install(directory: string): Promise<boolean> {\n const args = [this.commands.install, this.commands.silentFlag];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n Messages.PACKAGE_MANAGER_INSTALLATION_IN_PROGRESS,\n Messages.PACKAGE_MANAGER_INSTALLATION_SUCCEED(),\n Messages.PACKAGE_MANAGER_INSTALLATION_FAILED(this.formatFailCommand([this.commands.install])),\n );\n\n return result.success;\n }\n\n public async addProduction(directory: string, dependencies: string[]): Promise<boolean> {\n return this.addDependencies(this.commands.saveFlag, directory, dependencies);\n }\n\n public async addDevelopment(directory: string, dependencies: string[]): Promise<boolean> {\n return this.addDependencies(this.commands.saveDevFlag, directory, dependencies);\n }\n\n public async build(\n name: string,\n directory: string,\n entry: string,\n output: string,\n flags: string[] = [],\n watch = false,\n ): Promise<boolean> {\n this.assertSupports(\"build\");\n\n const message = watch\n ? Messages.BUILD_PART_WATCH_IN_PROGRESS(name)\n : Messages.BUILD_PART_IN_PROGRESS(name);\n\n const args = [\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.commands.build!,\n this.commands.silentFlag,\n entry,\n \"--outdir\",\n output,\n ...flags,\n ];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n message,\n Messages.BUILD_PART_SUCCESS(name),\n Messages.BUILD_PART_FAILED(name, this.formatFailCommand(args)),\n );\n\n return result.success;\n }\n\n public async run(\n name: string,\n directory: string,\n script: string,\n params: string[],\n env: Record<string, string> = {},\n flags: string[] = [],\n silent = false,\n ): Promise<boolean> {\n console.info(Messages.START_PART_IN_PROGRESS(name));\n\n try {\n const args = this.buildRunArgs(script, params, flags, silent);\n await this.exec(args, directory, {\n env,\n listeners: {\n onStdout: createStdoutLogger(name),\n onStderr: createStderrLogger(name),\n },\n });\n console.info(Messages.START_PART_SUCCESS(name));\n return true;\n } catch {\n console.error(red(Messages.START_PART_FAILED(name)));\n return false;\n }\n }\n\n public async runFile(\n name: string,\n directory: string,\n script: string,\n params: string[],\n env: Record<string, string> = {},\n flags: string[] = [],\n silent = false,\n ): Promise<boolean> {\n console.info(Messages.START_PART_IN_PROGRESS(name));\n\n try {\n const args = this.buildRunFileArgs(script, params, flags, silent);\n await this.exec(args, directory, {\n env,\n listeners: {\n onStdout: createStdoutLogger(name),\n onStderr: createStderrLogger(name),\n },\n });\n console.info(Messages.START_PART_SUCCESS(name));\n return true;\n } catch {\n console.error(red(Messages.START_PART_FAILED(name)));\n return false;\n }\n }\n\n public async runDev(\n directory: string,\n command: string,\n env: Record<string, string> = {},\n flags: string[] = [],\n collect = true,\n ): Promise<boolean> {\n try {\n const base = [this.commands.exec, command];\n if (this.commands.runArgsFlag) base.push(this.commands.runArgsFlag);\n await this.exec([...base, ...flags], directory, { collect, env });\n return true;\n } catch {\n return false;\n }\n }\n\n private async addDependencies(\n saveFlag: string,\n directory: string,\n dependencies: string[],\n ): Promise<boolean> {\n if (!dependencies.length) {\n this.logEmpty(Messages.PACKAGE_MANAGER_INSTALLATION_NOTHING);\n return true;\n }\n\n const args = [this.commands.add, saveFlag, ...dependencies];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n Messages.PACKAGE_MANAGER_INSTALLATION_IN_PROGRESS,\n Messages.PACKAGE_MANAGER_INSTALLATION_SUCCEED(),\n Messages.PACKAGE_MANAGER_INSTALLATION_FAILED(this.formatFailCommand(args)),\n );\n\n return result.success;\n }\n\n private assertSupports(feature: keyof PackageManagerCommands): void {\n if (!this.commands[feature]) {\n throw new CLIError(`Package manager \"${this.name}\" does not support \"${feature}\"`);\n }\n }\n\n private buildRunArgs(\n script: string,\n params: string[],\n flags: string[],\n silent: boolean,\n ): string[] {\n const args = [...flags, this.commands.run];\n if (silent) args.push(this.commands.silentFlag);\n args.push(script);\n if (params.length === 0) return args;\n if (this.commands.runArgsFlag) args.push(this.commands.runArgsFlag);\n return args.concat(params);\n }\n\n private buildRunFileArgs(\n script: string,\n params: string[],\n flags: string[],\n silent: boolean,\n ): string[] {\n if (!this.commands.runFile) throw new CLIError(\"Package manager does not support runFile\");\n const args = [...flags, this.commands.runFile];\n if (silent) args.push(this.commands.silentFlag);\n args.push(script);\n if (params.length === 0) return args;\n if (this.commands.runArgsFlag) args.push(this.commands.runArgsFlag);\n return args.concat(params);\n }\n\n private exec(\n args: string[],\n directory: string,\n options: {\n collect?: boolean;\n env?: Record<string, string>;\n listeners?: RunOptions[\"listeners\"];\n onFail?: () => void;\n } = {},\n ): Promise<string | null> {\n return this.runner.run(args, {\n collect: options.collect ?? true,\n cwd: getCwd(directory),\n env: options.env,\n listeners: options.listeners,\n onFail: options.onFail,\n });\n }\n\n private formatFailCommand(args: string[]): string {\n return this.runner.fullCommand(args);\n }\n\n private logEmpty(message: string): void {\n console.info();\n console.info(message);\n console.info();\n }\n}\n","import { red } from \"ansis\";\nimport { type ChildProcess, type SpawnOptions, spawn } from \"child_process\";\nimport * as process from \"node:process\";\n\nexport interface RunOptions {\n collect?: boolean;\n cwd?: string;\n env?: Record<string, string>;\n listeners?: RunnerListeners;\n onFail?: () => void;\n}\n\nexport interface RunnerListeners {\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n}\n\nexport class Runner {\n constructor(\n private readonly binary: string,\n private readonly baseArgs: string[] = [],\n ) {}\n\n public async run(args: string[], options: RunOptions = {}): Promise<string | null> {\n const { collect = false, cwd = process.cwd(), env, listeners, onFail } = options;\n const spawnOpts = this.buildSpawnOptions(collect, cwd, env);\n const fullArgs = [...this.baseArgs, ...args];\n\n return new Promise<string | null>((resolve, reject) => {\n const child = spawn(`${this.binary} ${fullArgs.join(\" \")}`, spawnOpts);\n const output = this.attachOutputHandlers(child, listeners);\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(this.formatOutput(output, collect));\n } else {\n this.handleFailure(output, fullArgs, onFail);\n reject(this.createError(fullArgs, code));\n }\n });\n });\n }\n\n public fullCommand(args: string[]): string {\n return [this.binary, ...this.baseArgs, ...args].join(\" \");\n }\n\n private buildSpawnOptions(\n collect: boolean,\n cwd: string,\n env?: Record<string, string>,\n ): SpawnOptions {\n return {\n cwd,\n stdio: collect ? \"pipe\" : \"inherit\",\n shell: true,\n env: { ...process.env, ...env },\n };\n }\n\n private attachOutputHandlers(child: ChildProcess, listeners?: RunnerListeners): string[] {\n const output: string[] = [];\n const defaultHandler = (data: Buffer) => output.push(data.toString().replace(/\\r\\n|\\n/, \"\"));\n\n child.stdout?.on(\"data\", listeners?.onStdout ?? defaultHandler);\n child.stderr?.on(\"data\", listeners?.onStderr ?? defaultHandler);\n\n return output;\n }\n\n private formatOutput(output: string[], collect: boolean): string | null {\n return collect && output.length ? output.join(\"\\n\") : null;\n }\n\n private handleFailure(output: string[], args: string[], onFail?: () => void): void {\n if (onFail) onFail();\n this.logFailedCommand(args);\n this.logCapturedOutput(output);\n }\n\n private logFailedCommand(args: string[]): void {\n console.error(red(`\\nFailed to execute command: ${this.binary} ${args.join(\" \")}`));\n }\n\n private logCapturedOutput(output: string[]): void {\n if (output.length) {\n console.error();\n console.error(output.join(\"\\n\"));\n console.error();\n }\n }\n\n private createError(args: string[], code: number | null): Error {\n return new Error(`Command \"${this.binary} ${args.join(\" \")}\" exited with code ${code}`);\n }\n}\n","import { CLIError } from \"@utils/errors\";\nimport { getModulePath, resolveCLINodeBinaryPath } from \"@utils/path\";\n\nimport { Runner } from \"./runner\";\n\nexport class RunnerFactory {\n public static create(binary: string, args?: string[]): Runner {\n return new Runner(binary, args);\n }\n\n public static createLocal(binary: string, args?: string[]): Runner {\n return new Runner(resolveCLINodeBinaryPath(binary), args);\n }\n\n public static createSchematic(): Runner {\n const binaryPath = this.resolveSchematicBinary();\n return new Runner(\"node\", [`\"${binaryPath}\"`]);\n }\n\n private static resolveSchematicBinary(): string {\n try {\n return getModulePath(\"@angular-devkit/schematics-cli/bin/schematics.js\");\n } catch {\n throw new CLIError(\"'schematics' binary path could not be found!\");\n }\n }\n}\n","export enum PackageManagerName {\n BUN = \"bun\",\n LOCAL_BUN = \"local_bun\",\n NPM = \"npm\",\n PNPM = \"pnpm\",\n YARN = \"yarn\",\n}\n","import { type PackageManagerCommands } from \"./package-manager-commands\";\nimport { PackageManagerName } from \"./package-manager-name\";\n\nexport const PM_CONFIGS: Record<\n PackageManagerName,\n { binary: string; commands: PackageManagerCommands }\n> = {\n [PackageManagerName.BUN]: {\n binary: \"bun\",\n commands: {\n install: \"install\",\n add: \"add\",\n update: \"update\",\n remove: \"remove\",\n exec: \"exec\",\n run: \"run\",\n saveFlag: \"--save\",\n saveDevFlag: \"--dev\",\n silentFlag: \"--silent\",\n },\n },\n [PackageManagerName.LOCAL_BUN]: {\n binary: \"bun\",\n commands: {\n install: \"install\",\n add: \"add\",\n update: \"update\",\n remove: \"remove\",\n exec: \"exec\",\n run: \"run\",\n build: \"build\",\n runFile: \"run\",\n saveFlag: \"--save\",\n saveDevFlag: \"--dev\",\n silentFlag: \"--silent\",\n },\n },\n [PackageManagerName.NPM]: {\n binary: \"npm\",\n commands: {\n install: \"install\",\n add: \"install\",\n update: \"update\",\n remove: \"uninstall\",\n exec: \"exec\",\n run: \"run\",\n runArgsFlag: \"--\",\n saveFlag: \"--save\",\n saveDevFlag: \"--save-dev\",\n silentFlag: \"--silent\",\n },\n },\n [PackageManagerName.PNPM]: {\n binary: \"pnpm\",\n commands: {\n install: \"install\",\n add: \"add\",\n update: \"update\",\n remove: \"remove\",\n exec: \"exec\",\n run: \"run\",\n saveFlag: \"-P\",\n saveDevFlag: \"-D\",\n silentFlag: \"--silent\",\n },\n },\n [PackageManagerName.YARN]: {\n binary: \"yarn\",\n commands: {\n install: \"install\",\n add: \"add\",\n update: \"update\",\n remove: \"remove\",\n exec: \"exec\",\n run: \"run\",\n saveFlag: \"\",\n saveDevFlag: \"-D\",\n silentFlag: \"--silent\",\n },\n },\n};\n","import fs from \"fs\";\nimport { resolve } from \"path\";\n\nimport { RunnerFactory } from \"@lib/runner\";\n\nimport { CLIError } from \"@utils/errors\";\n\nimport { PackageManager } from \"./package-manager\";\nimport { PM_CONFIGS } from \"./package-manager-configs\";\nimport { PackageManagerName } from \"./package-manager-name\";\n\nconst LOCK_FILE_MAP: Record<string, PackageManagerName> = {\n \"bun.lock\": PackageManagerName.BUN,\n \"package-lock.json\": PackageManagerName.NPM,\n \"pnpm-lock.yaml\": PackageManagerName.PNPM,\n \"yarn.lock\": PackageManagerName.YARN,\n};\n\nexport class PackageManagerFactory {\n public static create(name: PackageManagerName | string): PackageManager {\n const config = PM_CONFIGS[name as PackageManagerName];\n if (!config) {\n throw new CLIError(`Package manager '${name}' is not managed/supported.`);\n }\n\n const runner = this.createRunner(name as PackageManagerName, config.binary);\n return new PackageManager(name, config.commands, runner);\n }\n\n public static async find(directory = \".\"): Promise<PackageManager> {\n const detected = await this.detectFromLockFile(directory);\n return this.create(detected);\n }\n\n private static createRunner(name: PackageManagerName, binary: string) {\n if (name === PackageManagerName.LOCAL_BUN) {\n return RunnerFactory.createLocal(\"bun\");\n }\n return RunnerFactory.create(binary);\n }\n\n private static async detectFromLockFile(directory: string): Promise<PackageManagerName> {\n try {\n const files = await fs.promises.readdir(resolve(directory));\n for (const [lockFile, pmName] of Object.entries(LOCK_FILE_MAP)) {\n if (files.includes(lockFile)) return pmName;\n }\n } catch {\n // directory unreadable, fall through to default\n }\n return PackageManagerName.NPM;\n }\n}\n","import fs from \"fs\";\nimport { join } from \"path\";\n\nimport { FileSystemError } from \"@utils/errors\";\n\nexport const copyFiles = (from: string, to: string) => {\n if (!fs.existsSync(from)) return;\n if (!fs.existsSync(to)) throw new FileSystemError(\"directory not found\", to);\n fs.readdirSync(from, { recursive: true }).forEach((file) => {\n fs.copyFileSync(join(from, file.toString()), join(to, file.toString()));\n });\n};\n\nexport const resetFolder = (folder: string) => {\n if (fs.existsSync(folder)) fs.rmSync(folder, { recursive: true, force: true });\n fs.mkdirSync(folder, { recursive: true });\n};\n","import { red } from \"ansis\";\n\nimport { getErrorMessage } from \"@utils/errors\";\n\nexport const runSafe = async <T>(fn: () => Promise<T>, fallback?: T): Promise<T | undefined> => {\n try {\n return await fn();\n } catch (error: unknown) {\n const msg = getErrorMessage(error);\n if (msg) console.error(red(msg));\n return fallback;\n }\n};\n","import { Expose, Type } from \"class-transformer\";\nimport { IsBoolean, IsEnum, IsNotEmpty, IsPort, IsString, ValidateNested } from \"class-validator\";\n\nexport class BuildConfig {\n @Expose()\n @IsString()\n @IsNotEmpty()\n entry!: string;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n staticDir!: string;\n}\n\nexport class EditorConfig {\n @Expose()\n @IsString()\n @IsNotEmpty()\n entry!: string;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n save!: string;\n}\n\nexport class DirsConfig {\n @Expose()\n @IsString()\n @IsNotEmpty()\n components!: string;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n systems!: string;\n}\n\nexport class ClientConfig {\n @Expose()\n @IsBoolean()\n enable!: boolean;\n\n @Expose()\n @IsPort()\n port!: string;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n outDir!: string;\n\n @Expose()\n @Type(() => BuildConfig)\n @ValidateNested()\n build!: BuildConfig;\n\n @Expose()\n @Type(() => EditorConfig)\n @ValidateNested()\n editor!: EditorConfig;\n\n @Expose()\n @Type(() => DirsConfig)\n @ValidateNested()\n dirs!: DirsConfig;\n}\n\nexport class ServerConfig {\n @Expose()\n @IsBoolean()\n enable!: boolean;\n\n @Expose()\n @IsString()\n @IsNotEmpty()\n outDir!: string;\n\n @Expose()\n @Type(() => BuildConfig)\n @ValidateNested()\n build!: BuildConfig;\n\n @Expose()\n @Type(() => EditorConfig)\n @ValidateNested()\n editor!: EditorConfig;\n\n @Expose()\n @Type(() => DirsConfig)\n @ValidateNested()\n dirs!: DirsConfig;\n}\n\nexport class SslConfig {\n @Expose()\n @IsBoolean()\n enable!: boolean;\n\n @Expose()\n @IsString()\n cert!: string;\n\n @Expose()\n @IsString()\n key!: string;\n}\n\nexport class Config {\n @Expose()\n @IsString()\n @IsNotEmpty()\n name!: string;\n\n @Expose()\n @IsEnum([\"ts\", \"js\"])\n language!: \"ts\" | \"js\";\n\n @Expose()\n @IsBoolean()\n initFunctions!: boolean;\n\n @Expose()\n @Type(() => ClientConfig)\n @ValidateNested()\n client!: ClientConfig;\n\n @Expose()\n @Type(() => ServerConfig)\n @ValidateNested()\n server!: ServerConfig;\n\n @Expose()\n @Type(() => SslConfig)\n @ValidateNested()\n ssl!: SslConfig;\n}\n","export const CONFIG_FILE_NAME = \"nanoforge.config.json\";\nexport const MANIFEST_FILE_NAME = \"nanoforge.manifest.json\";\nexport const GLOBAL_CONFIG_FILE_NAME = \".nanoforgerc\";\nexport const DEFAULT_DIRECTORY = \".\";\nexport const NANOFORGE_DIR = \".nanoforge\";\nexport const REGISTRY_URL = process.env.REGISTRY_URL;\n","export const isObject = (item: any) => {\n return item && typeof item === \"object\" && !Array.isArray(item);\n};\n\nexport const deepMerge = (target: any, ...sources: [any, ...any[]]): any => {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return deepMerge(target, ...sources);\n};\n\nexport const isEmpty = (target: any) => Object.keys(target).length === 0;\n","import { type Config } from \"./config.type\";\n\nexport const CONFIG_DEFAULTS: Config = {\n name: \"nanoforge-app\",\n language: \"ts\",\n initFunctions: true,\n ssl: {\n enable: false,\n cert: \"\",\n key: \"\",\n },\n client: {\n enable: true,\n port: \"3000\",\n outDir: \".nanoforge/client\",\n build: {\n entry: \"client/main.ts\",\n staticDir: \"client/static\",\n },\n editor: {\n entry: \".nanoforge/editor/client/main.ts\",\n save: \".nanoforge/client.save.json\",\n },\n dirs: {\n components: \"client/components\",\n systems: \"client/systems\",\n },\n },\n server: {\n enable: false,\n outDir: \".nanoforge/server\",\n build: {\n entry: \"server/main.ts\",\n staticDir: \"server/static\",\n },\n editor: {\n entry: \".nanoforge/editor/server/main.ts\",\n save: \".nanoforge/server.save.json\",\n },\n dirs: {\n components: \"server/components\",\n systems: \"server/systems\",\n },\n },\n};\n","import { plainToInstance } from \"class-transformer\";\nimport { validate } from \"class-validator\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { CLIError, ConfigNotFoundError, FileSystemError } from \"@utils/errors\";\nimport { deepMerge } from \"@utils/object\";\n\nimport { CONFIG_DEFAULTS } from \"./config-defaults\";\nimport { Config } from \"./config.type\";\n\nlet config: Config | null;\n\nconst getConfigPath = (directory: string, name?: string) => {\n if (name) {\n return join(directory, name);\n } else {\n for (const n of [CONFIG_FILE_NAME]) {\n const path = join(directory, n);\n if (existsSync(path)) return path;\n }\n throw new ConfigNotFoundError(join(directory, CONFIG_FILE_NAME));\n }\n};\n\nexport const loadConfig = async (\n directory: string,\n name?: string,\n noThrow: boolean = false,\n): Promise<Config> => {\n if (config) return config;\n\n let rawData;\n\n const path = getConfigPath(directory, name);\n try {\n rawData = deepMerge(CONFIG_DEFAULTS, JSON.parse(readFileSync(path, \"utf-8\")));\n } catch {\n rawData = noThrow ? CONFIG_DEFAULTS : null;\n }\n if (!rawData) throw new FileSystemError(\"read config file\", path);\n\n const data = plainToInstance(Config, rawData, {\n excludeExtraneousValues: true,\n });\n const errors = await validate(data);\n if (errors.length > 0)\n throw new CLIError(`Invalid config:\\n${errors.toString().replace(/,/g, \"\\n\")}`);\n\n config = data;\n return config;\n};\n","import { type Config, loadConfig } from \"@lib/config\";\nimport { type Input, getConfigInput } from \"@lib/input\";\n\nexport const getConfig = (inputs: Input, dir: string, noThrow?: boolean): Promise<Config> => {\n return loadConfig(dir, getConfigInput(inputs), noThrow);\n};\n","import { type Input } from \"@lib/input\";\nimport { Prefixes } from \"@lib/ui\";\n\nimport { handleActionError } from \"@utils/errors\";\n\nexport interface HandleResult {\n success?: boolean;\n keepAlive?: boolean;\n error?: unknown;\n}\n\nexport abstract class AbstractAction {\n protected abstract startMessage: string;\n protected abstract successMessage: string;\n protected abstract failureMessage: string;\n\n public abstract handle(\n args?: Input,\n options?: Input,\n extraFlags?: string[],\n ): Promise<HandleResult>;\n\n public async run(args?: Input, options?: Input, extraFlags?: string[]): Promise<void> {\n this.logStart();\n\n try {\n const result = await this.handle(args, options, extraFlags);\n this.resolveResult(result);\n } catch (error: unknown) {\n handleActionError(this.failureMessage, error);\n }\n }\n\n private logStart(): void {\n console.info();\n console.info(`${Prefixes.INFO} ${this.startMessage}`);\n console.info();\n }\n\n private resolveResult(result: HandleResult): void {\n const success = result?.success !== false;\n const keepAlive = result?.keepAlive === true;\n\n if (keepAlive) return;\n\n console.info();\n\n if (!success) {\n handleActionError(this.failureMessage, result.error);\n process.exit(1);\n }\n\n if (this.successMessage) console.info(this.successMessage);\n process.exit(0);\n }\n}\n","import { watch } from \"chokidar\";\nimport { dirname, join } from \"node:path\";\n\nimport { type Config } from \"@lib/config\";\nimport {\n type Input,\n getDirectoryInput,\n getEditorInput,\n getStringInputWithDefault,\n getWatchInput,\n} from \"@lib/input\";\nimport { PackageManagerFactory, PackageManagerName } from \"@lib/package-manager\";\nimport { Messages } from \"@lib/ui\";\n\nimport { copyFiles, resetFolder } from \"@utils/files\";\nimport { getCwd } from \"@utils/path\";\nimport { runSafe } from \"@utils/run-safe\";\n\nimport { getConfig } from \"~/action/common/config\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\ninterface BuildTarget {\n name: string;\n entry: string;\n static: string;\n output: string;\n platform: \"browser\" | \"node\";\n}\n\nexport class BuildAction extends AbstractAction {\n protected startMessage = Messages.BUILD_START;\n protected successMessage = Messages.BUILD_SUCCESS;\n protected failureMessage = Messages.BUILD_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const config = await getConfig(options, directory);\n const isEditor = getEditorInput(options);\n const isWatch = getWatchInput(options);\n\n const targets = this.resolveTargets(config, options, isEditor);\n const results = await this.buildAll(targets, directory, isWatch);\n\n if (isWatch) {\n return this.enterWatchMode();\n }\n\n return { success: results.every(Boolean) };\n }\n\n private resolveTargets(config: Config, options: Input, isEditor: boolean): BuildTarget[] {\n const targets: BuildTarget[] = [];\n\n if (config.client.enable)\n targets.push(\n this.createTarget(\n \"Client\",\n\n \"browser\",\n getStringInputWithDefault(\n options,\n \"clientEntry\",\n !isEditor ? config.client.build.entry : config.client.editor.entry,\n ),\n getStringInputWithDefault(options, \"clientStaticDir\", config.client.build.staticDir),\n getStringInputWithDefault(options, \"clientOutDir\", config.client.outDir),\n ),\n );\n if (config.server.enable)\n targets.push(\n this.createTarget(\n \"Server\",\n \"node\",\n getStringInputWithDefault(\n options,\n \"serverEntry\",\n !isEditor ? config.server.build.entry : config.server.editor.entry,\n ),\n getStringInputWithDefault(options, \"serverStaticDir\", config.server.build.staticDir),\n getStringInputWithDefault(options, \"serverOutDir\", config.server.outDir),\n ),\n );\n\n return targets;\n }\n\n private createTarget(\n name: string,\n platform: \"browser\" | \"node\",\n entryFile: string,\n staticDir: string,\n outDir: string,\n ): BuildTarget {\n return {\n name,\n entry: entryFile,\n static: staticDir,\n output: outDir,\n platform,\n };\n }\n\n private async buildAll(\n targets: BuildTarget[],\n directory: string,\n isWatch: boolean,\n ): Promise<boolean[]> {\n const results: boolean[] = [];\n for (const target of targets) {\n const result = await this.buildTarget(target, directory, isWatch);\n results.push(result);\n }\n return results;\n }\n\n private async buildTarget(\n target: BuildTarget,\n directory: string,\n isWatch: boolean,\n ): Promise<boolean> {\n const packageManager = PackageManagerFactory.create(PackageManagerName.LOCAL_BUN);\n\n const executeBuild = (rebuild = false) =>\n runSafe(() => {\n this.resetOut(target.output, directory);\n this.copyFiles(target, directory);\n return packageManager.build(\n target.name,\n directory,\n target.entry,\n target.output,\n [\"--asset-naming\", \"[name].[ext]\", \"--target\", target.platform],\n rebuild,\n );\n }, false);\n\n if (isWatch) {\n this.watchDirectory(directory, target.entry, () => executeBuild(true));\n }\n\n const result = await executeBuild();\n return result !== false;\n }\n\n private watchDirectory(directory: string, entry: string, onChange: () => void): void {\n const watchPath = dirname(join(getCwd(directory), entry));\n watch(watchPath).on(\"change\", onChange);\n }\n\n private enterWatchMode(): HandleResult {\n console.info();\n console.info(Messages.BUILD_WATCH_START);\n console.info();\n return { keepAlive: true };\n }\n\n private resetOut(outDir: string, directory: string): void {\n resetFolder(getCwd(join(directory, outDir)));\n }\n\n private copyFiles(target: BuildTarget, directory: string): void {\n const from = getCwd(join(directory, target.static));\n const to = getCwd(join(directory, target.output));\n copyFiles(from, to);\n }\n}\n","export enum Collection {\n NANOFORGE = \"@nanoforge-dev/schematics\",\n}\n","import { type Runner } from \"@lib/runner/runner\";\n\nimport { getCwd } from \"@utils/path\";\nimport { getModulePath } from \"@utils/path\";\n\nimport { type Schematic } from \"./nanoforge.collection\";\nimport { type SchematicOption } from \"./schematic.option\";\n\nexport abstract class AbstractCollection {\n protected constructor(\n protected collection: string,\n protected runner: Runner,\n protected cwd?: string,\n ) {}\n\n public async execute(\n name: string,\n options: SchematicOption[],\n flags?: string[],\n onFail?: () => void,\n ): Promise<void> {\n const command = this.buildCommandLine(name, options, flags);\n await this.runner.run(command, {\n collect: true,\n cwd: this.cwd ? getCwd(this.cwd) : undefined,\n onFail,\n });\n }\n\n public abstract getSchematics(): Schematic[];\n\n private buildCommandLine(\n name: string,\n options: SchematicOption[],\n flags: string[] = [\"--no-dry-run\", \"--allow-private\", \"--no-debug\"],\n ): string[] {\n return [\n ...flags,\n `'${getModulePath(this.collection + \"/collection.json\")}:${name}'`,\n ...this.serializeOptions(options),\n ];\n }\n\n private serializeOptions(options: SchematicOption[]): string[] {\n return options.flatMap((option) => option.toCommandString());\n }\n}\n","import { type Runner } from \"@lib/runner/runner\";\n\nimport { CLIError } from \"@utils/errors\";\n\nimport { AbstractCollection } from \"./abstract.collection\";\nimport { type SchematicOption } from \"./schematic.option\";\n\nexport interface Schematic {\n name: string;\n alias: string;\n description: string;\n}\n\nexport class NanoforgeCollection extends AbstractCollection {\n private static schematics: Schematic[] = [\n {\n name: \"application\",\n alias: \"application\",\n description: \"Generate a new application\",\n },\n {\n name: \"configuration\",\n alias: \"config\",\n description: \"Generate a CLI configuration file\",\n },\n {\n name: \"part-base\",\n alias: \"base\",\n description: \"Generate a NanoForge Part Base\",\n },\n {\n name: \"part-main\",\n alias: \"main\",\n description: \"Generate a NanoForge Part Main file\",\n },\n {\n name: \"docker\",\n alias: \"docker\",\n description: \"Generate a Dockerfile for the application\",\n },\n {\n name: \"component\",\n alias: \"component\",\n description: \"Generate a Component for an application\",\n },\n {\n name: \"system\",\n alias: \"system\",\n description: \"Generate a System for an application\",\n },\n ];\n\n constructor(runner: Runner, cwd?: string) {\n super(\"@nanoforge-dev/schematics\", runner, cwd);\n }\n\n public override async execute(\n name: string,\n options: SchematicOption[],\n flags?: string[],\n failSpinner?: () => void,\n ) {\n const schematic: string = this.validate(name);\n await super.execute(schematic, options, flags, failSpinner);\n }\n\n public getSchematics(): Schematic[] {\n return NanoforgeCollection.schematics;\n }\n\n private validate(name: string) {\n const schematic = NanoforgeCollection.schematics.find(\n (s) => s.name === name || s.alias === name,\n );\n\n if (schematic === undefined || schematic === null) {\n throw new CLIError(\n `Invalid schematic \"${name}\". Please, ensure that \"${name}\" exists in this collection.`,\n );\n }\n return schematic.name;\n }\n}\n","import { RunnerFactory } from \"@lib/runner\";\n\nimport { CLIError } from \"@utils/errors\";\n\nimport { type AbstractCollection } from \"./abstract.collection\";\nimport { Collection } from \"./collection\";\nimport { NanoforgeCollection } from \"./nanoforge.collection\";\n\nexport class CollectionFactory {\n public static create(collection: Collection | string, directory: string): AbstractCollection {\n const schematicRunner = RunnerFactory.createSchematic();\n\n if (collection === Collection.NANOFORGE) {\n return new NanoforgeCollection(schematicRunner, directory);\n }\n throw new CLIError(`Unknown collection: ${collection}`);\n }\n}\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n\nexport const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n","import { toKebabCase } from \"@utils/formatting\";\n\nexport class SchematicOption {\n constructor(\n private name: string,\n private value: boolean | string | Array<SchematicOption>,\n ) {}\n\n get normalizedName() {\n return toKebabCase(this.name);\n }\n\n public toCommandString(prefix?: string): string[] {\n const normalizedName = `${prefix ? `${prefix}.` : \"\"}${this.normalizedName}`;\n if (typeof this.value === \"string\") {\n if (this.name === \"name\") {\n return [`--${normalizedName}=${this.format()}`];\n } else if (this.name === \"version\" || this.name === \"path\") {\n return [`--${normalizedName}=${this.value}`];\n } else {\n return [`--${normalizedName}=\"${this.value}\"`];\n }\n } else if (typeof this.value === \"boolean\") {\n const str = normalizedName;\n return this.value ? [`--${str}=true`] : [`--${str}=false`];\n } else if (Array.isArray(this.value)) {\n return this.value.reduce(\n (old: string[], option: SchematicOption) => [\n ...old,\n ...option.toCommandString(normalizedName),\n ],\n [],\n );\n } else {\n return [`--${normalizedName}=${this.value}`];\n }\n }\n\n private format() {\n return toKebabCase(this.value as string)\n .split(\"\")\n .reduce((content, char) => {\n if (char === \"(\" || char === \")\" || char === \"[\" || char === \"]\") {\n return `${content}\\\\${char}`;\n }\n return `${content}${char}`;\n }, \"\");\n }\n}\n","import { watch } from \"chokidar\";\n\nimport { type AbstractCollection, SchematicOption } from \"@lib/schematics\";\nimport { Messages } from \"@lib/ui\";\nimport { getSpinner } from \"@lib/ui/spinner\";\n\nexport const executeSchematic = async (\n name: string,\n collection: AbstractCollection,\n schematicName: string,\n options: object,\n fileToWatch?: string,\n): Promise<void> => {\n const execute = async (isRebuild = false) => {\n const message = isRebuild\n ? Messages.SCHEMATIC_WATCH_IN_PROGRESS(name)\n : Messages.SCHEMATIC_IN_PROGRESS(name);\n const spinner = getSpinner(message);\n spinner.start();\n\n await collection.execute(schematicName, mapSchematicOptions(options), undefined, () =>\n spinner.fail(Messages.SCHEMATIC_FAILED(name)),\n );\n\n spinner.succeed(Messages.SCHEMATIC_SUCCESS(name));\n };\n\n if (fileToWatch) {\n watch(fileToWatch).on(\"change\", () => execute(true));\n }\n\n await execute();\n};\n\nexport const mapSchematicOptions = (inputs: object): SchematicOption[] => {\n return Object.entries(inputs).reduce((acc: SchematicOption[], [key, value]) => {\n if (value === undefined) return acc;\n\n const mapped =\n typeof value === \"object\"\n ? new SchematicOption(key, mapSchematicOptions(value))\n : new SchematicOption(key, value);\n\n acc.push(mapped);\n return acc;\n }, []);\n};\n","import {\n type Input,\n getCreateNameInputOrAsk,\n getCreateTypeInput,\n getDirectoryInput,\n getPathInputWithDefault,\n getServerInput,\n} from \"@lib/input\";\nimport { Collection, CollectionFactory } from \"@lib/schematics\";\nimport { Messages } from \"@lib/ui\";\n\nimport { capitalize } from \"@utils/formatting\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\nimport { getConfig } from \"../common/config\";\nimport { executeSchematic } from \"../common/schematics\";\n\ninterface CreateValues {\n name: string;\n directory: string;\n part: \"client\" | \"server\";\n language: \"ts\" | \"js\";\n}\n\nexport class CreateAction extends AbstractAction {\n protected startMessage = Messages.CREATE_START;\n protected successMessage = Messages.CREATE_SUCCESS;\n protected failureMessage = Messages.CREATE_FAILED;\n\n public async handle(args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const config = await getConfig(options, directory, true);\n\n const type = getCreateTypeInput(args);\n\n const name = await getCreateNameInputOrAsk(options);\n const isServer = getServerInput(options);\n const path = getPathInputWithDefault(\n options,\n config[isServer ? \"server\" : \"client\"].dirs[type === \"component\" ? \"components\" : \"systems\"],\n );\n\n await this.generateElement(directory, type, {\n name,\n directory: path,\n part: isServer ? \"server\" : \"client\",\n language: config.language,\n });\n\n return {};\n }\n\n private async generateElement(\n directory: string,\n type: \"component\" | \"system\",\n values: CreateValues,\n ): Promise<void> {\n const collection = CollectionFactory.create(Collection.NANOFORGE, directory);\n await executeSchematic(capitalize(type), collection, type, values);\n }\n}\n","import { type Input, getDevGenerateInput, getDirectoryInput, getEditorInput } from \"@lib/input\";\nimport { PackageManagerFactory } from \"@lib/package-manager\";\nimport { Messages } from \"@lib/ui\";\n\nimport { runSafe } from \"@utils/run-safe\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class DevAction extends AbstractAction {\n protected startMessage = Messages.DEV_START;\n protected successMessage = Messages.DEV_SUCCESS;\n protected failureMessage = Messages.DEV_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const generate = getDevGenerateInput(options);\n\n const editor = getEditorInput(options);\n const tasks = this.buildTaskList(directory, generate, editor);\n await Promise.all(tasks);\n\n return { keepAlive: true };\n }\n\n private buildTaskList(directory: string, generate: boolean, editor: boolean): Promise<void>[] {\n const tasks: Promise<void>[] = [];\n const extraFlags = editor ? [\"--editor\"] : [];\n\n if (generate) {\n tasks.push(this.runSubCommand(\"generate\", directory, { silent: true, extraFlags }));\n }\n\n tasks.push(this.runSubCommand(\"build\", directory, { silent: true, extraFlags }));\n tasks.push(this.runSubCommand(\"start\", directory, { silent: false }));\n\n return tasks;\n }\n\n private async runSubCommand(\n command: string,\n directory: string,\n options: { silent: boolean; extraFlags?: string[] },\n ): Promise<void> {\n await runSafe(async () => {\n const packageManager = await PackageManagerFactory.find(directory);\n const args = [command, \"--watch\", ...(options.extraFlags ?? [])];\n await packageManager.runDev(directory, \"nf\", {}, args, options.silent);\n });\n }\n}\n","import open from \"open\";\nimport { join } from \"path\";\n\nimport { type Input, getDirectoryInput, getEditorOpenInput, getPathInput } from \"@lib/input\";\nimport { PackageManagerFactory, PackageManagerName } from \"@lib/package-manager\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getModulePath } from \"@utils/path\";\nimport { runSafe } from \"@utils/run-safe\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class EditorAction extends AbstractAction {\n protected startMessage = Messages.EDITOR_START;\n protected successMessage = Messages.EDITOR_SUCCESS;\n protected failureMessage = Messages.EDITOR_FAILED;\n\n public async handle(args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const path = getPathInput(args);\n const shouldOpen = getEditorOpenInput(options, !!path);\n const query = path ? `?projectPath=${encodeURIComponent(path)}` : \"\";\n const url = `http://localhost:3000/load-project${query}`;\n\n console.log(`\\nš Editor running! Open it in your browser: \\x1b[36m${url}\\x1b[0m\\n`);\n\n void this.startEditor(directory);\n if (shouldOpen) await this.openBrowser(url);\n\n return { keepAlive: true };\n }\n\n private async startEditor(directory: string): Promise<void> {\n const editorPath = join(\n getModulePath(\"@nanoforge-dev/editor/package.json\", true),\n \"dist\",\n \"index.js\",\n );\n\n await runSafe(async () => {\n const packageManager = PackageManagerFactory.create(PackageManagerName.LOCAL_BUN);\n await packageManager.run(\"Editor\", directory, editorPath, [], {}, [], true);\n });\n }\n\n private async openBrowser(url: string): Promise<void> {\n await open(url);\n }\n}\n","import { join } from \"node:path\";\n\nimport { type Config } from \"@lib/config\";\nimport { type Input, getDirectoryInput, getEditorInput, getWatchInput } from \"@lib/input\";\nimport { Collection, CollectionFactory } from \"@lib/schematics\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getCwd } from \"@utils/path\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\nimport { getConfig } from \"../common/config\";\nimport { executeSchematic } from \"../common/schematics\";\n\ninterface GenerateValues {\n directory: string;\n language: string;\n initFunctions: boolean;\n}\n\nexport class GenerateAction extends AbstractAction {\n protected startMessage = Messages.GENERATE_START;\n protected successMessage = Messages.GENERATE_SUCCESS;\n protected failureMessage = Messages.GENERATE_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const config = await getConfig(options, directory);\n const isEditor = getEditorInput(options);\n const isWatch = getWatchInput(options);\n\n await this.generateParts(config, directory, isEditor, isWatch);\n\n if (isWatch) {\n return this.enterWatchMode();\n }\n\n return {};\n }\n\n private extractValues(config: Config): GenerateValues {\n return {\n directory: \".\",\n language: config.language,\n initFunctions: config.initFunctions,\n };\n }\n\n private async generateParts(\n config: Config,\n directory: string,\n isEditor: boolean,\n watch: boolean,\n ): Promise<void> {\n const collection = CollectionFactory.create(Collection.NANOFORGE, directory);\n const values = this.extractValues(config);\n\n if (config.client.enable)\n await executeSchematic(\n \"Client main file\",\n collection,\n \"part-main\",\n {\n ...values,\n part: \"client\",\n outFile: !isEditor ? config.client.build.entry : config.client.editor.entry,\n saveFile: config.client.editor.save,\n editor: isEditor,\n },\n watch ? this.watchPath(directory, values.directory, config.client.editor.save) : undefined,\n );\n\n if (config.server.enable)\n await executeSchematic(\n \"Server main file\",\n collection,\n \"part-main\",\n {\n ...values,\n part: \"server\",\n outFile: !isEditor ? config.server.build.entry : config.server.editor.entry,\n saveFile: config.server.editor.save,\n editor: isEditor,\n },\n this.watchPath(directory, values.directory, config.server.editor.save),\n );\n }\n\n private watchPath(directory: string, subDir: string, saveFile: string): string {\n return join(getCwd(directory), subDir, saveFile);\n }\n\n private enterWatchMode(): HandleResult {\n console.info();\n console.info(Messages.GENERATE_WATCH_START);\n console.info();\n return { keepAlive: true };\n }\n}\n","import { type GlobalConfig } from \"./global-config.type\";\n\nexport const GLOBAL_CONFIG_DEFAULTS: GlobalConfig = {};\n","import { read, readUserConfig, write, writeUserConfig } from \"rc9\";\n\nimport { GLOBAL_CONFIG_FILE_NAME } from \"@lib/constants\";\nimport { type DeepPartial } from \"@lib/types\";\n\nimport { deepMerge, isEmpty } from \"@utils/object\";\n\nimport { GLOBAL_CONFIG_DEFAULTS } from \"./global-config-defaults\";\nimport { type GlobalConfig } from \"./global-config.type\";\n\ntype CReader = (options: { name: string; dir?: string }) => GlobalConfig;\n\nexport class GlobalConfigHandler {\n static read(dir?: string): GlobalConfig {\n const dirConfig = this._readConfig(read, false, dir);\n if (dirConfig) return dirConfig;\n const cwdConfig = this._readConfig(read, false, process.cwd());\n if (cwdConfig) return cwdConfig;\n return this._readConfig(readUserConfig, true);\n }\n\n static write(config: DeepPartial<GlobalConfig>, local: boolean = false, dir?: string): void {\n const options = {\n name: GLOBAL_CONFIG_FILE_NAME,\n dir,\n };\n if (local) write(config, options);\n else writeUserConfig(config, options);\n }\n\n private static _readConfig(func: CReader, force: true): GlobalConfig;\n private static _readConfig(func: CReader, force?: false, dir?: string): GlobalConfig | null;\n private static _readConfig(func: CReader, force?: boolean, dir?: string): GlobalConfig | null {\n const res = func({\n name: GLOBAL_CONFIG_FILE_NAME,\n dir,\n });\n if (!force) {\n if (isEmpty(res)) return null;\n }\n return deepMerge(GLOBAL_CONFIG_DEFAULTS, res);\n }\n}\n","export type RequestOptions = Omit<RequestInit, \"body\" | \"method\">;\n\nexport interface MiddlewareParams {\n path: string;\n fullPath: string;\n options: RequestOptions;\n}\n\nexport type FullResponse = Response & { content: any };\n\nexport type MiddlewareNext = (params?: MiddlewareParams) => Promise<FullResponse>;\n\nexport type Middleware = (\n params: MiddlewareParams,\n next: MiddlewareNext,\n) => Promise<FullResponse | undefined> | undefined;\n\ntype BaseRequest = (path: string, options: RequestOptions) => Promise<FullResponse>;\n\nexport class HttpClient {\n private readonly _baseUrl: string;\n private readonly _baseOptions: RequestOptions;\n private readonly _middlewares: Middleware[];\n\n constructor(baseUrl: string, options?: RequestOptions) {\n this._baseUrl = baseUrl;\n this._baseOptions = options ?? {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n };\n this._middlewares = [];\n }\n\n get(path: string, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"GET\",\n });\n });\n }\n\n post(path: string, body?: string | FormData, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"POST\",\n body: body,\n });\n });\n }\n\n put(path: string, body?: string | FormData, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"PUT\",\n body: body,\n });\n });\n }\n\n patch(path: string, body?: string | FormData, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, async (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"PATCH\",\n body: body,\n });\n });\n }\n\n delete(path: string, options?: RequestOptions): Promise<FullResponse> {\n return this._applyMiddlewares(path, options, (newPath, newOptions) => {\n return this._request(newPath, {\n ...newOptions,\n method: \"DELETE\",\n body: \"{}\",\n }) as Promise<FullResponse>;\n });\n }\n\n useMiddlewares(...middlewares: Middleware[]): HttpClient {\n for (const middleware of middlewares) this._middlewares.push(middleware);\n return this;\n }\n\n private async _request(path: string, request: RequestInit): Promise<FullResponse> {\n const res = (await fetch(path, request)) as FullResponse;\n res.content = null;\n return res;\n }\n\n private _applyMiddlewares(\n path: string,\n options: RequestOptions | undefined,\n callback: BaseRequest,\n ): Promise<FullResponse> {\n const baseParams = {\n path,\n fullPath: this._getUrl(path),\n options: {\n ...this._baseOptions,\n ...options,\n headers: {\n ...this._baseOptions.headers,\n ...options?.headers,\n },\n },\n };\n const middlewares = this._middlewares.slice();\n let response: FullResponse;\n\n const execution = async (params?: MiddlewareParams): Promise<FullResponse> => {\n if (!params) params = baseParams;\n\n const middleware = middlewares.shift();\n\n if (!middleware) response = (await callback(params.fullPath, params.options)) as FullResponse;\n else response = (await middleware(params, execution)) ?? response;\n\n return response;\n };\n\n return execution(baseParams);\n }\n\n private _getUrl(path: string): string {\n return `${this._baseUrl}${path}`;\n }\n}\n","import { ApiRequestError } from \"@utils/errors\";\n\nimport type { HttpClient, RequestOptions } from \"./http-client\";\n\nexport class Repository {\n private readonly _client: HttpClient;\n\n constructor(client: HttpClient) {\n this._client = client;\n }\n\n get<R extends object = object>(path: string, options?: RequestOptions): Promise<R> {\n return this.runRequest(\"get\", path, options);\n }\n\n getFile(path: string, options?: RequestOptions): Promise<Blob> {\n return this.runFileRequest(\"get\", path, options);\n }\n\n post<R extends object = object, I extends object = object>(\n path: string,\n body?: I | FormData,\n options?: RequestOptions,\n ): Promise<R> {\n return this.runRequestBody(\"post\", path, body ?? {}, options);\n }\n\n put<R extends object = object, I extends object = object>(\n path: string,\n body?: I | FormData,\n options?: RequestOptions,\n ): Promise<R> {\n return this.runRequestBody(\"put\", path, body ?? {}, options);\n }\n\n patch<R extends object = object, I extends object = object>(\n path: string,\n body?: I | FormData,\n options?: RequestOptions,\n ): Promise<R> {\n return this.runRequestBody(\"patch\", path, body ?? {}, options);\n }\n\n delete<R extends object = object>(path: string, options?: RequestOptions): Promise<R> {\n return this.runRequest(\"delete\", path, options);\n }\n\n private async runRequest<R>(\n request: \"get\" | \"delete\",\n path: string,\n options?: RequestOptions,\n ): Promise<R> {\n const res = await this._client[request](path, options);\n const data = (await res.json()) as R;\n if (!res.ok) throw new ApiRequestError(res.status, data[\"error\" as keyof R]);\n return data;\n }\n\n private async runFileRequest(\n request: \"get\",\n path: string,\n options?: RequestOptions,\n ): Promise<Blob> {\n const res = await this._client[request](path, options);\n if (!res.ok)\n throw new ApiRequestError(res.status, ((await res.json()) as { error: any })[\"error\"]);\n return await res.blob();\n }\n\n private async runRequestBody<R, I>(\n request: \"post\" | \"put\" | \"patch\",\n path: string,\n body?: I | FormData,\n options?: RequestOptions,\n ): Promise<R> {\n const res = await this._client[request](\n path,\n body === undefined ? undefined : body instanceof FormData ? body : JSON.stringify(body),\n options,\n );\n const data = (await res.json()) as R;\n if (!res.ok) throw new ApiRequestError(res.status, data[\"error\" as keyof R]);\n return data;\n }\n}\n","import { REGISTRY_URL } from \"@lib/constants\";\n\nimport { RegistryAuthenticationError } from \"@utils/errors\";\n\nimport { HttpClient } from \"./http-client\";\nimport { Repository } from \"./repository\";\n\nconst client = new HttpClient(REGISTRY_URL ?? \"\");\n\nexport const api = new Repository(client);\n\nexport const withAuth = (\n apiKey?: string,\n force: boolean = false,\n headers: object = {\n \"Content-Type\": \"application/json\",\n },\n) => {\n if (!apiKey && force) {\n throw new RegistryAuthenticationError();\n }\n return new Repository(\n new HttpClient(REGISTRY_URL ?? \"\", {\n headers: {\n Authorization: apiKey,\n ...headers,\n },\n }),\n );\n};\n","import { GlobalConfigHandler } from \"@lib/global-config\";\nimport { type Repository, withAuth } from \"@lib/http\";\nimport { type FullManifest, type Manifest } from \"@lib/manifest/manifest.type\";\n\ninterface ManifestDeps {\n nf: Record<string, FullManifest>;\n npm: [string, string][];\n}\n\nexport const resolveManifestDependencies = async (\n names: string[],\n dir?: string,\n): Promise<ManifestDeps> => {\n const client = withAuth(GlobalConfigHandler.read(dir).apiKey, false);\n return concatDeps(await Promise.all(names.map(async (d) => resolveDeps(d, client))));\n};\n\nconst resolveManifest = async (name: string, client: Repository): Promise<FullManifest | never> => {\n return await client.get(`/registry/${name}`);\n};\n\nconst resolveDeps = async (name: string, client: Repository): Promise<ManifestDeps> => {\n const manifest = await resolveManifest(name, client);\n const baseDeps = manifest.dependencies ?? [];\n const deps = await Promise.all(baseDeps.map(async (d) => resolveDeps(d, client)));\n return concatDeps(\n [{ nf: { [manifest.name]: manifest }, npm: getNpmDeps(manifest) }].concat(deps),\n );\n};\n\nconst getNpmDeps = (manifest: Manifest): [string, string][] => {\n return Object.entries({ ...manifest.npmDependencies, ...manifest.libDependencies });\n};\n\nconst concatDeps = (deps: ManifestDeps[]): ManifestDeps => {\n return {\n npm: deps.map(({ npm }) => npm).flat(),\n nf: Object.fromEntries(deps.map(({ nf }) => Object.entries(nf)).flat()),\n };\n};\n","import fs from \"fs\";\nimport { join } from \"path\";\n\nimport { GlobalConfigHandler } from \"@lib/global-config\";\nimport { type Repository, withAuth } from \"@lib/http\";\nimport { type FullManifest, type Manifest } from \"@lib/manifest\";\n\nimport { CLIError } from \"@utils/errors\";\nimport { getCwd } from \"@utils/path\";\n\nexport class Registry {\n static async publish(manifest: Manifest, dir?: string): Promise<void> {\n const client = this._getClient(dir, true, false);\n const filename = manifest.publish?.paths?.package ?? \"index.ts\";\n const file = await this._getPackageFile(filename, dir);\n\n const data = new FormData();\n for (const key of Object.keys(manifest)) {\n const value = manifest[key as keyof Manifest];\n if (!value) continue;\n data.append(key, typeof value === \"string\" ? value : JSON.stringify(value));\n }\n data.append(\"_packageFile\", file, filename);\n await client.put(`/registry/${manifest.name}`, data);\n }\n\n static async unpublish(manifest: Manifest, dir?: string): Promise<void> {\n const client = this._getClient(dir, true);\n\n await client.delete(`/registry/${manifest.name}`);\n }\n\n static async install(manifests: FullManifest[], dir: string): Promise<void> {\n const cwd = getCwd(dir);\n const client = this._getClient(dir, false);\n for (const manifest of manifests) {\n await this.installPackage(client, manifest, cwd);\n }\n }\n\n private static async installPackage(\n client: Repository,\n manifest: FullManifest,\n dir: string,\n ): Promise<void> {\n const file = await client.getFile(`/registry/${manifest.name}/-/${manifest._file}`);\n const path = join(dir, this.getTypeSubFolder(manifest.type));\n fs.mkdirSync(path, { recursive: true });\n fs.writeFileSync(join(path, manifest._file), await file.bytes());\n }\n\n private static getTypeSubFolder(type: string): string {\n if (type === \"component\") return \"components\";\n if (type === \"system\") return \"systems\";\n return \".\";\n }\n\n private static _getClient(dir?: string, force?: boolean, headers: boolean = true): Repository {\n const config = GlobalConfigHandler.read(dir);\n return withAuth(config.apiKey, force, !headers ? {} : undefined);\n }\n\n private static _getPackageFile(filename: string, dir?: string): Promise<Blob> {\n const path = join(getCwd(dir ?? \".\"), filename);\n if (!fs.existsSync(path))\n throw new CLIError(\n \"Package not found, please specify path in the nanoforge.manifest.json : `publish.paths.package`!\",\n );\n try {\n fs.accessSync(path, fs.constants.R_OK);\n return fs.openAsBlob(path);\n } catch {\n throw new CLIError(\"Cannot read package file, please verify your file permissions!\");\n }\n }\n}\n","import { join } from \"path\";\n\nimport {\n type Input,\n getDirectoryInput,\n getInstallLibInput,\n getInstallNamesInputOrAsk,\n getServerInput,\n} from \"@lib/input\";\nimport { resolveManifestDependencies } from \"@lib/manifest/manifest-resolver\";\nimport { PackageManagerFactory } from \"@lib/package-manager\";\nimport { Registry } from \"@lib/registry\";\nimport { Messages } from \"@lib/ui\";\n\nimport { withSpinner } from \"@utils/spinner\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class InstallAction extends AbstractAction {\n protected startMessage = Messages.INSTALL_START;\n protected successMessage = Messages.INSTALL_SUCCESS;\n protected failureMessage = Messages.INSTALL_FAILED;\n\n public async handle(args: Input, options: Input): Promise<HandleResult> {\n const names = await getInstallNamesInputOrAsk(args);\n const directory = getDirectoryInput(options);\n const isLib = getInstallLibInput(options);\n const isServer = getServerInput(options);\n\n return isLib\n ? this._installLibs(directory, names)\n : this._installNfPackages(directory, names, isServer);\n }\n\n private async _installLibs(directory: string, names: string[]): Promise<HandleResult> {\n const packageManager = await PackageManagerFactory.find(directory);\n return { success: await packageManager.addDevelopment(directory, names) };\n }\n\n private async _installNfPackages(\n directory: string,\n names: string[],\n isServer?: boolean,\n ): Promise<HandleResult> {\n const deps = await resolveManifestDependencies(names, directory);\n const part = isServer ? \"server\" : \"client\";\n\n const libSuccess = await this._installLibs(\n directory,\n deps.npm.map(([name, version]) => `${name}@${version}`),\n );\n\n if (!libSuccess) return { success: false };\n\n return withSpinner(\n () => Registry.install(Object.values(deps.nf), join(directory, part)),\n Messages.INSTALL_PACKAGES_IN_PROGRESS,\n );\n }\n}\n","import { GlobalConfigHandler } from \"@lib/global-config\";\nimport { withAuth } from \"@lib/http\";\nimport { type Input, getDirectoryInput, getLocalInput, getLoginApiKeyInputOrAsk } from \"@lib/input\";\nimport { Messages } from \"@lib/ui\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class LoginAction extends AbstractAction {\n protected startMessage = Messages.LOGIN_START;\n protected successMessage = Messages.LOGIN_SUCCESS;\n protected failureMessage = Messages.LOGIN_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const isLocal = getLocalInput(options);\n const apiKey = await getLoginApiKeyInputOrAsk(options);\n\n await withAuth(apiKey, true).post(\"/registry-key/verify\");\n\n GlobalConfigHandler.write(\n {\n apiKey,\n },\n isLocal,\n directory,\n );\n\n return { success: true };\n }\n}\n","import { GlobalConfigHandler } from \"@lib/global-config\";\nimport { type Input, getDirectoryInput, getLocalInput } from \"@lib/input\";\nimport { Messages } from \"@lib/ui\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class LogoutAction extends AbstractAction {\n protected startMessage = Messages.LOGOUT_START;\n protected successMessage = Messages.LOGOUT_SUCCESS;\n protected failureMessage = Messages.LOGOUT_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const isLocal = getLocalInput(options);\n\n GlobalConfigHandler.write(\n {\n apiKey: undefined,\n },\n isLocal,\n directory,\n );\n\n return { success: true };\n }\n}\n","import { type RunOptions, Runner } from \"@lib/runner/runner\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getCwd } from \"@utils/path\";\nimport { withSpinner } from \"@utils/spinner\";\n\nconst GIT = \"git\";\nconst GIT_COMMANDS = {\n init: \"init\",\n remote: \"remote\",\n};\n\nexport class GitRunner {\n private readonly runner: Runner;\n\n constructor() {\n this.runner = new Runner(GIT);\n }\n\n public async init(directory: string): Promise<boolean> {\n const args = [GIT_COMMANDS.init];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n Messages.GIT_INIT_IN_PROGRESS,\n Messages.GIT_INIT_SUCCEED,\n Messages.GIT_INIT_FAILED(this.formatFailCommand(args)),\n );\n\n return result.success;\n }\n\n public async addRemote(directory: string, remote: string): Promise<boolean> {\n const args = [GIT_COMMANDS.remote, \"add\", \"origin\", remote];\n\n const result = await withSpinner(\n () => this.exec(args, directory),\n Messages.GIT_REMOTE_IN_PROGRESS,\n Messages.GIT_REMOTE_SUCCEED,\n Messages.GIT_REMOTE_FAILED(this.formatFailCommand(args)),\n );\n\n return result.success;\n }\n\n private exec(\n args: string[],\n directory: string,\n options: {\n collect?: boolean;\n env?: Record<string, string>;\n listeners?: RunOptions[\"listeners\"];\n onFail?: () => void;\n } = {},\n ): Promise<string | null> {\n return this.runner.run(args, {\n collect: options.collect ?? true,\n cwd: getCwd(directory),\n env: options.env,\n listeners: options.listeners,\n onFail: options.onFail,\n });\n }\n\n private formatFailCommand(args: string[]): string {\n return this.runner.fullCommand(args);\n }\n}\n","import { askInput } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getStringInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getGitRemoteInput = (inputs: Input) => {\n return getStringInput(inputs, \"gitRemote\");\n};\n\nexport const getNewGitRemoteInputOrAsk = (inputs: Input) => {\n return getInputOrAsk(getGitRemoteInput(inputs), () =>\n askInput(Messages.NEW_GIT_REMOTE_QUESTION, {\n required: false,\n default: \"\",\n }),\n );\n};\n","import { askConfirm } from \"@lib/question\";\nimport { Messages } from \"@lib/ui\";\n\nimport { getInputOrAsk } from \"../../ask-inputs\";\nimport { getBooleanInput } from \"../../base-inputs\";\nimport { type Input } from \"../../input.type\";\n\nconst getNewGitInput = (inputs: Input) => {\n return getBooleanInput(inputs, \"git\");\n};\n\nexport const getNewGitOrAsk = (inputs: Input) => {\n return getInputOrAsk(getNewGitInput(inputs), () =>\n askConfirm(Messages.NEW_GIT_QUESTION, { default: true }),\n );\n};\n","import { join } from \"node:path\";\n\nimport { GitRunner } from \"@lib/git/git-runner\";\nimport {\n type Input,\n getDirectoryInput,\n getEditorInput,\n getNewDockerOrAsk,\n getNewInitFunctionsWithDefault,\n getNewLanguageInputOrAsk,\n getNewLintInput,\n getNewNameInputOrAsk,\n getNewPackageManagerInputOrAsk,\n getNewServerOrAsk,\n getNewSkipInstallOrAsk,\n getNewStrictOrAsk,\n getPathInput,\n} from \"@lib/input\";\nimport { getNewGitRemoteInputOrAsk } from \"@lib/input/inputs/new/git-remote.input\";\nimport { getNewGitOrAsk } from \"@lib/input/inputs/new/git.input\";\nimport { PackageManagerFactory } from \"@lib/package-manager\";\nimport { Collection, CollectionFactory } from \"@lib/schematics\";\nimport { Messages } from \"@lib/ui\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\nimport { executeSchematic } from \"../common/schematics\";\n\ninterface NewValues {\n name: string;\n directory: string;\n packageManager: string;\n language: string;\n strict: boolean;\n server: boolean;\n initFunctions: boolean;\n skipInstall: boolean;\n docker: boolean;\n lint: boolean;\n editor: boolean;\n git: boolean;\n gitRemote: string | null;\n}\n\nexport class NewAction extends AbstractAction {\n protected startMessage = Messages.NEW_START;\n protected successMessage = Messages.NEW_SUCCESS;\n protected failureMessage = Messages.NEW_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const cwdDirectory = getDirectoryInput(options);\n const values = await this.collectValues(options);\n\n await this.scaffold(values, cwdDirectory);\n\n let res = true;\n\n const distDir = join(cwdDirectory, values.directory);\n\n if (!values.skipInstall) {\n res = await this.installDependencies(values.packageManager, distDir);\n }\n\n if (values.git) await this.setupGitRepository(values.gitRemote, distDir);\n\n return { success: res };\n }\n\n private async collectValues(inputs: Input): Promise<NewValues> {\n const values: Omit<NewValues, \"directory\" | \"gitRemote\"> = {\n name: await getNewNameInputOrAsk(inputs),\n packageManager: await getNewPackageManagerInputOrAsk(inputs),\n language: await getNewLanguageInputOrAsk(inputs),\n strict: await getNewStrictOrAsk(inputs),\n server: await getNewServerOrAsk(inputs),\n initFunctions: getNewInitFunctionsWithDefault(inputs),\n skipInstall: await getNewSkipInstallOrAsk(inputs),\n docker: await getNewDockerOrAsk(inputs),\n lint: getNewLintInput(inputs),\n editor: getEditorInput(inputs),\n git: await getNewGitOrAsk(inputs),\n };\n\n return {\n ...values,\n directory: getPathInput(inputs) ?? values.name,\n gitRemote: values.git ? (await getNewGitRemoteInputOrAsk(inputs)) || null : null,\n };\n }\n\n private async scaffold(values: NewValues, directory: string): Promise<void> {\n const collection = CollectionFactory.create(Collection.NANOFORGE, directory);\n\n console.info();\n console.info(Messages.NEW_GENERATION_START);\n console.info();\n\n await this.generateApplication(collection, values);\n await this.generateConfiguration(collection, values);\n await this.generateClientParts(collection, values);\n if (values.docker) await this.generateDocker(collection, values);\n\n if (values.server) {\n await this.generateServerParts(collection, values);\n }\n }\n\n private generateApplication(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n return executeSchematic(\"Application\", collection, \"application\", {\n name: values.name,\n directory: values.directory,\n packageManager: values.packageManager,\n language: values.language,\n strict: values.strict,\n server: values.server,\n lint: values.lint,\n editor: values.editor,\n });\n }\n\n private generateConfiguration(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n return executeSchematic(\"Configuration\", collection, \"configuration\", {\n name: values.name,\n directory: values.directory,\n server: values.server,\n language: values.language,\n initFunctions: values.initFunctions,\n });\n }\n\n private async generateClientParts(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n const partOptions = this.partOptions(values, \"client\");\n\n await executeSchematic(\"Client base\", collection, \"part-base\", {\n ...partOptions,\n server: values.server,\n });\n await executeSchematic(\"Client main file\", collection, \"part-main\", {\n ...partOptions,\n });\n }\n\n private async generateServerParts(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n const partOptions = this.partOptions(values, \"server\");\n\n await executeSchematic(\"Server base\", collection, \"part-base\", {\n ...partOptions,\n server: values.server,\n });\n await executeSchematic(\"Server main file\", collection, \"part-main\", {\n ...partOptions,\n });\n }\n\n private async generateDocker(\n collection: ReturnType<typeof CollectionFactory.create>,\n values: NewValues,\n ) {\n await executeSchematic(\"Docker\", collection, \"docker\", {\n directory: values.directory,\n packageManager: values.packageManager,\n });\n }\n\n private partOptions(values: NewValues, part: \"client\" | \"server\") {\n return {\n part,\n directory: values.directory,\n language: values.language,\n initFunctions: values.initFunctions,\n };\n }\n\n private async installDependencies(\n packageManagerName: string,\n directory: string,\n ): Promise<boolean> {\n const packageManager = PackageManagerFactory.create(packageManagerName);\n return await packageManager.install(directory);\n }\n\n private async setupGitRepository(gitRemote: string | null, dir: string): Promise<boolean> {\n const runner = new GitRunner();\n let res;\n\n res = await runner.init(dir);\n if (res && gitRemote) res = await runner.addRemote(dir, gitRemote);\n return res;\n }\n}\n","import { Expose, Type } from \"class-transformer\";\nimport {\n IsEnum,\n IsNotEmpty,\n IsObject,\n IsOptional,\n IsString,\n Matches,\n ValidateNested,\n} from \"class-validator\";\n\nexport enum ManifestPackageTypeEnum {\n COMPONENT = \"component\",\n SYSTEM = \"system\",\n}\n\nclass PathsPublishManifest {\n @Expose()\n @IsString()\n @IsNotEmpty()\n @IsOptional()\n package?: string;\n}\n\nclass PublishManifest {\n @Expose()\n @IsOptional()\n @ValidateNested()\n @Type(() => PathsPublishManifest)\n paths?: PathsPublishManifest;\n}\n\nexport class Manifest {\n @Expose()\n @IsString()\n @Matches(/^[A-Za-z0-9-]+\\/[A-Za-z0-9-]+$/)\n @IsNotEmpty()\n name!: string;\n\n @Expose()\n @IsString()\n @IsEnum(ManifestPackageTypeEnum)\n @IsNotEmpty()\n type!: ManifestPackageTypeEnum;\n\n @Expose()\n @IsString()\n @IsOptional()\n description?: string;\n\n @Expose()\n @IsString({ each: true })\n @IsOptional()\n tags?: string[];\n\n @Expose()\n @IsString({ each: true })\n @IsNotEmpty({ each: true })\n @IsOptional()\n dependencies?: string[];\n\n @Expose()\n @IsOptional()\n @ValidateNested()\n @Type(() => PublishManifest)\n publish?: PublishManifest;\n\n @Expose()\n @IsObject()\n @IsOptional()\n libDependencies?: Record<string, string>;\n\n @Expose()\n @IsObject()\n @IsOptional()\n npmDependencies?: Record<string, string>;\n}\n\nexport interface FullManifest {\n name: string;\n type: ManifestPackageTypeEnum;\n description?: string;\n dependencies?: string[];\n libDependencies?: Record<string, string>;\n npmDependencies?: Record<string, string>;\n publish?: {\n paths?: {\n package?: string;\n };\n };\n _file: string;\n}\n","import { plainToInstance } from \"class-transformer\";\nimport { validate } from \"class-validator\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { MANIFEST_FILE_NAME } from \"@lib/constants\";\n\nimport { ManifestError } from \"@utils/errors\";\nimport { deepMerge } from \"@utils/object\";\n\nimport { Manifest } from \"./manifest.type\";\n\nconst getManifestPath = (directory: string) => {\n for (const n of [MANIFEST_FILE_NAME]) {\n const path = join(directory, n);\n if (existsSync(path)) return path;\n }\n throw new ManifestError(`No manifest file found in directory: ${directory}`);\n};\n\nexport const loadManifest = async (directory: string): Promise<Manifest> => {\n let rawData;\n\n const path = getManifestPath(directory);\n try {\n rawData = deepMerge({}, JSON.parse(readFileSync(path, \"utf-8\")));\n } catch {\n rawData = null;\n }\n if (!rawData) {\n throw new ManifestError(`Unable to read or parse file at ${path}`);\n }\n\n const data = plainToInstance(Manifest, rawData, {\n excludeExtraneousValues: true,\n });\n\n const errors = await validate(data);\n if (errors.length > 0) {\n throw new ManifestError(`Validation failed\\n${errors.toString()}`);\n }\n return data;\n};\n","import { type Input, getDirectoryInput } from \"@lib/input\";\nimport { loadManifest } from \"@lib/manifest\";\nimport { Registry } from \"@lib/registry\";\nimport { Messages } from \"@lib/ui\";\n\nimport { withSpinner } from \"@utils/spinner\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class PublishAction extends AbstractAction {\n protected startMessage = Messages.PUBLISH_START;\n protected successMessage = Messages.PUBLISH_SUCCESS;\n protected failureMessage = Messages.PUBLISH_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n\n const manifest = await loadManifest(directory);\n\n return withSpinner(\n () => Registry.publish(manifest, directory),\n Messages.PUBLISH_IN_PROGRESS(manifest.name),\n );\n }\n}\n","import dotenv from \"dotenv\";\nimport { join, resolve } from \"path\";\n\nimport { type Config } from \"@lib/config\";\nimport {\n type Input,\n getDirectoryInput,\n getStringInput,\n getStringInputWithDefault,\n getWatchInput,\n} from \"@lib/input\";\nimport { PackageManagerFactory } from \"@lib/package-manager\";\nimport { Messages } from \"@lib/ui\";\n\nimport { CLIError } from \"@utils/errors\";\nimport { getCwd, getModulePath } from \"@utils/path\";\nimport { runSafe } from \"@utils/run-safe\";\n\nimport { getConfig } from \"~/action/common/config\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\ninterface SSLOptions {\n cert: string;\n key: string;\n}\n\ninterface FullEnv {\n client: Record<string, string>;\n server: Record<string, string>;\n}\n\nexport class StartAction extends AbstractAction {\n protected startMessage = Messages.START_START;\n protected successMessage = Messages.START_SUCCESS;\n protected failureMessage = Messages.START_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n const config = await getConfig(options, directory);\n const clientDir = getStringInputWithDefault(options, \"clientDir\", config.client.outDir);\n const serverDir = getStringInputWithDefault(options, \"serverDir\", config.server.outDir);\n const watch = getWatchInput(options);\n const port = getStringInputWithDefault(options, \"port\", config.client.port);\n const ssl = this.resolveSSL(options, config);\n\n const tasks = this.buildStartTasks(config, directory, {\n clientDir,\n serverDir,\n watch,\n port,\n ssl,\n });\n await Promise.all(tasks);\n\n return { keepAlive: true };\n }\n\n private resolveSSL(options: Input, config: Config): SSLOptions | undefined {\n const cliCert = getStringInput(options, \"cert\");\n const cliKey = getStringInput(options, \"key\");\n const isSslRequested = Boolean(cliCert || cliKey || config.ssl?.enable);\n\n if (!isSslRequested) return undefined;\n\n const cert = cliCert ? cliCert : config.ssl?.cert;\n const key = cliKey ? cliKey : config.ssl?.key;\n\n if (!cert) {\n throw new CLIError(\n \"No certificate found for SSL.\",\n \"Please provide a certificate path with --cert or configure 'ssl.cert' in your nanoforge.config.json.\",\n );\n }\n\n if (!key) {\n throw new CLIError(\n \"No key found for SSL.\",\n \"Please provide a key path with --key or configure 'ssl.key' in your nanoforge.config.json.\",\n );\n }\n\n return {\n cert,\n key,\n };\n }\n\n private buildStartTasks(\n config: Config,\n directory: string,\n options: {\n clientDir: string;\n serverDir: string;\n watch: boolean;\n port: string;\n ssl?: SSLOptions;\n },\n ): Promise<void>[] {\n const env = this.parseEnv(directory);\n const tasks: Promise<void>[] = [];\n const { clientDir, serverDir, watch, port, ssl } = options;\n\n if (config.server.enable)\n tasks.push(this.startServer(directory, config, { serverDir, watch }, env));\n\n if (config.client.enable)\n tasks.push(\n this.startClient(directory, config, { clientDir, serverDir, watch, port, ssl }, env),\n );\n\n return tasks;\n }\n\n private async startClient(\n directory: string,\n config: Config,\n options: {\n clientDir: string;\n serverDir: string;\n watch: boolean;\n port: string;\n ssl?: SSLOptions;\n },\n env: FullEnv,\n ): Promise<void> {\n const loaderPath = getModulePath(\"@nanoforge-dev/loader-client/package.json\", true);\n\n const params = this.buildClientParams(directory, config, options);\n await this.runLoader(\"Client\", loaderPath, params, env.client);\n }\n\n private async startServer(\n directory: string,\n config: Config,\n options: { serverDir: string; watch: boolean },\n env: FullEnv,\n ): Promise<void> {\n const loaderPath = getModulePath(\"@nanoforge-dev/loader-server/package.json\", true);\n\n const params = this.buildServerParams(directory, config, options);\n await this.runLoader(\"Server\", loaderPath, params, env.server);\n }\n\n private buildClientParams(\n directory: string,\n config: Config,\n options: {\n clientDir: string;\n serverDir: string;\n watch: boolean;\n port: string;\n ssl?: SSLOptions;\n },\n ): string[] {\n const params: Record<string, string | boolean> = {\n \"-d\": getCwd(join(directory, options.clientDir)),\n \"-p\": options.port,\n };\n if (options.watch) params[\"--watch\"] = true;\n\n if (options.watch) {\n params[\"--watch\"] = true;\n if (config.server.enable) {\n params[\"--watch-server-dir\"] = getCwd(join(directory, options.serverDir));\n }\n }\n\n if (options.ssl) {\n params[\"--cert\"] = options.ssl.cert;\n params[\"--key\"] = options.ssl.key;\n }\n\n return this.buildParams(params);\n }\n\n private buildServerParams(\n directory: string,\n _config: Config,\n options: {\n serverDir: string;\n watch: boolean;\n },\n ): string[] {\n const params: Record<string, string | boolean> = {\n \"-d\": getCwd(join(directory, options.serverDir)),\n };\n if (options.watch) params[\"--watch\"] = true;\n\n return this.buildParams(params);\n }\n\n private buildParams(params: Record<string, string | boolean>): string[] {\n return Object.entries(params)\n .map(([key, value]) => (typeof value === \"string\" ? [key, value] : [key]))\n .flat();\n }\n\n private parseEnv(dir: string): FullEnv {\n const prefix = \"NANOFORGE_\";\n const clientPrefix = `${prefix}CLIENT_`;\n const serverPrefix = `${prefix}SERVER_`;\n\n const rawEnv = {\n ...process.env,\n };\n dotenv.config({\n path: resolve(getCwd(join(dir, \".env\"))),\n processEnv: rawEnv,\n });\n const baseEnv = Object.entries(rawEnv).filter(\n ([key, value]) => key.startsWith(prefix) && !!value,\n ) as [string, string][];\n\n return {\n client: Object.fromEntries(\n baseEnv\n .filter(([key]) => !key.startsWith(serverPrefix))\n .map(([key, value]) => [key.replace(clientPrefix, prefix), value]),\n ),\n server: Object.fromEntries(\n baseEnv\n .filter(([key]) => !key.startsWith(clientPrefix))\n .map(([key, value]) => [key.replace(serverPrefix, prefix), value]),\n ),\n };\n }\n\n private async runLoader(\n name: string,\n directory: string,\n params: string[],\n env: Record<string, string>,\n ): Promise<void> {\n await runSafe(async () => {\n const packageManager = await PackageManagerFactory.find(directory);\n await packageManager.run(name, directory, \"start\", params, env, [], true);\n });\n }\n}\n","import { type Input, getDirectoryInput } from \"@lib/input\";\nimport { loadManifest } from \"@lib/manifest\";\nimport { Registry } from \"@lib/registry\";\nimport { Messages } from \"@lib/ui\";\n\nimport { withSpinner } from \"@utils/spinner\";\n\nimport { AbstractAction, type HandleResult } from \"../abstract.action\";\n\nexport class UnpublishAction extends AbstractAction {\n protected startMessage = Messages.UNPUBLISH_START;\n protected successMessage = Messages.UNPUBLISH_SUCCESS;\n protected failureMessage = Messages.UNPUBLISH_FAILED;\n\n public async handle(_args: Input, options: Input): Promise<HandleResult> {\n const directory = getDirectoryInput(options);\n\n const manifest = await loadManifest(directory);\n\n return withSpinner(\n () => Registry.unpublish(manifest, directory),\n Messages.UNPUBLISH_IN_PROGRESS(manifest.name),\n );\n }\n}\n","import { type Command } from \"commander\";\n\nimport { type Input, type InputValue } from \"@lib/input\";\n\nimport { type AbstractAction } from \"~/action/abstract.action\";\n\nexport abstract class AbstractCommand {\n constructor(protected action: AbstractAction) {}\n\n public abstract load(program: Command): void;\n\n protected static mapToInput(mapping: Record<string, InputValue[\"value\"]>): Input {\n const input: Input = new Map();\n for (const [key, value] of Object.entries(mapping)) {\n input.set(key, { value });\n }\n return input;\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface BuildOptions {\n directory?: string;\n config?: string;\n clientEntry?: string;\n serverEntry?: string;\n clientStaticDir?: string;\n serverStaticDir?: string;\n clientOutDir?: string;\n serverOutDir?: string;\n editor?: boolean;\n watch?: boolean;\n}\n\nexport class BuildCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"build\")\n .description(\"build your game\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"--client-entry <clientEntry>\", \"specify the entry file of the client\")\n .option(\"--server-entry <serverEntry>\", \"specify the entry file of the server\")\n .option(\"--client-static-dir <clientStaticDir>\", \"specify the static directory of the client\")\n .option(\"--server-static-dir <serverStaticDir>\", \"specify the static directory of the server\")\n .option(\"--client-out-dir <clientOutDir>\", \"specify the output directory of the client\")\n .option(\"--server-out-dir <serverOutDir>\", \"specify the output directory of the server\")\n .option(\"--editor\", \"specify if the project must build with editor config\")\n .option(\"--watch\", \"build app in watching mode\", false)\n .action(async (rawOptions: BuildOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n clientEntry: rawOptions.clientEntry,\n serverEntry: rawOptions.serverEntry,\n clientStaticDir: rawOptions.clientStaticDir,\n serverStaticDir: rawOptions.serverStaticDir,\n clientOutDir: rawOptions.clientOutDir,\n serverOutDir: rawOptions.serverOutDir,\n editor: rawOptions.editor,\n watch: rawOptions.watch,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface CreateOptions {\n directory?: string;\n config: string;\n name?: string;\n server: boolean;\n path?: string;\n}\n\nexport class CreateCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"create <type>\")\n .description(\"create nanoforge components or systems\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"-n, --name <name>\", \"name of the component/system\")\n .option(\n \"-s, --server\",\n \"install components/systems on server (default install on client)\",\n false,\n )\n .option(\n \"-p, --path <path>\",\n \"path to the component/system folder (default: <part>/<components|systems>)\",\n )\n .action(async (type: string, rawOptions: CreateOptions) => {\n const args = AbstractCommand.mapToInput({\n type,\n });\n\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n name: rawOptions.name,\n server: rawOptions.server,\n path: rawOptions.path,\n });\n\n await this.action.run(args, options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface DevOptions {\n directory?: string;\n config?: string;\n generate?: boolean;\n editor?: boolean;\n}\n\nexport class DevCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"dev\")\n .description(\"run your game in dev mode\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"--generate\", \"generate app from config\", false)\n .option(\"-e, --editor\", \"run the editor\", false)\n .action(async (rawOptions: DevOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n generate: rawOptions.generate,\n editor: rawOptions.editor,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface EditorOptions {\n directory?: string;\n open?: boolean;\n}\n\nexport class EditorCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"editor [path]\")\n .description(\"start the editor\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\n \"--open\",\n \"open the editor on the default web browser (default: true if path is specified, false otherwise)\",\n )\n .option(\"--no-open\", \"do not open the editor on the default web browser\")\n .action(async (path: string, rawOptions: EditorOptions) => {\n const args = AbstractCommand.mapToInput({\n path,\n });\n\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n open: rawOptions.open,\n });\n\n await this.action.run(args, options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface GenerateOptions {\n directory?: string;\n config?: string;\n editor?: boolean;\n watch?: boolean;\n}\n\nexport class GenerateCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"generate\")\n .description(\"generate nanoforge files from config\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"--editor\", \"specify if the project must generate editor main file\")\n .option(\"--watch\", \"generate app in watching mode\", false)\n .action(async (rawOptions: GenerateOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n editor: rawOptions.editor,\n watch: rawOptions.watch,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface InstallOptions {\n directory?: string;\n lib?: boolean;\n server?: boolean;\n}\n\nexport class InstallCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"install [names...]\")\n .alias(\"add\")\n .description(\"add Nanoforge components and systems to your project\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-l, --lib\", \"install library instead of component/system\", false)\n .option(\n \"-s, --server\",\n \"install components/systems on server (default install on client)\",\n false,\n )\n .action(async (names: string[], rawOptions: InstallOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n lib: rawOptions.lib,\n server: rawOptions.server,\n });\n const args = AbstractCommand.mapToInput({\n names: names.length ? names : undefined,\n });\n\n await this.action.run(args, options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface LoginOptions {\n directory?: string;\n local?: boolean;\n apiKey?: string;\n}\n\nexport class LoginCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"login\")\n .description(\"login to Nanoforge registry\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-l, --local\", \"login only for the project\", false)\n .option(\"-k, --api-key <key>\", \"api key for Nanoforge registry\")\n .action(async (rawOptions: LoginOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n local: rawOptions.local,\n apiKey: rawOptions.apiKey,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface LogoutOptions {\n directory?: string;\n local?: boolean;\n}\n\nexport class LogoutCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"logout\")\n .description(\"logout from Nanoforge registry\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-l, --local\", \"logout only for the project\")\n .action(async (rawOptions: LogoutOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n local: rawOptions.local,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface NewOptions {\n directory?: string;\n name?: string;\n path?: string;\n packageManager?: string;\n language?: string;\n strict?: boolean;\n server?: boolean;\n initFunctions?: boolean;\n skipInstall?: boolean;\n docker?: boolean;\n lint?: boolean;\n editor?: boolean;\n git?: boolean;\n gitRemote?: string | false;\n}\n\nexport class NewCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"new\")\n .description(\"create a new nanoforge project\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"--name <name>\", \"specify the name of your project\")\n .option(\n \"--path <path>\",\n \"specify the relative path where your project will be created (default: name of the project)\",\n )\n .option(\"--package-manager <packageManager>\", \"specify the package manager of your project\")\n .option(\"--language <language>\", \"specify the language of your project\")\n .option(\"--strict\", \"use strict mode\")\n .option(\"--no-strict\", \"do not use strict mode\")\n .option(\"--server\", \"create a server\")\n .option(\"--no-server\", \"do not create a server\")\n .option(\"--init-functions\", \"initialize functions\")\n .option(\"--no-init-functions\", \"do not initialize functions\")\n .option(\"--skip-install\", \"skip installing dependencies\")\n .option(\"--no-skip-install\", \"do not skip installing dependencies\")\n .option(\"--docker\", \"generate docker files\")\n .option(\"--no-docker\", \"do not generate docker files\")\n .option(\"--no-lint\", \"do not generate lint files\")\n .option(\"--editor\", \"do add editor dependencies\")\n .option(\"--git\", \"generate git repository\")\n .option(\"--no-git\", \"do not generate git repository\")\n .option(\n \"--git-remote <gitRemote>\",\n \"setup git remote to git repository (required if --git is used)\",\n )\n .option(\"--no-git-remote\", \"do not setup git remote to git repository\")\n .action(async (rawOptions: NewOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n name: rawOptions.name,\n path: rawOptions.path,\n packageManager: rawOptions.packageManager,\n language: rawOptions.language,\n strict: rawOptions.strict,\n server: rawOptions.server,\n initFunctions: rawOptions.initFunctions,\n skipInstall: rawOptions.skipInstall,\n docker: rawOptions.docker,\n lint: rawOptions.lint,\n editor: rawOptions.editor,\n git: rawOptions.git,\n });\n\n if (typeof rawOptions.gitRemote === \"boolean\")\n options.set(\"gitRemote\", { value: rawOptions.gitRemote ? undefined : \"\" });\n else if (rawOptions.gitRemote) options.set(\"gitRemote\", { value: rawOptions.gitRemote });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface PublishOptions {\n directory?: string;\n}\n\nexport class PublishCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"publish\")\n .description(\"publish package to Nanoforge registry\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .action(async (rawOptions: PublishOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { CONFIG_FILE_NAME } from \"@lib/constants\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface StartOptions {\n directory?: string;\n config?: string;\n port?: string;\n clientDir?: string;\n serverDir?: string;\n watch?: boolean;\n cert?: string;\n key?: string;\n}\n\nexport class StartCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"start\")\n .description(\"start your game\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .option(\"-c, --config <config>\", \"path to the config file\", CONFIG_FILE_NAME)\n .option(\"-p, --port <port>\", \"specify the port of the loader (the website to load the game)\")\n .option(\"--client-dir <clientDirectory>\", \"specify the directory of the client\")\n .option(\"--server-dir <serverDirectory>\", \"specify the directory of the server\")\n .option(\"--watch\", \"run app in watching mode\", false)\n .option(\"--cert <cert>\", \"path to the SSL certificate for HTTPS\")\n .option(\"--key <key>\", \"path to the SSL key for HTTPS\")\n .action(async (rawOptions: StartOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n config: rawOptions.config,\n port: rawOptions.port,\n clientDir: rawOptions.clientDir,\n serverDir: rawOptions.serverDir,\n watch: rawOptions.watch,\n cert: rawOptions.cert,\n key: rawOptions.key,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { type Command } from \"commander\";\n\nimport { AbstractCommand } from \"../abstract.command\";\n\ninterface UnpublishOptions {\n directory?: string;\n}\n\nexport class UnpublishCommand extends AbstractCommand {\n public load(program: Command) {\n program\n .command(\"unpublish\")\n .description(\"unpublish package to Nanoforge registry\")\n .option(\"-d, --directory <directory>\", \"specify the working directory of the command\")\n .action(async (rawOptions: UnpublishOptions) => {\n const options = AbstractCommand.mapToInput({\n directory: rawOptions.directory,\n });\n\n await this.action.run(new Map(), options);\n });\n }\n}\n","import { red } from \"ansis\";\nimport { type Command } from \"commander\";\n\nimport { Prefixes } from \"@lib/ui\";\n\nimport {\n BuildAction,\n CreateAction,\n DevAction,\n EditorAction,\n GenerateAction,\n InstallAction,\n LoginAction,\n LogoutAction,\n NewAction,\n PublishAction,\n StartAction,\n UnpublishAction,\n} from \"~/action\";\n\nimport { BuildCommand } from \"./commands/build.command\";\nimport { CreateCommand } from \"./commands/create.command\";\nimport { DevCommand } from \"./commands/dev.command\";\nimport { EditorCommand } from \"./commands/editor.command\";\nimport { GenerateCommand } from \"./commands/generate.command\";\nimport { InstallCommand } from \"./commands/install.command\";\nimport { LoginCommand } from \"./commands/login.command\";\nimport { LogoutCommand } from \"./commands/logout.command\";\nimport { NewCommand } from \"./commands/new.command\";\nimport { PublishCommand } from \"./commands/publish.command\";\nimport { StartCommand } from \"./commands/start.command\";\nimport { UnpublishCommand } from \"./commands/unpublish.command\";\n\nexport class CommandLoader {\n public static async load(program: Command): Promise<void> {\n new NewCommand(new NewAction()).load(program);\n new InstallCommand(new InstallAction()).load(program);\n new BuildCommand(new BuildAction()).load(program);\n new StartCommand(new StartAction()).load(program);\n new DevCommand(new DevAction()).load(program);\n new EditorCommand(new EditorAction()).load(program);\n new GenerateCommand(new GenerateAction()).load(program);\n new CreateCommand(new CreateAction()).load(program);\n new LoginCommand(new LoginAction()).load(program);\n new LogoutCommand(new LogoutAction()).load(program);\n new PublishCommand(new PublishAction()).load(program);\n new UnpublishCommand(new UnpublishAction()).load(program);\n this.handleInvalidCommand(program);\n }\n\n private static handleInvalidCommand(program: Command) {\n program.on(\"command:*\", () => {\n console.error(`\\n${Prefixes.ERROR} Invalid command: ${red`%s`}`, program.args.join(\" \"));\n console.log(`See ${red`--help`} for a list of available commands.\\n`);\n process.exit(1);\n });\n }\n}\n"],"mappings":"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"}
|
package/dist/nf.js
CHANGED
|
@@ -1325,10 +1325,14 @@ var AbstractCollection = class {
|
|
|
1325
1325
|
onFail
|
|
1326
1326
|
});
|
|
1327
1327
|
}
|
|
1328
|
-
buildCommandLine(name, options, flags = [
|
|
1328
|
+
buildCommandLine(name, options, flags = [
|
|
1329
|
+
"--no-dry-run",
|
|
1330
|
+
"--allow-private",
|
|
1331
|
+
"--no-debug"
|
|
1332
|
+
]) {
|
|
1329
1333
|
return [
|
|
1330
|
-
`${this.collection}:${name}`,
|
|
1331
1334
|
...flags,
|
|
1335
|
+
`'${getModulePath(this.collection + "/collection.json")}:${name}'`,
|
|
1332
1336
|
...this.serializeOptions(options)
|
|
1333
1337
|
];
|
|
1334
1338
|
}
|
|
@@ -2535,7 +2539,7 @@ var CommandLoader = class {
|
|
|
2535
2539
|
};
|
|
2536
2540
|
//#endregion
|
|
2537
2541
|
//#region package.json
|
|
2538
|
-
var version = "1.6.1-beta.
|
|
2542
|
+
var version = "1.6.1-beta.6ba1d3f";
|
|
2539
2543
|
//#endregion
|
|
2540
2544
|
//#region src/bin/nf.ts
|
|
2541
2545
|
const bootstrap = async () => {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@nanoforge-dev/cli",
|
|
4
|
-
"version": "1.6.1-beta.
|
|
4
|
+
"version": "1.6.1-beta.6ba1d3f",
|
|
5
5
|
"description": "NanoForge CLI",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"nanoforge",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"@inquirer/prompts": "^8.5.2",
|
|
39
39
|
"@nanoforge-dev/loader-client": "^1.3.0",
|
|
40
40
|
"@nanoforge-dev/loader-server": "^1.2.0",
|
|
41
|
-
"@nanoforge-dev/schematics": "^2.1.
|
|
41
|
+
"@nanoforge-dev/schematics": "^2.1.4",
|
|
42
42
|
"ansis": "^4.3.1",
|
|
43
43
|
"bun": "^1.3.14",
|
|
44
44
|
"chokidar": "^5.0.0",
|