@xeno-js/cli 0.1.2 → 0.1.4
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/LICENSE +18 -12
- package/README.md +461 -236
- package/dist/index.js +1018 -688
- package/dist/index.js.map +1 -1
- package/package.json +91 -66
- package/.github/.copilot-instruction.md +0 -73
- package/.github/agents/git-operator.agent.md +0 -86
- package/.github/agents/unit-tester.agent.md +0 -68
- package/.husky/commit-msg +0 -1
- package/.husky/pre-commit +0 -1
- package/.husky/pre-push +0 -1
- package/.prettierignore +0 -7
- package/.prettierrc.json +0 -37
- package/commitlint.config.cjs +0 -39
- package/eslint.config.mjs +0 -306
- package/lint-staged.config.mjs +0 -5
- package/logo/logo.png +0 -0
- package/src/domain/contracts/icommand-cli.contracts.ts +0 -13
- package/src/domain/contracts/icommand-runner.contracts.ts +0 -3
- package/src/domain/contracts/idispatch.contracts.ts +0 -3
- package/src/domain/contracts/ifile-service.contracts.ts +0 -3
- package/src/domain/contracts/igenerator.contracts.ts +0 -5
- package/src/domain/contracts/index.ts +0 -6
- package/src/domain/contracts/iscaffold-strategy.contracts.ts +0 -7
- package/src/domain/index.ts +0 -1
- package/src/index.ts +0 -30
- package/src/infrastructure/bootstrap/bootstrapper.ts +0 -30
- package/src/infrastructure/bootstrap/index.ts +0 -1
- package/src/infrastructure/builder/builder.test.ts +0 -36
- package/src/infrastructure/builder/builder.ts +0 -15
- package/src/infrastructure/builder/index.ts +0 -1
- package/src/infrastructure/command_launcher/command.utils.ts +0 -31
- package/src/infrastructure/command_launcher/index.ts +0 -0
- package/src/infrastructure/commands/command-runner.service.ts +0 -36
- package/src/infrastructure/commands/generate.command.ts +0 -55
- package/src/infrastructure/commands/help.command.ts +0 -63
- package/src/infrastructure/commands/index.ts +0 -4
- package/src/infrastructure/commands/new-project.command.ts +0 -47
- package/src/infrastructure/dispatcher/dispatcher.ts +0 -45
- package/src/infrastructure/dispatcher/index.ts +0 -1
- package/src/infrastructure/file/file.service.ts +0 -14
- package/src/infrastructure/file/index.ts +0 -1
- package/src/infrastructure/generators/core/bootstrap.generator.ts +0 -118
- package/src/infrastructure/generators/core/command/cqrs.generator.ts +0 -63
- package/src/infrastructure/generators/core/command/generate-command.generator.ts +0 -191
- package/src/infrastructure/generators/core/command/generate-query.generator.ts +0 -150
- package/src/infrastructure/generators/core/drizzle-sql-lite.generator.ts +0 -76
- package/src/infrastructure/generators/core/drizzle.generator.ts +0 -86
- package/src/infrastructure/generators/core/env.generator.ts +0 -69
- package/src/infrastructure/generators/core/index.ts +0 -9
- package/src/infrastructure/generators/core/main.generator.ts +0 -41
- package/src/infrastructure/generators/core/packagejson.generator.ts +0 -70
- package/src/infrastructure/generators/core/readme.generator.ts +0 -427
- package/src/infrastructure/generators/core/registry.generator.ts +0 -40
- package/src/infrastructure/generators/core/tsconfig.generator.ts +0 -39
- package/src/infrastructure/generators/gitignore.generator.ts +0 -60
- package/src/infrastructure/generators/vue/app-vue.generator.ts +0 -21
- package/src/infrastructure/generators/vue/bootstrap-ts.generator.ts +0 -60
- package/src/infrastructure/generators/vue/command_query/cqrs.generator.ts +0 -36
- package/src/infrastructure/generators/vue/command_query/generate-command-vue.generator.ts +0 -153
- package/src/infrastructure/generators/vue/command_query/generate-query-vue.generator.ts +0 -161
- package/src/infrastructure/generators/vue/env.generator.ts +0 -39
- package/src/infrastructure/generators/vue/index-html.generator.ts +0 -24
- package/src/infrastructure/generators/vue/index.ts +0 -12
- package/src/infrastructure/generators/vue/main.generator.ts +0 -41
- package/src/infrastructure/generators/vue/packagejson.generator.ts +0 -50
- package/src/infrastructure/generators/vue/readme.generator.ts +0 -389
- package/src/infrastructure/generators/vue/registry-ts.generator.ts +0 -26
- package/src/infrastructure/generators/vue/router.generator.ts +0 -35
- package/src/infrastructure/generators/vue/tailwind.generator.ts +0 -17
- package/src/infrastructure/generators/vue/tsconfig.generator.ts +0 -38
- package/src/infrastructure/generators/vue/use-app.generator.ts +0 -38
- package/src/infrastructure/generators/vue/vite-config.generator.ts +0 -35
- package/src/infrastructure/index.ts +0 -5
- package/src/infrastructure/strategies/core-scaffold.strategy.ts +0 -100
- package/src/infrastructure/strategies/index.ts +0 -2
- package/src/infrastructure/strategies/vue-scaffold.strategy.ts +0 -79
- package/src/shared/constants/command.constants.ts +0 -18
- package/src/shared/constants/core.constants.ts +0 -7
- package/src/shared/constants/index.ts +0 -2
- package/src/shared/index.ts +0 -3
- package/src/shared/types/common.types.ts +0 -68
- package/src/shared/types/index.ts +0 -1
- package/src/shared/utils/guards.utils.ts +0 -334
- package/src/shared/utils/index.ts +0 -2
- package/src/shared/utils/string.utils.ts +0 -60
- package/tsconfig.json +0 -15
- package/tsup.config.ts +0 -13
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants/command.constants.ts","../src/shared/constants/core.constants.ts","../src/shared/constants/index.ts","../src/shared/utils/guards.utils.ts","../src/shared/utils/string.utils.ts","../src/shared/utils/index.ts","../src/shared/index.ts","../src/infrastructure/generators/core/command/generate-command.generator.ts","../src/infrastructure/generators/core/command/generate-query.generator.ts","../src/infrastructure/generators/core/command/cqrs.generator.ts","../src/infrastructure/generators/vue/command_query/generate-command-vue.generator.ts","../src/infrastructure/generators/vue/command_query/generate-query-vue.generator.ts","../src/infrastructure/generators/vue/command_query/cqrs.generator.ts","../src/infrastructure/generators/vue/packagejson.generator.ts","../src/infrastructure/generators/vue/vite-config.generator.ts","../src/infrastructure/generators/vue/env.generator.ts","../src/infrastructure/generators/vue/tsconfig.generator.ts","../src/infrastructure/generators/vue/readme.generator.ts","../src/infrastructure/generators/gitignore.generator.ts","../src/infrastructure/generators/vue/app-vue.generator.ts","../src/infrastructure/generators/vue/bootstrap-ts.generator.ts","../src/infrastructure/generators/vue/index-html.generator.ts","../src/infrastructure/generators/vue/main.generator.ts","../src/infrastructure/generators/vue/registry-ts.generator.ts","../src/infrastructure/generators/vue/router.generator.ts","../src/infrastructure/generators/vue/tailwind.generator.ts","../src/infrastructure/generators/vue/use-app.generator.ts","../src/infrastructure/strategies/vue-scaffold.strategy.ts","../src/infrastructure/generators/core/packagejson.generator.ts","../src/infrastructure/generators/core/bootstrap.generator.ts","../src/infrastructure/generators/core/env.generator.ts","../src/infrastructure/generators/core/readme.generator.ts","../src/infrastructure/generators/core/registry.generator.ts","../src/infrastructure/generators/core/tsconfig.generator.ts","../src/infrastructure/generators/core/drizzle.generator.ts","../src/infrastructure/generators/core/drizzle-sql-lite.generator.ts","../src/infrastructure/generators/core/main.generator.ts","../src/infrastructure/strategies/core-scaffold.strategy.ts","../src/index.ts","../src/infrastructure/commands/command-runner.service.ts","../src/infrastructure/commands/generate.command.ts","../src/infrastructure/file/file.service.ts","../src/infrastructure/commands/help.command.ts","../src/infrastructure/commands/new-project.command.ts","../src/infrastructure/bootstrap/bootstrapper.ts","../src/infrastructure/dispatcher/dispatcher.ts","../src/infrastructure/builder/builder.ts"],"sourcesContent":["export const ARGS_CONSTANTS = Object.freeze({\r\n HELP: '--help',\r\n VUE: '--vue',\r\n CORE: '--core',\r\n CONSOLE: '--console',\r\n} as const)\r\n\r\nexport const COMMAND_CONSTANTS = Object.freeze({\r\n HELP: 'help',\r\n COMMAND: 'command',\r\n QUERY: 'query',\r\n} as const)\r\n\r\nexport const TARGET_ENV_CONSTANTS = Object.freeze({\r\n CONSOLE: 'console',\r\n VERCEL: 'vercel',\r\n FASTIFY: 'fastify',\r\n} as const)\r\n","export const CORE_CONSTANTS = Object.freeze({\r\n VERCEL: 'vercel',\r\n FASTIFY: 'fastify',\r\n DRIZZLE: 'drizzle',\r\n SQL_LITE: 'sqlLite',\r\n NONE: 'none',\r\n} as const)\r\n","export * from './command.constants'\r\nexport * from './core.constants'\r\n","import type { Dictionary, Maybe } from '../types/common.types'\r\n\r\nconst OBJECT_TAG = '[object Object]'\r\nconst DATE_TAG = '[object Date]'\r\n\r\n/**\r\n * @description Centralized type guards and runtime predicates.\r\n\r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\nexport const Guards = Object.freeze({\r\n /**\r\n * @description Checks value is neither null nor undefined.\r\n * @param value Candidate value.\r\n * @returns True when value is defined.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isDefined<TValue>(value: Maybe<TValue>): value is TValue {\r\n return value !== null && value !== undefined && value !== '' && !Number.isNaN(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is null, undefined, empty string, or false.\r\n * @param value Candidate value.\r\n * @returns True when value is null, undefined, empty string, or false.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isNullOrEmpty<TValue>(value: Maybe<TValue>): value is null | undefined {\r\n return (\r\n !Guards.isDefined(value) ||\r\n (Guards.isString(value) && value.trim() === '') ||\r\n (Guards.isArray(value) && value.length === 0)\r\n )\r\n },\r\n\r\n /**\r\n * @description Throws an error if the value is null, undefined, empty string, or false.\r\n * @param value Candidate value.\r\n * @param errorMessage Error message to throw if the check fails.\r\n * @throws Error with the provided message if the value is null, undefined, empty string, or false.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n throwIfNullOrEmpty<TValue>(value: Maybe<TValue>, errorMessage: string): void {\r\n if (Guards.isNullOrEmpty(value)) {\r\n throw new Error(errorMessage)\r\n }\r\n },\r\n\r\n /**\r\n * @description Throws an error if the value is not a positive integer.\r\n * @param value Candidate value.\r\n * @param errorMessage Error message to throw if the check fails.\r\n * @throws Error with the provided message if the value is not a positive integer.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n throwIfNegative(value: number, errorMessage: string): void {\r\n if (Guards.isInteger(value) && value < 0) {\r\n throw new Error(errorMessage)\r\n }\r\n },\r\n\r\n /**\r\n * @description Throws an error if the value is not an integer.\r\n * @param value Candidate value.\r\n * @param errorMessage Error message to throw if the check fails.\r\n * @throws Error with the provided message if the value is not an integer.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n throwIfNotInteger(value: number, errorMessage: string): void {\r\n if (!Guards.isInteger(value)) {\r\n throw new Error(errorMessage)\r\n }\r\n },\r\n\r\n /**\r\n * @description Checks if an object has a method with the given name.\r\n * @param obj Object to check.\r\n * @param methodName Name of the method to look for.\r\n * @returns True when obj has a function property named methodName.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n hasMethod(obj: unknown, methodName: string): boolean {\r\n if (!this.isDefined(obj)) return false\r\n\r\n // Essendo all'interno del namespace di utilità, l'uso di typeof qui è consentito\r\n return Guards.isFunction((obj as Dictionary<unknown>)[methodName])\r\n },\r\n\r\n /**\r\n * @description Checks value is a string.\r\n * @param value Candidate value.\r\n * @returns True when value is string.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isString(value: unknown): value is string {\r\n return typeof value === 'string'\r\n },\r\n\r\n /**\r\n * @description Checks value is a finite number.\r\n * @param value Candidate value.\r\n * @returns True when value is finite number.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isNumber(value: unknown): value is number {\r\n return typeof value === 'number' && Number.isFinite(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is an integer number.\r\n * @param value Candidate value.\r\n * @returns True when value is integer number.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isInteger(value: unknown): value is number {\r\n return Guards.isNumber(value) && Number.isInteger(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is boolean.\r\n * @param value Candidate value.\r\n * @returns True when value is boolean.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isBoolean(value: unknown): value is boolean {\r\n return typeof value === 'boolean'\r\n },\r\n\r\n /**\r\n * @description Checks value is bigint.\r\n * @param value Candidate value.\r\n * @returns True when value is bigint.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isBigInt(value: unknown): value is bigint {\r\n return typeof value === 'bigint'\r\n },\r\n\r\n /**\r\n * @description Checks value is symbol.\r\n * @param value Candidate value.\r\n * @returns True when value is symbol.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isSymbol(value: unknown): value is symbol {\r\n return typeof value === 'symbol'\r\n },\r\n\r\n /**\r\n * @description Checks value is a function.\r\n * @param value Candidate value.\r\n * @returns True when value is function.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isFunction(value: unknown): value is (...args: readonly unknown[]) => unknown {\r\n return typeof value === 'function'\r\n },\r\n\r\n /**\r\n * @description Checks value is an array.\r\n * @param value Candidate value.\r\n * @returns True when value is array.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isArray<TValue>(value: unknown): value is TValue[] {\r\n return Array.isArray(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is a Date instance with valid timestamp.\r\n * @param value Candidate value.\r\n * @returns True when value is valid Date.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isDate(value: unknown): value is Date {\r\n if (Object.prototype.toString.call(value) !== DATE_TAG) {\r\n return false\r\n }\r\n\r\n return Number.isFinite((value as Date).getTime())\r\n },\r\n\r\n /**\r\n * @description Checks value is an Error instance.\r\n * @param value Candidate value.\r\n * @returns True when value is Error.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isError(value: unknown): value is Error {\r\n return value instanceof Error\r\n },\r\n\r\n /**\r\n * @description Checks value is a plain object record.\r\n * @param value Candidate value.\r\n * @returns True when value is object record.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isObjectRecord(value: unknown): value is Readonly<Dictionary<unknown>> {\r\n if (!Guards.isDefined(value)) {\r\n return false\r\n }\r\n\r\n return Object.prototype.toString.call(value) === OBJECT_TAG\r\n },\r\n\r\n /**\r\n * @description Checks value is an object (not null).\r\n * @param value Candidate value.\r\n * @returns True when value is object.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isObject(value: unknown): value is object {\r\n return typeof value === 'object' && Guards.isDefined(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is PromiseLike.\r\n * @param value Candidate value.\r\n * @returns True when value has then function.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isPromiseLike<TValue>(value: unknown): value is PromiseLike<TValue> {\r\n if (!Guards.isDefined(value)) {\r\n return false\r\n }\r\n\r\n if (!Guards.isObject(value) && !Guards.isFunction(value)) {\r\n return false\r\n }\r\n\r\n const thenMember = (value as Dictionary<unknown>)['then']\r\n return Guards.isFunction(thenMember)\r\n },\r\n} as const)\r\n","import { Guards } from './guards.utils'\r\n\r\nexport const StringUtils = Object.freeze({\r\n /**\r\n * @description Inserisce un underscore (_) tra la fine di una parola e l'inizio della successiva in formato camelCase o PascalCase.\r\n * @param input Stringa in input (es. \"CreateUser\").\r\n * @returns Stringa separata da underscore (es. \"Create_User\").\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2026-09-18\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\n splitCamelCaseWithUnderscore(input: string): string {\r\n if (!Guards.isString(input) || Guards.isNullOrEmpty(input)) return input\r\n return input.replace(/([a-z])([A-Z])/g, '$1_$2')\r\n },\r\n /**\r\n * @description Converts a string to camelCase.\r\n * @param input Input string (supports snake_case, kebab-case, or space-separated).\r\n * @returns camelCase string.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n camelCase(input: string): string {\r\n const segments = input.split(/[-_\\s]+/)\r\n const [first, ...rest] = segments\r\n const head = Guards.isDefined(first) ? first.toLowerCase() : ''\r\n return head + rest.map((seg) => seg.charAt(0).toUpperCase() + seg.slice(1)).join('')\r\n },\r\n /**\r\n * @description Converts a string to PascalCase.\r\n * @param input Input string (supports snake_case, kebab-case, space-separated, or camelCase).\r\n * @returns PascalCase string.\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2026-09-18\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\n pascalCase(input: string): string {\r\n if (!Guards.isString(input) || Guards.isNullOrEmpty(input)) return ''\r\n\r\n const segments = input.split(/[-_\\s]+/)\r\n\r\n return segments\r\n .filter((seg) => seg.length > 0)\r\n .map((seg) => {\r\n // Se il segmento è tutto maiuscolo (es. CREATE), lo normalizziamo in minuscolo per evitare cREATE.\r\n // Altrimenti, preserviamo il casing interno originale (es. UserService resta UserService).\r\n const normalized = seg === seg.toUpperCase() ? seg.toLowerCase() : seg\r\n return normalized.charAt(0).toUpperCase() + normalized.slice(1)\r\n })\r\n .join('')\r\n },\r\n} as const)\r\n","export * from './guards.utils'\r\nexport * from './string.utils'\r\n","export * from './constants'\r\nexport type * from './types'\r\nexport * from './utils'\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService } from '../../../../domain'\r\n\r\nexport class GenerateCommandCoreGenerator {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(\r\n pascalName: string,\r\n lowerName: string,\r\n tokenPrefix: string,\r\n componentDir: string,\r\n hasZod: boolean,\r\n hasDrizzle: boolean,\r\n ): Promise<void> {\r\n // 1. Command\r\n const commandContent = `import { Command } from '@xeno-js/core';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Please replace <any> with your specific payload and response types.\r\n */\r\nexport class ${pascalName}Command extends Command<any> {\r\n constructor(public readonly payload: any) {\r\n super('${tokenPrefix}_COMMAND_HANDLER');\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.command.ts`),\r\n commandContent,\r\n )\r\n\r\n // 2. Handler\r\n const handlerContent = `import type { IFactory, ResultType, UserContext } from '@xeno-js/core';\r\nimport { AppError, BaseHandler, Result } from '@xeno-js/core';\r\nimport { ${pascalName}Command } from './${lowerName}.command';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Please replace <any> with your specific response type.\r\n */\r\nexport class ${pascalName}Handler extends BaseHandler<${pascalName}Command, any> {\r\n constructor(\r\n identityFactory: IFactory<void, UserContext>\r\n ) {\r\n super(identityFactory);\r\n }\r\n\r\n public async executeAsync(request: ${pascalName}Command, singal: AbortSignal): Promise<ResultType<any>> {\r\n // TODO: Implement your business logic here\r\n\r\n return Result.ok();\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.handler.ts`),\r\n handlerContent,\r\n )\r\n\r\n // 3. Controller\r\n const controllerContent = `import type { IContextAccessor, IMediator, RequestContext, ResponseDto } from '@xeno-js/core';\r\nimport { BaseController } from '@xeno-js/core';\r\nimport { ${pascalName}Command } from './${lowerName}.command';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Please replace <any, any> with your specific request and response types.\r\n */\r\nexport class ${pascalName}Controller extends BaseController<any, any> {\r\n constructor(\r\n requestContext: IContextAccessor<RequestContext>,\r\n mediator: IMediator,\r\n ) {\r\n super(requestContext, mediator);\r\n }\r\n\r\n public async handle(request: any): Promise<ResponseDto<any>> {\r\n const cmd = new ${pascalName}Command(request);\r\n const result = await this._send(cmd);\r\n\r\n if (!result.isOk()) {\r\n return this.fail(result.getErrorOrThrow(), 'Error during ${pascalName} operation');\r\n }\r\n\r\n return this.ok(result.getValueOrThrow());\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.controller.ts`),\r\n controllerContent,\r\n )\r\n\r\n // 4. Entity\r\n const entityContent = `import { Entity } from '@xeno-js/core';\r\n\r\nexport interface ${pascalName}Props {\r\n // TODO: Define your entity properties\r\n}\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Adjust the properties and types according to your domain logic.\r\n */\r\nexport class ${pascalName} extends Entity<${pascalName}Props> {\r\n private constructor(props: ${pascalName}Props, id?: string) {\r\n super(props, id);\r\n }\r\n\r\n static create(props: ${pascalName}Props, id?: string): ${pascalName} {\r\n return new ${pascalName}(props, id);\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.entity.ts`),\r\n entityContent,\r\n )\r\n\r\n // 5. Schema Zod (Condizionale)\r\n if (hasZod) {\r\n const zodContent = `import { z } from 'zod';\r\nimport { ZodUtils } from '@xeno-js/core';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Define the actual Zod validation schema for your command payload.\r\n */\r\nexport const ${pascalName}Schema = ZodUtils.createCommandSchema({\r\n payload: z.any() // TODO: Update with strict validation\r\n});\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.schema-zod.ts`),\r\n zodContent,\r\n )\r\n }\r\n\r\n // 6. Schema DB (Condizionale)\r\n if (hasDrizzle) {\r\n const dbContent = `import { pgTable, text, timestamp } from 'drizzle-orm/pg-core';\r\n// Note: If you are using SQLite, change the import to 'drizzle-orm/sqlite-core' and update the table definition.\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Update the schema definition with your actual database columns.\r\n */\r\nexport const ${lowerName}s = pgTable('${lowerName}s', {\r\n id: text('id').primaryKey(),\r\n createdAt: timestamp('created_at').defaultNow(),\r\n updatedAt: timestamp('updated_at').defaultNow().$onUpdate(() => new Date()),\r\n});\r\n\r\nexport type ${pascalName}Dto = typeof ${lowerName}s.$inferSelect;\r\nexport type New${pascalName}Dto = typeof ${lowerName}s.$inferInsert;\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.schema-db.ts`),\r\n dbContent,\r\n )\r\n }\r\n\r\n // 7. Module\r\n const moduleContent = `import type { IServiceContainer, IConfigurationService } from '@xeno-js/core';\r\nimport { TOKENS } from '@xeno-js/core';\r\nimport { ${pascalName}Controller } from './${lowerName}.controller';\r\nimport { ${pascalName}Handler } from './${lowerName}.handler';\r\n\r\nexport const ${pascalName}Module = Object.freeze({\r\n register(opts: IServiceContainer<any>, _config: IConfigurationService): void {\r\n opts.addTransient('${tokenPrefix}_COMMAND_CONTROLLER', (c) => new ${pascalName}Controller(c.resolve(TOKENS.REQUEST_CONTEXT), c.resolve(TOKENS.MEDIATOR)));\r\n opts.addScoped('${tokenPrefix}_COMMAND_HANDLER', (c) => new ${pascalName}Handler(c.resolve(TOKENS.USER_CONTEXT_FACTORY)));\r\n\r\n /*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Please copy and paste the following tokens to your MyRegistry interface (usually in src/registry.ts):\r\n *\r\n * ${tokenPrefix}_COMMAND_CONTROLLER: IController<any, any>;\r\n * ${tokenPrefix}_COMMAND_HANDLER: IHandler<${pascalName}Command, any>;\r\n */\r\n }\r\n} as const);\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.module.ts`),\r\n moduleContent,\r\n )\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService } from '../../../../domain'\r\n\r\nexport class GenerateQueryCoreGenerator {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(\r\n pascalName: string,\r\n lowerName: string,\r\n tokenPrefix: string,\r\n componentDir: string,\r\n hasZod: boolean,\r\n ): Promise<void> {\r\n const queryContent = `import { BaseQuery } from '@xeno-js/core';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Please replace <any> with your specific payload and response types.\r\n */\r\nexport class ${pascalName}Query extends BaseQuery<any> {\r\n constructor(public readonly payload: any) {\r\n super(\r\n '${tokenPrefix}_QUERY_HANDLER', \r\n // Default cache options:\r\n {\r\n ttl: 60,\r\n cacheKey: \\`${lowerName}:\\${JSON.stringify(payload)}\\`,\r\n bypassCache: false,\r\n consistentRead: false\r\n isUserScoped: false,\r\n }\r\n );\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.query.ts`),\r\n queryContent,\r\n )\r\n\r\n // 2. Handler\r\n const handlerContent = `import type { IFactory, ResultType, UserContext } from '@xeno-js/core';\r\nimport { AppError, BaseHandler, Result } from '@xeno-js/core';\r\nimport { ${pascalName}Query } from './${lowerName}.query';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Please replace <any> with your specific response type.\r\n */\r\nexport class ${pascalName}Handler extends BaseHandler<${pascalName}Query, any> {\r\n constructor(\r\n identityFactory: IFactory<void, UserContext>\r\n // TODO: Inject your ReadDao or DataSource here\r\n ) {\r\n super(identityFactory);\r\n }\r\n\r\n public async executeAsync(request: ${pascalName}Query, singal: AbortSignal): Promise<ResultType<any>> {\r\n // TODO: Implement your query logic here\r\n\r\n return Result.ok();\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.handler.ts`),\r\n handlerContent,\r\n )\r\n\r\n // 3. Controller\r\n const controllerContent = `import type { IContextAccessor, IMediator, RequestContext, ResponseDto } from '@xeno-js/core';\r\nimport { BaseController } from '@xeno-js/core';\r\nimport { ${pascalName}Query } from './${lowerName}.query';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Please replace <any, any> with your specific request and response types.\r\n */\r\nexport class ${pascalName}Controller extends BaseController<any, any> {\r\n constructor(\r\n requestContext: IContextAccessor<RequestContext>,\r\n mediator: IMediator,\r\n ) {\r\n super(requestContext, mediator);\r\n }\r\n\r\n public async handle(request: any): Promise<ResponseDto<any>> {\r\n const query = new ${pascalName}Query(request);\r\n const result = await this._query(query);\r\n\r\n if (!result.isOk()) {\r\n return this.fail(result.getErrorOrThrow(), 'Error during ${pascalName} operation');\r\n }\r\n\r\n return this.ok(result.getValueOrThrow());\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.controller.ts`),\r\n controllerContent,\r\n )\r\n\r\n // 4. Schema Zod\r\n if (hasZod) {\r\n const zodContent = `import { z } from 'zod';\r\nimport { ZodUtils } from '@xeno-js/core';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Define the actual Zod validation schema for your query payload.\r\n */\r\nexport const ${pascalName}Schema = ZodUtils.createQuerySchema({\r\n payload: z.any() // TODO: Update with strict validation\r\n});\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.schema-zod.ts`),\r\n zodContent,\r\n )\r\n }\r\n\r\n // 5. Module\r\n const moduleContent = `import type { IServiceContainer, IConfigurationService } from '@xeno-js/core';\r\nimport { TOKENS } from '@xeno-js/core';\r\nimport { ${pascalName}Controller } from './${lowerName}.controller';\r\nimport { ${pascalName}Handler } from './${lowerName}.handler';\r\n\r\nexport const ${pascalName}Module = Object.freeze({\r\n register(opts: IServiceContainer<any>, _config: IConfigurationService): void {\r\n opts.addTransient('${tokenPrefix}_QUERY_CONTROLLER', (c) => new ${pascalName}Controller(c.resolve(TOKENS.REQUEST_CONTEXT), c.resolve(TOKENS.MEDIATOR)));\r\n opts.addScoped('${tokenPrefix}_QUERY_HANDLER', (c) => new ${pascalName}Handler(c.resolve(TOKENS.USER_CONTEXT_FACTORY)));\r\n\r\n /*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * Please copy and paste the following tokens to your MyRegistry interface (usually in src/registry.ts):\r\n *\r\n * ${tokenPrefix}_QUERY_CONTROLLER: IController<any, any>;\r\n * ${tokenPrefix}_QUERY_HANDLER: IHandler<${pascalName}Query, any>;\r\n */\r\n }\r\n} as const);\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.module.ts`),\r\n moduleContent,\r\n )\r\n }\r\n}\r\n","import fs from 'node:fs/promises'\r\nimport path from 'node:path'\r\n\r\nimport type { IFileService } from '../../../../domain'\r\nimport { COMMAND_CONSTANTS, Guards, StringUtils } from '../../../../shared'\r\n\r\nexport class CqrsGenerator {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(\r\n targetDir: string,\r\n name: string,\r\n type: 'command' | 'query',\r\n outputPath?: string,\r\n ): Promise<void> {\r\n const pascalName = StringUtils.pascalCase(name)\r\n const tokenPrefix = StringUtils.splitCamelCaseWithUnderscore(pascalName).toUpperCase()\r\n const lowerName = name.toLowerCase()\r\n const destinationFolder = outputPath ?? lowerName\r\n const componentDir = path.join(targetDir, 'src', destinationFolder)\r\n\r\n let hasZod = false\r\n let hasDrizzle = false\r\n\r\n try {\r\n const pkgJsonStr = await fs.readFile(path.join(targetDir, 'package.json'), 'utf8')\r\n const pkgJson = JSON.parse(pkgJsonStr) as {\r\n dependencies?: Record<string, string>\r\n devDependencies?: Record<string, string>\r\n }\r\n const deps = { ...(pkgJson.dependencies ?? {}), ...(pkgJson.devDependencies ?? {}) }\r\n hasZod = !!Guards.isDefined(deps['zod'])\r\n hasDrizzle = !!Guards.isDefined(deps['drizzle-orm'])\r\n } catch (error) {\r\n console.warn(\r\n ' Warning: Could not read package.json. Assuming Zod and Drizzle are not installed.',\r\n error,\r\n )\r\n }\r\n\r\n switch (type) {\r\n case COMMAND_CONSTANTS.COMMAND: {\r\n const { GenerateCommandCoreGenerator } = await import('./generate-command.generator.js')\r\n const generator = new GenerateCommandCoreGenerator(this._fileService)\r\n return generator.generate(\r\n pascalName,\r\n lowerName,\r\n tokenPrefix,\r\n componentDir,\r\n hasZod,\r\n hasDrizzle,\r\n )\r\n }\r\n case COMMAND_CONSTANTS.QUERY: {\r\n const { GenerateQueryCoreGenerator } = await import('./generate-query.generator.js')\r\n const generatorQuery = new GenerateQueryCoreGenerator(this._fileService)\r\n return generatorQuery.generate(pascalName, lowerName, tokenPrefix, componentDir, hasZod)\r\n }\r\n default:\r\n throw new Error(`Unsupported generator type: '${String(type)}'. Use 'command' or 'query'.`)\r\n }\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService } from '../../../../domain'\r\n\r\nexport class GenerateCommandVueGenerator {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(\r\n pascalName: string,\r\n lowerName: string,\r\n tokenPrefix: string,\r\n componentDir: string,\r\n ): Promise<void> {\r\n // 1. Command (Application)\r\n const commandContent = `import { Command } from '@xeno-js/vue';\r\n\r\nexport class ${pascalName}Command extends Command {\r\n constructor() {\r\n super('${tokenPrefix}_COMMAND');\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.command.ts`),\r\n commandContent,\r\n )\r\n\r\n const handlerContent = `import type { IHandler, ResultType } from '@xeno-js/vue';\r\nimport { AppError, Result } from '@xeno-js/vue';\r\nimport type { ${pascalName}Command } from './${lowerName}.command';\r\nimport type { ${pascalName}Response } from './${lowerName}.model';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n * \r\n * Please register your handler in the IoC container (e.g. src/bootstrap.ts) and add its token to MyRegistry.\r\n *\r\n * 1. In src/registry.ts:\r\n * ${tokenPrefix}_HANDLER: IHandler<${pascalName}Command, ${pascalName}Response>;\r\n * \r\n * 2. In src/bootstrap.ts:\r\n * .addServices((config, register) => {\r\n * register('${tokenPrefix}_HANDLER', new ${pascalName}Handler());\r\n * });\r\n */\r\nexport class ${pascalName}Handler implements IHandler<${pascalName}Command, ${pascalName}Response> {\r\n constructor(\r\n // TODO: Inject your remote DataSources or other services here\r\n ) {}\r\n\r\n public async handle(command: ${pascalName}Command, signal: AbortSignal): Promise<ResultType<${pascalName}Response>> {\r\n AppError.throwIfAborted(signal, this.constructor.name);\r\n\r\n // TODO: Implement your frontend business logic or API calls here\r\n return Result.ok();\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.handler.ts`),\r\n handlerContent,\r\n )\r\n\r\n const composableContent = `import { ref } from 'vue';\r\nimport { AppError, Result, type ApiResponseDto, type ResultType } from '@xeno-js/vue';\r\nimport { ServicesUtils } from '@/use-app';\r\nimport { ${pascalName}Command } from './${lowerName}.command';\r\nimport type { ${pascalName}Request, ${pascalName}Response } from './${lowerName}.model';\r\n\r\n/*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n *\r\n * Please register your handler in the IoC container (e.g. src/bootstrap.ts) and add its token to MyRegistry.\r\n *\r\n * 1. In src/registry.ts:\r\n * ${tokenPrefix}_HANDLER: IHandler<${pascalName}Command, ${pascalName}Response>;\r\n * \r\n * 2. In src/bootstrap.ts:\r\n * .addServices((config, register) => {\r\n * register('${tokenPrefix}_HANDLER', new ${pascalName}Handler());\r\n * });\r\n */\r\nexport function use${pascalName}() {\r\n const loading = ref(false);\r\n const error = ref<string | null>(null);\r\n let abortController: AbortController | null = null;\r\n\r\n const execute = async (payload: ${pascalName}Request): Promise<ResultType<${pascalName}Response>> => {\r\n abortController = new AbortController();\r\n \r\n if (loading.value) return Result.fail(AppError.create({\r\n name: '${pascalName}Command',\r\n message: '${pascalName}Command is already in progress',\r\n code: '${tokenPrefix}_COMMAND_ALREADY_IN_PROGRESS',\r\n status: 500,\r\n cause: new Error('${tokenPrefix}_COMMAND_ALREADY_IN_PROGRESS'),\r\n }));\r\n loading.value = true;\r\n error.value = null;\r\n\r\n try {\r\n // Resolve mediator and handler from the container\r\n const { mediator, ${tokenPrefix}_HANDLER: handler } = ServicesUtils.useApp();\r\n const command = new ${pascalName}Command();\r\n\r\n const result = await mediator.send(command, async () => {\r\n return await handler.handle(command, abortController?.signal);\r\n });\r\n\r\n if (!result.isOk()) {\r\n error.value = result.getErrorOrThrow().message;\r\n }\r\n\r\n return result;\r\n } finally {\r\n loading.value = false;\r\n }\r\n };\r\n\r\n const abort = () => {\r\n if (abortController) {\r\n abortController.abort();\r\n }\r\n };\r\n\r\n // Automatically cancel pending operations when the component unmounts\r\n onUnmounted(() => {\r\n abort();\r\n });\r\n\r\n return { loading, error, execute };\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `use-${lowerName}.composable.ts`),\r\n composableContent,\r\n )\r\n\r\n // 3. Domain Model (Domain)\r\n const modelContent = `export interface ${pascalName}Request {\r\n // TODO: Define your request payload properties here\r\n}\r\n\r\nexport interface ${pascalName}Response {\r\n // TODO: Define your response properties here\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.model.ts`),\r\n modelContent,\r\n )\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService } from '../../../../domain'\r\n\r\nexport class GenerateQueryVueGenerator {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(\r\n pascalName: string,\r\n lowerName: string,\r\n tokenPrefix: string,\r\n componentDir: string,\r\n ): Promise<void> {\r\n // 1. Query (Application)\r\n const queryContent = `import { Query } from '@xeno-js/vue';\r\nimport type { ${pascalName}Response } from './${lowerName}.model';\r\n\r\nexport class ${pascalName}Query extends Query<${pascalName}Response> {\r\n constructor() {\r\n super('${tokenPrefix}_QUERY', {\r\n ttl: 60,\r\n cacheKey: \\`${lowerName}.query\\`,\r\n bypassCache: false,\r\n consistentRead: false,\r\n isUserScoped: true\r\n });\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.query.ts`),\r\n queryContent,\r\n )\r\n\r\n const handlerContent = `import type { IHandler, ResultType } from '@xeno-js/vue';\r\nimport { AppError, Result } from '@xeno-js/vue';\r\nimport type { ${pascalName}Query } from './${lowerName}.query';\r\nimport type { ${pascalName}Response } from './${lowerName}.model';\r\n\r\n /*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n *\r\n * Please register your handler in the IoC container (e.g. src/bootstrap.ts) and add its token to MyRegistry.\r\n *\r\n * 1. In src/registry.ts:\r\n * ${tokenPrefix}_HANDLER: IHandler<${pascalName}Query, ${pascalName}Response>;\r\n * \r\n * 2. In src/bootstrap.ts:\r\n * .addServices((config, register) => {\r\n * register('${tokenPrefix}_HANDLER', new ${pascalName}Handler());\r\n * });\r\n */\r\nexport class ${pascalName}Handler implements IHandler<${pascalName}Query, ${pascalName}Response> {\r\n constructor(\r\n // TODO: Inject your remote DataSources or other services here\r\n ) {}\r\n\r\n public async handle(query: ${pascalName}Query, signal: AbortSignal): Promise<ResultType<${pascalName}Response>> {\r\n AppError.throwIfAborted(signal, this.constructor.name);\r\n\r\n // TODO: Implement your frontend business logic or API calls here\r\n return Result.ok();\r\n }\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.handler.ts`),\r\n handlerContent,\r\n )\r\n\r\n // 2. Composable (Presentation)\r\n const composableContent = `import { ref } from 'vue';\r\nimport { AppError, Result, type ApiResponseDto, type ResultType } from '@xeno-js/vue';\r\nimport { ServicesUtils } from '@/use-app';\r\nimport { ${pascalName}Query } from './${lowerName}.query';\r\nimport type { ${pascalName}Response } from './${lowerName}.model';\r\n\r\nexport function use${pascalName}() {\r\n const loading = ref(false);\r\n const error = ref<string | null>(null);\r\n const data = ref<${pascalName}Response | null>(null);\r\n let abortController: AbortController | null = null;\r\n\r\n /*\r\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\r\n *\r\n * Please register your handler in the IoC container (e.g. src/bootstrap.ts) and add its token to MyRegistry.\r\n *\r\n * 1. In src/registry.ts:\r\n * ${tokenPrefix}_HANDLER: IHandler<${pascalName}Query, ${pascalName}Response>;\r\n * \r\n * 2. In src/bootstrap.ts:\r\n * .addServices((config, register) => {\r\n * register('${tokenPrefix}_HANDLER', new ${pascalName}Handler());\r\n * });\r\n */\r\nconst fetch = async (): Promise<ResultType<${pascalName}Response>> => {\r\n abortController = new AbortController();\r\n\r\n if (loading.value) return Result.fail(AppError.create({\r\n name: '${pascalName}Query',\r\n message: '${pascalName}Query is already in progress',\r\n code: '${tokenPrefix}_QUERY_ALREADY_IN_PROGRESS',\r\n status: 500,\r\n cause: new Error('${tokenPrefix}_QUERY_ALREADY_IN_PROGRESS'),\r\n }));\r\n loading.value = true;\r\n error.value = null;\r\n\r\n try {\r\n try {\r\n // Resolve mediator and handler from the container\r\n const { mediator, ${tokenPrefix}_HANDLER: handler } = ServicesUtils.useApp();\r\n const query = new ${pascalName}Query();\r\n\r\n const result = await mediator.query(query, async () => {\r\n return await handler.handle(query, abortController?.signal);\r\n });\r\n\r\n if (result.isOk()) {\r\n data.value = result.getValueOrThrow();\r\n } else {\r\n error.value = result.getErrorOrThrow().message;\r\n }\r\n\r\n return result;\r\n } finally {\r\n loading.value = false;\r\n }\r\n };\r\n\r\n const abort = () => {\r\n if (abortController) {\r\n abortController.abort();\r\n }\r\n };\r\n\r\n // Automatically cancel pending operations when the component unmounts\r\n onUnmounted(() => {\r\n abort();\r\n });\r\n\r\n return { loading, error, data, fetch };\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `use-${lowerName}.composable.ts`),\r\n composableContent,\r\n )\r\n\r\n // 3. Domain Model (Domain)\r\n const modelContent = `export interface ${pascalName}Response {\r\n // TODO: Define your response properties here\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(componentDir, `${lowerName}.model.ts`),\r\n modelContent,\r\n )\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService } from '../../../../domain'\r\nimport { COMMAND_CONSTANTS, StringUtils } from '../../../../shared'\r\n\r\nexport class CqrsVueGenerator {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(\r\n targetDir: string,\r\n name: string,\r\n type: 'command' | 'query',\r\n outputPath?: string,\r\n ): Promise<void> {\r\n const pascalName = StringUtils.pascalCase(name)\r\n const tokenPrefix = StringUtils.splitCamelCaseWithUnderscore(pascalName).toUpperCase()\r\n const lowerName = name.toLowerCase()\r\n const destinationFolder = outputPath ?? lowerName\r\n const componentDir = path.join(targetDir, 'src', destinationFolder)\r\n\r\n switch (type) {\r\n case COMMAND_CONSTANTS.COMMAND: {\r\n const { GenerateCommandVueGenerator } = await import('./generate-command-vue.generator.js')\r\n const generator = new GenerateCommandVueGenerator(this._fileService)\r\n return generator.generate(pascalName, lowerName, tokenPrefix, componentDir)\r\n }\r\n case COMMAND_CONSTANTS.QUERY: {\r\n const { GenerateQueryVueGenerator } = await import('./generate-query-vue.generator.js')\r\n const generatorQuery = new GenerateQueryVueGenerator(this._fileService)\r\n return generatorQuery.generate(pascalName, lowerName, tokenPrefix, componentDir)\r\n }\r\n default:\r\n throw new Error(`Unsupported generator type: '${String(type)}'. Use 'command' or 'query'.`)\r\n }\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class PackageJsonVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n const packageJson = {\r\n name: options.targetDir,\r\n version: '1.0.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'vite',\r\n build: 'vue-tsc -b && vite build',\r\n preview: 'vite preview',\r\n g: 'xeno-js generate',\r\n } as Record<string, string>,\r\n dependencies: {\r\n '@xeno-js/vue': 'latest',\r\n 'vue': '^3.5.0',\r\n } as Record<string, string>,\r\n devDependencies: {\r\n '@types/node': '^20.0.0',\r\n '@vitejs/plugin-vue': '^5.1.0',\r\n 'typescript': '^5.5.0',\r\n 'vite': '^5.4.0',\r\n 'vue-tsc': '^2.1.0',\r\n } as Record<string, string>,\r\n }\r\n\r\n if (options.axios) packageJson.dependencies['axios'] = '^1.7.0'\r\n if (options.cockatiel) packageJson.dependencies['cockatiel'] = '^4.0.0'\r\n if (options.supabase) packageJson.dependencies['@supabase/supabase-js'] = '^2.45.0'\r\n if (options.sentry) packageJson.dependencies['@sentry/vue'] = '^8.28.0'\r\n if (options.pinia) packageJson.dependencies['pinia'] = '^2.2.0'\r\n if (options.router) packageJson.dependencies['vue-router'] = '^4.4.0'\r\n if (options.zod) packageJson.dependencies['zod'] = '^4.4.3'\r\n\r\n if (options.tailwind) {\r\n packageJson.devDependencies['tailwindcss'] = '^4.0.0'\r\n packageJson.devDependencies['@tailwindcss/vite'] = '^4.0.0'\r\n }\r\n\r\n const filePath = path.join(projectPath, 'package.json')\r\n await this._fileService.writeFileRecursive(filePath, JSON.stringify(packageJson, null, 2))\r\n }\r\n}\r\n","// src/infrastructure/generators/viteconfig.generator.ts\r\nimport path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class ViteconfigGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n const tailwindImport = options.tailwind ? `\\nimport tailwindcss from '@tailwindcss/vite';` : ''\r\n const tailwindPlugin = options.tailwind ? `\\n tailwindcss(),` : ''\r\n\r\n const content = `import { defineConfig } from 'vite';\r\nimport vue from '@vitejs/plugin-vue';${tailwindImport}\r\nimport path from 'node:path';\r\n\r\nexport default defineConfig({\r\n plugins: [\r\n vue(),${tailwindPlugin}\r\n ],\r\n resolve: {\r\n alias: {\r\n '@': path.resolve(__dirname, './src'),\r\n },\r\n },\r\n server: {\r\n port: 5173,\r\n }\r\n});\r\n`\r\n const filePath = path.join(projectPath, 'vite.config.ts')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","// src/infrastructure/generators/env-vue.generator.ts\r\nimport path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class EnvVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n let content = `# ─────────────────────────────────────────────────────────────────────────────\r\n# Xeno VUE APPLICATION ENVIRONMENT VARIABLES\r\n# ─────────────────────────────────────────────────────────────────────────────\r\nVITE_APP_ENV=development\r\n`\r\n\r\n if (options.axios) {\r\n content += `\\n# --- Axios ---\r\nVITE_API_BASE_URL=http://localhost:3000\r\n`\r\n }\r\n\r\n if (options.supabase) {\r\n content += `\\n# --- Authentication (Supabase) ---\r\nVITE_SUPABASE_URL=https://your-project.supabase.co\r\nVITE_SUPABASE_KEY=your-anon-key\r\n`\r\n }\r\n\r\n if (options.sentry) {\r\n content += `\\n# --- Error Tracking (Sentry) ---\r\nVITE_SENTRY_DSN=https://your-sentry-dsn@o0.ingest.sentry.io/0\r\n`\r\n }\r\n\r\n await this._fileService.writeFileRecursive(path.join(projectPath, '.env'), content)\r\n await this._fileService.writeFileRecursive(path.join(projectPath, '.env.example'), content)\r\n }\r\n}\r\n","// src/infrastructure/generators/tsconfig-vue.generator.ts\r\nimport path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class TsconfigVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, _options: VueOptions): Promise<void> {\r\n const tsconfig = {\r\n compilerOptions: {\r\n target: 'ES2022',\r\n useDefineForClassFields: true,\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n strict: true,\r\n jsx: 'preserve',\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n esModuleInterop: true,\r\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\r\n skipLibCheck: true,\r\n noEmit: true,\r\n types: ['vite/client'],\r\n paths: {\r\n '@/*': ['./src/*'],\r\n },\r\n },\r\n include: ['src/**/*.ts', 'src/**/*.d.ts', 'src/**/*.tsx', 'src/**/*.vue'],\r\n }\r\n\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'tsconfig.json'),\r\n JSON.stringify(tsconfig, null, 2),\r\n )\r\n }\r\n}\r\n","// src/infrastructure/generators/vue-readme.generator.ts\r\nimport path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class ReadmeVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n const content = `# ${options.targetDir}\r\n\r\n<div align=\"center\">\r\n <img src=\"logo/logo.png\" alt=\"Xeno Logo\" width=\"140\" />\r\n\r\n <h1>Xeno Vue</h1>\r\n\r\n <p><em>Enterprise-grade DDD & CQRS framework for Vue.js</em></p>\r\n\r\n <p>\r\n <a href=\"https://github.com/xeno-js/xeno-js\">\r\n <img src=\"https://img.shields.io/badge/Powered%20by-Xeno-blueviolet?style=flat-square\" alt=\"Powered by Xeno\" />\r\n </a>\r\n <a href=\"https://github.com/xeno-js/xeno-fe/blob/main/LICENSE\">\r\n <img src=\"https://img.shields.io/npm/l/@xeno-js/vue?style=flat-square\" alt=\"License: ISC\" />\r\n </a>\r\n <a href=\"https://www.npmjs.com/package/@xeno-js/vue\">\r\n <img src=\"https://img.shields.io/npm/v/@xeno-js/vue?style=flat-square\" alt=\"NPM Version\" />\r\n </a>\r\n <a href=\"https://buymeacoffee.com/xenojs\">\r\n <img src=\"https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-FFdd00?style=flat-square&logo=buy-me-a-coffee&logoColor=black\" alt=\"Buy Me A Coffee\" />\r\n </a>\r\n </p>\r\n</div>\r\n\r\n---\r\n\r\n## What is Xeno Vue?\r\n\r\n**Xeno Vue** (\\`@xeno-js/vue\\`) is an enterprise-grade, deterministic\r\narchitectural framework that brings the strictness of **Domain-Driven Design\r\n(DDD)** and **Command Query Responsibility Segregation (CQRS)** natively to the\r\nbrowser.\r\n\r\nBy shifting operational logic, remote data fetching, and state mutations away\r\nfrom Vue components and Pinia stores, Xeno ensures your frontend architecture\r\nremains pristine, highly testable, and completely decoupled from the UI layer.\r\nIt treats the browser as a complex distributed client, not just a document\r\nviewer.\r\n\r\n---\r\n\r\n## 💡 Why Choose Xeno Vue?\r\n\r\nModern frontend development often leads to \"Spaghetti State\" where API calls,\r\nbusiness rules, and DOM manipulations are tightly coupled inside components.\r\nXeno Vue fixes this with an emphasis on pure Dependency Injection (DI) and clean\r\nboundaries.\r\n\r\n- **Zero-Magic Dependency Injection**: Xeno provides an explicit\r\n \\`XenoAppBuilder\\` to construct your IoC container at bootstrap. No hidden Vue\r\n plugins doing implicit injections. You have total control over the dependency\r\n graph.\r\n- **Total UI Decoupling**: Vue components act strictly as the Presentation\r\n Layer. Business logic, API calls, and CQRS handlers live in pure, isolated\r\n TypeScript classes. You can swap Vue for React tomorrow without touching your\r\n core domain.\r\n- **Enterprise-Grade Client Resiliency**: The browser is a hostile, unreliable\r\n environment. Xeno Vue natively integrates \\`Cockatiel\\` and \\`Axios\\` to provide\r\n out-of-the-box circuit breakers, retries with jitter, and bulkheads directly\r\n in the client.\r\n- **Frontend Middleware Pipeline**: Handle Authentication, CSRF validation,\r\n aggressive Query Caching, and Performance logging _before_ a command is\r\n executed or an API call fires, using the native \\`Mediator\\` pipeline.\r\n\r\n---\r\n\r\n## 📖 Documentation & Getting Started\r\n\r\nTo explore the architecture, programmatic configurations, and extension\r\nworkflows of Xeno Vue, read the full technical manuals located inside the main\r\ndocumentation hub:\r\n\r\n- **[Framework Documentation Repository](https://www.xeno-js.it/vue/overview)**\r\n\r\nInside, you will find exhaustive, step-by-step assembly guides covering frontend\r\nIoC building (\\`XenoAppBuilder\\`), Vue \\`Provide/Inject\\` boundaries, and CQRS\r\ncomposables.\r\n\r\n---\r\n\r\n## 🚀 Live Executable Demos\r\n\r\nWant to see how Xeno Vue works? Check out the functional example application\r\nshowcasing end-to-end command/query segregation, resilient HTTP fetching, and\r\npure Composition API integration.\r\n\r\n- **[Xeno Vue Demo Architecture](https://www.xeno-js.it/demo)**\r\n\r\n---\r\n\r\n## 📦 Installation\r\n\r\nInstall the Vue package:\r\n\r\n\\`\\`\\`bash\r\nnpm install @xeno-js/vue\r\n\r\n\\`\\`\\`\r\n\r\nXeno uses **Optional Peer Dependencies**. You only install the external\r\nlibraries you actually need.\r\n\r\n\\`\\`\\`bash\r\n# Example: Install tools only if you enable them in the builder\r\nnpm install axios cockatiel zod @supabase/supabase-js @sentry/vue\r\n\r\n\\`\\`\\`\r\n\r\n---\r\n\r\n## ⚡ Bootstrapping & Component Example\r\n\r\nBelow is an architectural example of how to configure the Xeno \\`XenoAppBuilder\\`,\r\ninject it into the Vue application, and consume it using Composition API\r\nComposables.\r\n\r\n### 1. Initialize the Container (\\`src/bootstrap.ts\\`)\r\n\r\n\\`\\`\\`typescript\r\nimport { XenoAppBuilder, LOG_LEVEL, TOKENS } from '@xeno-js/vue'\r\nimport { BffRemoteDataSource } from './infrastructure'\r\n\r\nimport type { RemoteDataSource, XenoVueRegistry } from '@xeno-js/vue'\r\n\r\nexport type MyRegistry = XenoVueRegistry<{\r\n BFF_REMOTE_DS: RemoteDataSource\r\n}>\r\n\r\n// Create the root IoC container context for the browser\r\nconst builder = XenoAppBuilder.create<MyRegistry>()\r\n .addContext((opts) => {\r\n opts.contextAccessor = useContextStore()\r\n })\r\n .addLogger((opts, config) => {\r\n opts.console = config.get('VITE_APP_ENV') === 'development'\r\n opts.level = LOG_LEVEL.DEBUG\r\n })\r\n .addAuth((opts, config) => {\r\n opts.url = config.getOrThrow('VITE_SUPABASE_URL')\r\n opts.key = config.getOrThrow('VITE_SUPABASE_KEY')\r\n })\r\n .addHttpCore('BFF_REMOTE_DS', (opts, config) => {\r\n opts.client = {\r\n baseURL: config.getOrThrow('VITE_API_BASE_URL'),\r\n timeoutMs: 10000,\r\n }\r\n opts.resilience.retry.attempts = 3\r\n opts.factory = (http, resilience) =>\r\n new BffRemoteDataSource(http, resilience)\r\n })\r\n .addPipeline((config) => {\r\n config.queryCaching = true // Enable in-memory caching for Queries\r\n })\r\n\r\nexport async function bootstrap() {\r\n return await builder.build()\r\n}\r\n\\`\\`\\`\r\n\r\n### 2. Inject into Vue (\\`src/main.ts\\`)\r\n\r\n\\`\\`\\`typescript\r\nimport { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport { bootstrap } from './bootstrap'\r\nimport { XENO_SERVICES_KEY, ServicesUtils } from '@xeno-js/vue'\r\n\r\nasync function mountApp() {\r\n try {\r\n const app = createApp(App)\r\n const container = await bootstrap()\r\n\r\n // Provide the Xeno IoC container globally to all components\r\n app.provide(XENO_SERVICES_KEY, container)\r\n\r\n // Register global services utility for composables\r\n ServicesUtils.setGlobalServices(container)\r\n\r\n app.mount('#app')\r\n } catch (error) {\r\n console.error('Critical error during frontend bootstrap:', error)\r\n }\r\n}\r\n\r\nmountApp()\r\n\\`\\`\\`\r\n\r\n### 3. CQRS Composable Usage (\\`src/features/users/use-create-user.ts\\`)\r\n\r\n\\`\\`\\`typescript\r\nimport { ref } from 'vue'\r\nimport { Result } from '@xeno-js/shared'\r\nimport { ServicesUtils } from '@/use-app'\r\nimport { CreateUserCommand } from './create-user.command'\r\n\r\nexport function useCreateUser() {\r\n const loading = ref(false)\r\n const error = ref<string | null>(null)\r\n\r\n const execute = async (payload: { email: string; name: string }) => {\r\n if (loading.value) return Result.fail(new Error('Already executing'))\r\n loading.value = true\r\n error.value = null\r\n\r\n try {\r\n // Safely resolve the Mediator from the Xeno Container\r\n const { mediator, BFF_REMOTE_DS } = ServicesUtils.useApp()\r\n const command = new CreateUserCommand()\r\n\r\n const result = await mediator.send(command, async () => {\r\n const apiResult = await bffRemoteDs.post('/v1/users', payload)\r\n\r\n if (!apiResult.isOk()) return Result.fail(apiResult.getErrorOrThrow())\r\n return Result.ok(apiResult.getValueOrThrow())\r\n })\r\n\r\n if (!result.isOk()) {\r\n error.value = result.getErrorOrThrow().message\r\n }\r\n\r\n return result\r\n } finally {\r\n loading.value = false\r\n }\r\n }\r\n\r\n return { loading, error, execute }\r\n}\r\n\\`\\`\\`\r\n\r\n---\r\n\r\n## 🛠 Scaffold your project with CLI\r\n\r\nXeno includes an official CLI tool, \\`@xeno-js/cli\\`, designed to bootstrap your\r\nnew application in seconds. It offers an interactive setup for Vue projects,\r\ninstantly scaffolding the CQRS files, composables, and dependency injection\r\nboundaries.\r\n\r\n\\`\\`\\`bash\r\n# Generate a new Vue project\r\nnpx @xeno-js/cli new my-frontend-app --vue\r\n\r\n# Generate a Vue Command with its Composable\r\nnpx @xeno-js/cli g command CreateUser --vue\r\n\r\n\\`\\`\\`\r\n\r\nCheck the\r\n**[CLI Documentation](https://www.google.com/search?q=https://www.xeno-js.it/cli/overview&utm_source=gemini)**\r\nfor full options.\r\n\r\n---\r\n\r\n## 🤝 For Contributors\r\n\r\nWe welcome contributions to Xeno! To maintain the highest code quality and\r\nstability of the core framework, **direct pushes to the \\`main\\` and \\`develop\\`\r\nbranches are strictly prohibited.** Please follow this Git Flow to contribute:\r\n\r\n1. **Branch off from \\`develop**\\`: Create a new branch for your feature or\r\n bugfix.\r\n\r\n\\`\\`\\`bash\r\ngit checkout develop\r\ngit pull origin develop\r\ngit checkout -b feat/your-awesome-feature\r\n\r\n\\`\\`\\`\r\n\r\n2. **Make your changes**: Write your code and ensure it passes all local checks\r\n (linting, types, and tests).\r\n\r\n\\`\\`\\`bash\r\nnpm run check\r\n\r\n\\`\\`\\`\r\n\r\n3. **Commit your changes**: We enforce\r\n [Conventional Commits](https://www.conventionalcommits.org/?utm_source=gemini).\r\n Husky will verify your commit message format.\r\n4. **Commit Format:**\r\n\r\n\\`\\`\\`bash\r\nfeat(scope): add new feature\r\nfix(scope): resolve bug\r\nchore(scope): update dependencies\r\n\r\n\\`\\`\\`\r\n\r\n5. **Submit a Pull Request (PR)**: Push your branch to GitHub and open a Pull\r\n Request targeting the **\\`develop\\`** branch.\r\n6. **Review**: The repository owner will review your code, run pipeline tests,\r\n and merge it into \\`develop\\`.\r\n\r\n_Note: The \\`main\\` branch is strictly reserved for production releases. Code\r\nflows from feature branches ➡️ \\`develop\\` ➡️ \\`main\\`._\r\n\r\n### Scripts\r\n\r\n| Command | Description |\r\n| ----------------------- | ---------------------------------------------- |\r\n| \\`npm run build\\` | Builds the TypeScript source code into \\`dist/\\` |\r\n| \\`npm run typecheck\\` | Checks types without emitting files |\r\n| \\`npm run lint\\` | Runs ESLint |\r\n| \\`npm run format\\` | Formats code with Prettier |\r\n| \\`npm run test\\` | Runs the Vitest test suite |\r\n| \\`npm run test:coverage\\` | Runs tests and generates a coverage report |\r\n\r\n### Code Quality (Husky & Git Hooks)\r\n\r\nThis project strictly enforces code quality rules before pushing to the\r\nrepository:\r\n\r\n- **\\`pre-commit\\`**: Runs \\`lint-staged\\` on staged files (ESLint + Prettier).\r\n- **\\`commit-msg\\`**: Checks commit messages with \\`commitlint\\` (we use\r\n Conventional Commits).\r\n- **\\`pre-push\\`**: Runs type checking, linting, and testing before code leaves\r\n your machine.\r\n\r\n---\r\n\r\n## 🌱 Support & Appreciation\r\n\r\nBuilding, benchmarking, and maintaining a progressive, enterprise-ready\r\nopen-source framework requires a massive amount of continuous dedication and\r\narchitectural engineering.\r\n\r\nIf Xeno has brought value to your development workflows, helped decouple your\r\ncore business logic, or simplified your system infrastructure layout, consider\r\nsupporting its open-source lifecycle. Your backing directly accelerates our\r\nstrategic roadmap for new out-of-the-box transport integrations and keeps the\r\ndocumentation pristine.\r\n\r\n**Want to know how you can contribute or sponsor Xeno?** We rely on the\r\ncommitment of our community to keep the project independent and thriving.\r\nWhether you are an individual developer or a business using Xeno, your support\r\nmakes a real difference.\r\n\r\n👉\r\n**[Read our support guidelines and find out how to help](https://www.xeno-js.it/support-us)**\r\n\r\nThank you for being part of this decoupled open-source journey!\r\n\r\n<amp-bounce>\r\n</amp-bounce>\r\n<a href=\"https://www.buymeacoffee.com/xenojs\" target=\"_blank\">\r\n<img src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" height=\"42\" style=\"height: 42px !important;\" />\r\n</a>\r\n\r\n---\r\n\r\n## 🛡️ Powered by Xeno\r\n\r\nIf you are using Xeno in your project, let the world know! Add this badge to\r\nyour README:\r\n\r\n\\`\\`\\`html\r\n<a\r\n href=\"[https://github.com/xeno-js/xeno-fe](https://github.com/xeno-js/xeno-fe)\"\r\n target=\"_blank\"\r\n>\r\n <img\r\n src=\"[https://img.shields.io/badge/Powered%20by-Xeno-black?style=flat-square](https://img.shields.io/badge/Powered%20by-Xeno-black?style=flat-square)\"\r\n alt=\"Powered by Xeno\"\r\n height=\"20\"\r\n />\r\n</a>\r\n\\`\\`\\`\r\n\r\n## 📄 License\r\n\r\nCopyright (c) 2026 Xeno. Licensed under the\r\n[ISC License](https://www.google.com/search?q=LICENSE&utm_source=gemini).\r\n`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'README.md'), content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../domain'\r\nimport type { CoreOptions, ScaffoldingOptions } from '../../shared'\r\nimport { CORE_CONSTANTS } from '../../shared'\r\n\r\nexport class GitIgnoreGenerator implements IGenerator<ScaffoldingOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: ScaffoldingOptions): Promise<void> {\r\n let content = `# Dependencies\r\nnode_modules/\r\n\r\n# Build artifacts\r\ndist/\r\nout/\r\nbuild/\r\n\r\n# Environment variables\r\n# We ignore actual .env files for security, but keep .env.example for documentation\r\n.env\r\n.env.local\r\n.env.*\r\n!.env.example\r\n\r\n# Logs\r\n*.log\r\nlogs/\r\nnpm-debug.log*\r\n\r\n# Test coverage\r\ncoverage/\r\n.nyc_output/\r\n\r\n# OS and IDE\r\n.DS_Store\r\nThumbs.db\r\n.vscode/\r\n.idea/\r\n`\r\n\r\n if ((options as CoreOptions).database === CORE_CONSTANTS.SQL_LITE) {\r\n content += `\\n# SQLite Database\r\n*.sqlite\r\n*.sqlite3\r\n*.sqlite-journal\r\n`\r\n }\r\n\r\n // Ignora la cartella di compilazione locale di Vercel se l'ambiente lo richiede\r\n if ((options as CoreOptions).targetEnv === CORE_CONSTANTS.VERCEL) {\r\n content += `\\n# Vercel\r\n.vercel/\r\n`\r\n }\r\n\r\n const filePath = path.join(projectPath, '.gitignore')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class AppVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n // 2. src/App.vue\r\n const appVue = `<script setup lang=\"ts\">\r\n</script>\r\n\r\n<template>\r\n <div id=\"xeno-app\">\r\n ${options.router ? '<router-view />' : '<h1>Welcome to Xeno Vue App</h1>'}\r\n </div>\r\n</template>`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'src', 'App.vue'), appVue)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class BootstrapGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n // 4. src/bootstrap.ts\r\n let builderNodes = ` const builder = XenoAppBuilder.create<MyRegistry>()\\n .addContext(() => {})`\r\n\r\n if (options.supabase) {\r\n builderNodes += `\\n .addAuth((opts, config) => {\r\n opts.url = config.getOrThrow('VITE_SUPABASE_URL');\r\n opts.key = config.getOrThrow('VITE_SUPABASE_KEY');\r\n })`\r\n }\r\n\r\n if (options.sentry) {\r\n builderNodes += `\\n .addLogger((opts, config) => {\r\n const env = config.get(COMMON_CONSTANTS.ENV) ?? 'development'\r\n const isDev = env.toLowerCase() === 'development'\r\n opts.console = isDev\r\n if (!isDev) {\r\n opts.sentry = {\r\n dsn: config.getOrThrow('VITE_SENTRY_DSN'),\r\n env,\r\n app,\r\n router,\r\n tracesSampleRate: 0.2,\r\n level: LOG_LEVEL.WARN,\r\n };\r\n }\r\n })`\r\n } else {\r\n builderNodes += `\\n .addLogger((opts, config) => {\r\n opts.console = config.get('VITE_APP_ENV') === 'development';\r\n })`\r\n }\r\n\r\n builderNodes += `\\n .addServices((config, register) => {\r\n // Register custom stores, API clients, and CQRS services here\r\n })`\r\n\r\n const bootstrapTs = `import { XenoAppBuilder, LOG_LEVEL } from '@xeno-js/vue';\r\nimport type { MyRegistry } from './registry';\r\n\r\nexport async function bootstrap(app: any, router: any) {\r\n${builderNodes}\r\n\r\n return await builder.build();\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'bootstrap.ts'),\r\n bootstrapTs,\r\n )\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class IndexVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n const indexHtml = `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${options.targetDir}</title>\r\n </head>\r\n <body>\r\n <div id=\"app\"></div>\r\n <script type=\"module\" src=\"/src/main.ts\"></script>\r\n </body>\r\n</html>`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'index.html'), indexHtml)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class MainGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n // 5. src/main.ts\r\n const routerImport = options.router ? `\\nimport router from './router';` : ''\r\n const piniaImport = options.pinia ? `\\nimport { createPinia } from 'pinia';` : ''\r\n const tailwindImport = options.tailwind ? `\\nimport './assets/style.css';` : ''\r\n\r\n const mainTs = `import { createApp } from 'vue';\r\nimport App from './App.vue';\r\nimport { bootstrap } from './bootstrap';\r\nimport { XENO_SERVICES_KEY } from '@xeno-js/vue';${routerImport}${piniaImport}${tailwindImport}\r\n\r\nasync function mountApp() {\r\n try {\r\n const app = createApp(App);\r\n ${options.pinia ? '\\n app.use(createPinia());' : ''}\r\n const container = await bootstrap(app, router);\r\n ${options.router ? '\\n app.use(router);' : ''}\r\n \r\n\r\n // Provide the Xeno IoC container globally to all components\r\n app.provide(XENO_SERVICES_KEY, container);\r\n\r\n app.mount('#app');\r\n } catch (error) {\r\n console.error('Critical error during frontend bootstrap:', error);\r\n }\r\n}\r\n\r\nmountApp();\r\n`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'src', 'main.ts'), mainTs)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class RegistryGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, _options: VueOptions): Promise<void> {\r\n const registryTs = `import type { XenoVueRegistry } from '@xeno-js/vue';\r\n\r\n/**\r\n * @file registry.ts\r\n * @description Centralized Type Contract for Dependency Injection in Vue.\r\n */\r\nexport interface MyRegistry extends XenoVueRegistry {\r\n // Add your frontend injection tokens here\r\n // e.g., USER_DATA_SOURCE: IUserDataSource;\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'registry.ts'),\r\n registryTs,\r\n )\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class RouterGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n // 6. Optional router and assets\r\n if (options.router) {\r\n const routerTs = `import { createRouter, createWebHistory } from 'vue-router';\r\n\r\nexport default createRouter({\r\n history: createWebHistory(),\r\n routes: [\r\n {\r\n path: '/',\r\n name: 'Home',\r\n component: () => import('../views/HomeView.vue')\r\n }\r\n ]\r\n});`\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'router', 'index.ts'),\r\n routerTs,\r\n )\r\n\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'views', 'HomeView.vue'),\r\n `<template>\\n <h1>Home View</h1>\\n</template>`,\r\n )\r\n }\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class TailwindGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n if (options.tailwind) {\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'assets', 'style.css'),\r\n `@import \"tailwindcss\";\\n`,\r\n )\r\n }\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class UseAppVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, _options: VueOptions): Promise<void> {\r\n const content = `import type { Nullable } from \"@xeno-js/vue\";\r\nimport { Guards, XENO_SERVICES_KEY } from \"@xeno-js/vue\";\r\nimport { inject } from \"vue\";\r\nimport type { MyRegistry } from \"./registry\";\r\n\r\nlet globalServices: Nullable<MyRegistry> = null;\r\n\r\nexport const ServicesUtils = Object.freeze({\r\n // Metodo per registrare i servizi al bootstrap\r\n setGlobalServices(services: MyRegistry) {\r\n globalServices = services;\r\n },\r\n useApp(): MyRegistry {\r\n if (Guards.isDefined(globalServices))\r\n return globalServices;\r\n\r\n const services = inject<MyRegistry>(XENO_SERVICES_KEY);\r\n if (!services)\r\n throw new Error(\r\n '[Xeno Error]: XenoServices not found. Did you provide them using app.provide(XENO_SERVICES_KEY, services)?',\r\n );\r\n\r\n return services;\r\n }\r\n} as const);\r\n`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'src', 'use-app.ts'), content)\r\n }\r\n}\r\n","import prompts from 'prompts'\r\n\r\nimport type { IFileService, IGenerator, IScaffoldStrategy } from '../../domain'\r\nimport type { VueOptions } from '../../shared'\r\n\r\nexport class VueScaffoldStrategy implements IScaffoldStrategy<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async promptOptions(targetDir: string): Promise<VueOptions> {\r\n const response = await prompts([\r\n { type: 'confirm', name: 'axios', message: 'Install Axios?', initial: true },\r\n {\r\n type: 'confirm',\r\n name: 'cockatiel',\r\n message: 'Install Cockatiel (Resilience)?',\r\n initial: true,\r\n },\r\n { type: 'confirm', name: 'supabase', message: 'Install Supabase Auth?', initial: true },\r\n { type: 'confirm', name: 'sentry', message: 'Install Sentry Logger?', initial: true },\r\n {\r\n type: 'confirm',\r\n name: 'pinia',\r\n message: 'Install Pinia (State Management)?',\r\n initial: true,\r\n },\r\n { type: 'confirm', name: 'router', message: 'Install vue-router?', initial: true },\r\n { type: 'confirm', name: 'tailwind', message: 'Install Tailwind CSS?', initial: true },\r\n { type: 'confirm', name: 'zod', message: 'Install Zod Validator?', initial: true },\r\n {\r\n type: 'confirm',\r\n name: 'gitInit',\r\n message: 'Initialize a new Git repository?',\r\n initial: true,\r\n },\r\n ])\r\n\r\n return {\r\n targetDir,\r\n projectType: 'vue',\r\n ...response,\r\n }\r\n }\r\n\r\n public async getGenerators(_options: VueOptions): Promise<IGenerator<VueOptions>[]> {\r\n const generators: IGenerator<VueOptions>[] = []\r\n\r\n const { PackageJsonVueGenerator } = await import('../generators/vue/packagejson.generator.js')\r\n const { ViteconfigGenerator } = await import('../generators/vue/vite-config.generator.js')\r\n const { EnvVueGenerator } = await import('../generators/vue/env.generator.js')\r\n const { TsconfigVueGenerator } = await import('../generators/vue/tsconfig.generator.js')\r\n const { ReadmeVueGenerator } = await import('../generators/vue/readme.generator.js')\r\n const { GitIgnoreGenerator } = await import('../generators/gitignore.generator.js')\r\n const { AppVueGenerator } = await import('../generators/vue/app-vue.generator.js')\r\n const { BootstrapGenerator } = await import('../generators/vue/bootstrap-ts.generator.js')\r\n const { IndexVueGenerator } = await import('../generators/vue/index-html.generator.js')\r\n const { MainGenerator } = await import('../generators/vue/main.generator.js')\r\n const { RegistryGenerator } = await import('../generators/vue/registry-ts.generator.js')\r\n const { RouterGenerator } = await import('../generators/vue/router.generator.js')\r\n const { TailwindGenerator } = await import('../generators/vue/tailwind.generator.js')\r\n const { UseAppVueGenerator } = await import('../generators/vue/use-app.generator.js')\r\n\r\n generators.push(new PackageJsonVueGenerator(this._fileService))\r\n generators.push(new ViteconfigGenerator(this._fileService))\r\n generators.push(new EnvVueGenerator(this._fileService))\r\n generators.push(new TsconfigVueGenerator(this._fileService))\r\n generators.push(new AppVueGenerator(this._fileService))\r\n generators.push(new BootstrapGenerator(this._fileService))\r\n generators.push(new IndexVueGenerator(this._fileService))\r\n generators.push(new MainGenerator(this._fileService))\r\n generators.push(new RegistryGenerator(this._fileService))\r\n generators.push(new RouterGenerator(this._fileService))\r\n generators.push(new TailwindGenerator(this._fileService))\r\n generators.push(new ReadmeVueGenerator(this._fileService))\r\n generators.push(new GitIgnoreGenerator(this._fileService))\r\n generators.push(new UseAppVueGenerator(this._fileService))\r\n\r\n return generators\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\r\n\r\nexport class PackageJsonCoreGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n const packageJson = {\r\n name: options.targetDir,\r\n version: '1.0.0',\r\n private: true,\r\n main: './dist/index.js',\r\n module: './dist/index.js',\r\n types: './dist/index.d.ts',\r\n scripts: {\r\n start: 'tsx src/main.ts',\r\n build: 'tsc --project tsconfig.json',\r\n g: 'xeno-js generate',\r\n } as Record<string, string>,\r\n dependencies: {\r\n '@xeno-js/core': 'latest',\r\n 'dotenv': '^16.4.5',\r\n } as Record<string, string>,\r\n devDependencies: {\r\n '@types/node': '^20.0.0',\r\n 'tsx': '^4.7.0',\r\n 'typescript': '^5.4.0',\r\n } as Record<string, string>,\r\n }\r\n\r\n // Database & ORM\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n packageJson.dependencies['drizzle-orm'] = '^0.45.2'\r\n packageJson.dependencies['pg'] = '^8.22.0'\r\n packageJson.dependencies['postgres'] = '^3.4.9'\r\n packageJson.devDependencies['@types/pg'] = '^8.11.0'\r\n packageJson.devDependencies['drizzle-kit'] = '^0.31.10'\r\n packageJson.scripts['db:migrate'] = 'drizzle-kit migrate'\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n packageJson.dependencies['drizzle-orm'] = '^0.45.2'\r\n packageJson.dependencies['@libsql/client'] = '^0.14.0'\r\n packageJson.devDependencies['drizzle-kit'] = '^0.31.10'\r\n }\r\n packageJson.scripts['db:generate'] = 'drizzle-kit generate'\r\n packageJson.scripts['db:push'] = 'drizzle-kit push'\r\n }\r\n\r\n // HTTP / External Calls\r\n if (options.axios) packageJson.dependencies['axios'] = '^1.16.1'\r\n if (options.cockatiel) packageJson.dependencies['cockatiel'] = '^4.0.0'\r\n\r\n // Logging & Observability\r\n if (options.pino) {\r\n packageJson.dependencies['pino'] = '^10.3.1'\r\n packageJson.devDependencies['pino-pretty'] = '^11.2.2'\r\n }\r\n if (options.sentry) packageJson.dependencies['@sentry/node'] = '^7.64.0'\r\n\r\n // Services\r\n if (options.redis) packageJson.dependencies['ioredis'] = '^5.3.1'\r\n if (options.supabase) packageJson.dependencies['@supabase/supabase-js'] = '^2.35.0'\r\n if (options.zod) packageJson.dependencies['zod'] = '^4.4.3'\r\n\r\n const filePath = path.join(projectPath, 'package.json')\r\n await this._fileService.writeFileRecursive(filePath, JSON.stringify(packageJson, null, 2))\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\r\n\r\nexport class BootstrapGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n // Costruisce in modo flessibile i nodi di configurazione\r\n let builderNodes = `\r\n const builder = new AppBuilder<MyRegistry>()\r\n .addContext()\r\n .addMiddlewares((opts) => {\r\n // Add your options here\r\n })\r\n .addPipeline((opts) => {\r\n // Add your options here\r\n })`\r\n\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n builderNodes += `\r\n .addDb((opts, config) => {\r\n opts.enableSqlLite = false\r\n opts.connectionString = config.getOrThrow('DATABASE_URL');\r\n })`\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n builderNodes += `\r\n .addDb((opts, config) => {\r\n opts.enableSqlLite = true;\r\n opts.connectionString = config.getOrThrow('SQLITE_DATABASE_URL');\r\n })`\r\n }\r\n }\r\n\r\n if (options.redis) {\r\n builderNodes += `\r\n .addCache((opts, config) => {\r\n const isDev = config.get('NODE_ENV') === 'development';\r\n opts.inMemory = isDev;\r\n opts.redis = !isDev ? {\r\n host: config.getOrThrow('REDIS_HOST'),\r\n port: config.getNumber('REDIS_PORT') ?? 6379,\r\n username: config.get('REDIS_USERNAME') ?? '',\r\n password: config.get('REDIS_PASSWORD') ?? '',\r\n tls: config.getBoolean('REDIS_TLS') ?? false,\r\n maxRetriesPerRequest: 3\r\n } : undefined\r\n })`\r\n } else {\r\n // Default in-memory cache if no redis selected but CQRS pipeline exists\r\n builderNodes += `\r\n .addCache((opts) => {\r\n opts.inMemory = true;\r\n })`\r\n }\r\n\r\n if (options.supabase) {\r\n builderNodes += `\r\n .addAuth((opts, config) => {\r\n opts.url = config.getOrThrow('SUPABASE_URL');\r\n opts.key = config.getOrThrow('SUPABASE_KEY');\r\n })`\r\n }\r\n\r\n if (options.pino || options.sentry) {\r\n const pinoConfig = options.pino\r\n ? `opts.pino.config = !isDev ? { env: config.getOrThrow('NODE_ENV'), destination: 'stdout', prettyPrint: false } : undefined;`\r\n : ''\r\n const sentryConfig = options.sentry\r\n ? `opts.sentry.config = !isDev ? { dsn: config.getOrThrow('SENTRY_DSN'), environment: config.getOrThrow('NODE_ENV') } : undefined;`\r\n : ''\r\n\r\n builderNodes += `\r\n .addLogger((opts, config) => {\r\n const isDev = config.get('NODE_ENV') === 'development';\r\n opts.level = LOG_LEVEL.INFO;\r\n opts.console = isDev;\r\n ${pinoConfig}\r\n ${sentryConfig}\r\n })`\r\n }\r\n\r\n builderNodes += `\r\n .addServices((opts, config) => {\r\n // Register custom repositories and handlers here\r\n });`\r\n\r\n const content = `import type { IServiceContainer } from '@xeno-js/core';\r\nimport { AppBuilder, LOG_LEVEL, Nullable, TOKENS } from '@xeno-js/core';\r\nimport type { MyRegistry } from './registry';\r\n\r\nlet containerPromise: Nullable<Promise<IServiceContainer<MyRegistry>>> = null;\r\n\r\nexport async function bootstrap() {\r\n if (!containerPromise) {\r\n containerPromise = (async () => {\r\n const builder = getContainer();\r\n return await builder.build();\r\n })().catch((err) => {\r\n containerPromise = null;\r\n throw err;\r\n });\r\n }\r\n return containerPromise;\r\n}\r\n\r\nfunction getContainer() {\r\n${builderNodes}\r\n return builder;\r\n}\r\n`\r\n\r\n const filePath = path.join(projectPath, 'src', 'bootstrap.ts')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\r\n\r\nexport class EnvGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n let content = `# ─────────────────────────────────────────────────────────────────────────────\r\n# Xeno APPLICATION ENVIRONMENT VARIABLES\r\n# ─────────────────────────────────────────────────────────────────────────────\r\nNODE_ENV=development\r\n`\r\n\r\n // Configurazione Database\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n content += `\\n# --- Database (PostgreSQL) ---\r\n DATABASE_URL=postgres://postgres:password@localhost:5432/xeno_db\r\n `\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n content += `\\n# --- Database (SQLite) ---\r\n SQLITE_DATABASE_URL=file:./dev.sqlite\r\n `\r\n }\r\n }\r\n\r\n if (options.axios) {\r\n content += `\\n# --- Axios ---\r\nBASE_URL=\r\n`\r\n }\r\n\r\n // Configurazione Redis (Caching, Idempotenza, Concorrenza)\r\n if (options.redis) {\r\n content += `\\n# --- Cache (Redis) ---\r\nREDIS_HOST=localhost\r\nREDIS_PORT=6379\r\nREDIS_PASSWORD=\r\nREDIS_USERNAME=\r\nREDIS_TLS=false\r\n`\r\n }\r\n\r\n // Configurazione Supabase (Autenticazione)\r\n if (options.supabase) {\r\n content += `\\n# --- Authentication (Supabase) ---\r\nSUPABASE_URL=https://your-project.supabase.co\r\nSUPABASE_KEY=your-anon-key\r\n`\r\n }\r\n\r\n // Configurazione Logging & Observability\r\n if (options.sentry) {\r\n content += `\\n# --- Error Tracking (Sentry) ---\r\nSENTRY_DSN=https://your-sentry-dsn@o0.ingest.sentry.io/0\r\nSENTRY_ENVIRONMENT=development\r\n`\r\n }\r\n\r\n // Creiamo sia il file effettivo che il file di esempio\r\n const envPath = path.join(projectPath, '.env')\r\n const envExamplePath = path.join(projectPath, '.env.example')\r\n\r\n await this._fileService.writeFileRecursive(envPath, content)\r\n await this._fileService.writeFileRecursive(envExamplePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { type CoreOptions } from '../../../shared'\r\n\r\nexport class ReadmeGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, _options: CoreOptions): Promise<void> {\r\n const content = `\r\n <div align=\"center\">\r\n <img src=\"logo/logo.png\" alt=\"Xeno Logo\" width=\"140\" />\r\n\r\n <h1>Xeno</h1>\r\n\r\n <p><em>Enterprise-grade DDD & CQRS framework for Node.js</em></p>\r\n\r\n <p>\r\n <a href=\"https://github.com/xeno-js/xeno-js\">\r\n <img src=\"https://img.shields.io/badge/Powered%20by-Xeno-blueviolet?style=flat-square\" alt=\"Powered by Xeno\" />\r\n </a>\r\n <a href=\"https://github.com/xeno-js/xeno-js/blob/main/LICENSE\">\r\n <img src=\"https://img.shields.io/npm/l/@xeno?style=flat-square\" alt=\"License: ISC\" />\r\n </a>\r\n <a href=\"https://www.npmjs.com/package/@xeno/core\">\r\n <img src=\"https://img.shields.io/npm/v/@xeno/core?style=flat-square\" alt=\"NPM Version\" />\r\n </a>\r\n <a href=\"https://buymeacoffee.com/xenojs\">\r\n <img src=\"https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-FFdd00?style=flat-square&logo=buy-me-a-coffee&logoColor=black\" alt=\"Buy Me A Coffee\" />\r\n </a>\r\n </p>\r\n</div>\r\n\r\n---\r\n\r\n## What is Xeno?\r\n\r\n**Xeno** is an enterprise-grade, runtime-agnostic architectural framework for\r\nNode.js built natively with TypeScript. It provides structural primitives for\r\nimplementing robust **Domain-Driven Design (DDD)** and **Command Query\r\nResponsibility Segregation (CQRS)** patterns. By shifting operational logic away\r\nfrom delivery mechanisms and transport frameworks, Xeno ensures your core\r\napplication architecture remains pristine, testable, and completely isolated\r\nfrom external infrastructural churn.\r\n\r\n---\r\n\r\n## 💡 Why Choose Xeno?\r\n\r\nModern Node.js frameworks often tie business workflows tightly to HTTP server\r\nabstractions or rely heavily on experimental language features. Xeno fixes this\r\nwith an emphasis on developer experience, type safety, and clean separation of\r\nconcerns.\r\n\r\n- **Zero Decorators**: Xeno eliminates reliance on experimental or unstable TS\r\n decorator specifications (\\`reflect-metadata\\`). The IoC container\r\n (\\`ServiceContainer\\`) uses pure, explicit functional factories that optimize\r\n compilation speeds and eliminate runtime black-box behaviors.\r\n- **Complete Server Decoupling**: Xeno does not care if you use Fastify, Hono,\r\n Express, Koa, or AWS Lambda. The presentation layer handles incoming data\r\n using plain, primitive contracts, making migration or multi-runtime hosting\r\n completely seamless.\r\n- **Pay-For-What-You-Use (Opt-in Modularity)**: Core dependencies are\r\n strategically classified as optional peer dependencies. If your architecture\r\n doesn't use Redis, Sentry, or Supabase, you do not pull them into your node\r\n modules.\r\n- **Enterprise-Grade Resiliency & Cross-Cutting Pipelines**: Address complex\r\n distributed patterns natively without code duplication. Xeno provides\r\n out-of-the-box composite behaviors:\r\n - **Idempotency**: Implements multi-tenant logic keyspaces matching advanced\r\n SaaS factory patterns for logical partitioning.\r\n - **Concurrency Control**: Mitigates thundering herd impacts via advanced\r\n backoff retry strategies coupled with randomized jitter.\r\n - **Resilience Policies**: Deep integration with circuit breakers, bulkheads,\r\n and fallbacks.\r\n - **Deterministic Type Safety**: Strong infrastructure validation strategies\r\n using Zod schemas.\r\n\r\n---\r\n\r\n## 📖 Documentation & Getting Started\r\n\r\nTo explore the architecture, programmatic configurations, and extension\r\nworkflows of Xeno, read the full technical manuals located inside the main\r\ndocumentation hub:\r\n\r\n- **[Framework Documentation Repository](https://www.xeno-js.it/introduction)**\r\n\r\nInside, you will find exhaustive, step-by-step assembly guides covering core\r\nhost building (\\`AppBuilder\\`), isolated request middleware lifecycles, functional\r\n\\`Result\\` monads, and zero-trust authorization pipeline behavior tracks.\r\n\r\n---\r\n\r\n## 🚀 Live Executable Demos\r\n\r\nWant to see how Xeno works? Check out the functional example application\r\nshowcasing end-to-end command/query segregation, multi-tenant databases, and\r\nresilient schema handling.\r\n\r\nYou can dive straight into the explicit source code modules of specialized\r\nsandbox environments:\r\n\r\n- **[\\`pipelines_middleware_demo/\\`](https://www.xeno-js.it/demo)**: Traces\r\n an execution thread from the raw HTTP transport presentation layer, executing\r\n automated header extraction and anchoring metadata variables into\r\n \\`AsyncLocalStorage\\` thread boundaries.\r\n\r\n---\r\n\r\n## 📦 Installation\r\n\r\nInstall the core package:\r\n\r\n\\`\\`\\`bash\r\nnpm install @xeno-js/core\r\n\r\n\\`\\`\\`\r\n\r\nXeno uses **Optional Peer Dependencies**. You only install the external\r\nlibraries you actually need. Node.js will strictly lazy-load only the modules\r\nyou enable in the configuration.\r\n\r\n\\`\\`\\`bash\r\n# Example: Install tools only if you enable them in the builder\r\nnpm install zod pino cockatiel drizzle-orm\r\n\r\n\\`\\`\\`\r\n\r\n---\r\n\r\n## ⚡ Bootstrapping & Middleware Example\r\n\r\nBelow is an architectural example of how to configure the Xeno\r\n\\`ServiceContainer\\`, load core modules, and process an incoming application\r\npayload natively inside a server middleware wrapper.\r\n\r\n### 1. Initialize the Container and Configure Modules\r\n\r\n\\`\\`\\`typescript\r\nimport { AppBuilder, LOG_LEVEL, TOKENS, XenoRegistry } from '@xeno-js/core'\r\nimport { FindUserQueryHandler } from './user/cqrs/handlers/index'\r\nimport { FindUserController } from './user/controllers/index'\r\nimport { UserMapper } from './user/mappers/user.mapper'\r\nimport { UserWriteRepository } from './user/repositories/user-write.repository'\r\nimport { UserDataSource } from './user/datasources/user.datasource'\r\n\r\n// Map your registry token with XenoRegistry<TSchemaDb, TExtension>\r\ntype MyRegistry = XenoRegistry<{ /** Your Db Schema here **/}, {\r\n USER_MAPPER_TOKEN: UserMapper\r\n USER_DS_TOKEN: UserDataSource\r\n USER_REPOSITORY_TOKEN: UserWriteRepository\r\n FIND_USER_QUERY_HANDLER_TOKEN: FindUserQueryHandler\r\n FIND_USER_CONTROLLER_TOKEN: FindUserController\r\n}>\r\n\r\n// Create the root IoC container context\r\nexport const bootstrap = new AppBuilder<MyRegistry>()\r\n // Configure middleware and only PUBLIC routes\r\n .addMiddlewares(opts => {\r\n opts.routeRegistry = {\r\n '/api/user/:id': ['GET', 'POST'],\r\n }\r\n })\r\n // Configure the CQRS pipeline\r\n // Can register Policies for your intent\r\n .addPipeline((config) => {\r\n config.authorization.policies = {\r\n 'FIND_USER_QUERY_HANDLER_TOKEN': {\r\n // Add authz by user id\r\n userId: true\r\n // Add authz by tenant id\r\n tenantId: true\r\n // Add authz by roles\r\n roles: ['admin']\r\n // Add authz by perissions\r\n permissions: ['read'],\r\n }\r\n }\r\n // Can add idempotency pipeline for command\r\n config.commandBus.idempotency = { lockTtlSeconds: 30, processedTtlSeconds: 60 }\r\n // Can add concurrency pipeline for command\r\n config.commandBus.concurrency = { delayConfig: { baseDelayMs: 100, maxJitterMs: 500 }, maxRetries: 3 }\r\n // Can add caching pipeline for query\r\n config.queryBus.isEnabled = true\r\n })\r\n // Configure Database with drizzle\r\n .addDb((opts, config) => {\r\n opts.connectionString = config.getOrThrow('DATABASE_URL')\r\n })\r\n // Configure Authentication with supabase\r\n .addAuth((opts, config) => {\r\n opts.key = 'demo-key'\r\n opts.url = config.getOrThrow('API_BASE_URL')\r\n })\r\n // Configure your logger (e.g. Console, Sentry, Pino or custom logger)\r\n .addLogger((config) => {\r\n config.level = LOG_LEVEL.INFO\r\n config.console = true\r\n })\r\n // Register your services\r\n .addServices((services) => {\r\n // REGISTER MAPPER\r\n services.addScoped('USER_MAPPER_TOKEN', () => new UserMapper())\r\n\r\n // REGISTER DATASOURCES\r\n services.addScoped('USER_DS_TOKEN', (c) => new UserDataSource(c.resolve(TOKENS.DB_CONTEXT)))\r\n\r\n // REGISTER REPOSITORIES\r\n services.addScoped('USER_REPOSITORY_TOKEN', (c) => new UserWriteRepository(c.resolve('USER_DS_TOKEN'), c.resolve('USER_MAPPER_TOKEN')))\r\n\r\n // REGISTER HANDLERS\r\n services.addScoped('FIND_USER_QUERY_HANDLER_TOKEN', (c) => {\r\n const requestcontext = c.resolve('USER_CONTEXT_FACTORY')\r\n const repository = c.resolve('USER_READ_REPOSITORY')\r\n return new FindUserQueryHandler(repository, requestcontext)\r\n })\r\n\r\n // REGISTER CONTROLLERS\r\n services.addTransient('FIND_USER_CONTROLLER_TOKEN', (c) => {\r\n return new FindUserController(c.resolve('CONTEXT_ACCESSOR'), c.resolve('MEDIATOR'))\r\n })\r\n })\r\n\r\n\\`\\`\\`\r\n\r\n### 2. Wrap and Run within Server Middleware (e.g., Fastify / Hono)\r\n\r\n\\`\\`\\`typescript\r\nimport 'dotenv/config'\r\nimport { ContainerUtils } from '@xeno-js/core'\r\nimport fastify from 'fastify'\r\nimport { bootstrap } from './bootstrap'\r\n\r\nasync function runDemo() {\r\n console.log('⚙️ Initialized Xeno Container...')\r\n try {\r\n // 1. Bootstrap the application and get the service container\r\n const xenoApp = await bootstrap.build()\r\n\r\n console.log('🚀 Starting Fastify server on http://localhost:3000...')\r\n\r\n // 2. Resolve the middleware from the container\r\n const middleware = xeno.resolve('MIDDLEWARE')\r\n // 3. Create a Fastify instance to handle HTTP requests\r\n const app = fastify()\r\n\r\n // ─── ENDPOINT 2: QUERY ────────────────────────────────────────────\r\n app.get('/api/user/:id', async (request, reply) => {\r\n // 4. Execute the middleware to handle the request context and authentication, then call the StatusController's handle method with the request payload.\r\n const responseDto = await middleware.execute(\r\n { path: '/api/user/:id', method: 'GET', transport: { res: reply, req: request } },\r\n { ...request.headers },\r\n async () => {\r\n const { id } = request.params as any\r\n const controller = ContainerUtils.resolveServiceScoped('FIND_USER_CONTROLLER_TOKEN', xenoApp)\r\n return await controller.handle({ id: id ?? '123' });\r\n }\r\n );\r\n\r\n return reply\r\n .status(responseDto.status)\r\n .type('application/json')\r\n .send(responseDto.data)\r\n })\r\n\r\n console.log('✅ Routes set up. Ready to accept requests.')\r\n\r\n // ─── START SERVER ─────────────────────────────────────────────────\r\n try {\r\n await app.listen({ port: 3000 })\r\n console.log('🚀 Application running on http://localhost:3000')\r\n console.log('👉 GET /api/user/:id (GET: api/user/1)')\r\n } catch (err) {\r\n console.error('Error starting Fastify server:', err)\r\n app.log.error(err)\r\n process.exit(1)\r\n }\r\n } catch (error) {\r\n console.error('Error during bootstrap or server setup:', error)\r\n process.exit(1)\r\n }\r\n}\r\n\r\nrunDemo()\r\n\\`\\`\\`\r\n\r\n---\r\n\r\n## 🛠 Scaffold your project with CLI\r\n\r\nXeno includes an official CLI tool, \\`@xeno-js/cli\\`, designed to bootstrap your\r\nnew application in seconds. It offers an interactive setup to select exactly the\r\nmodules you need (Database, HTTP, Auth, Logging, etc.), ensuring you start with\r\na clean, pre-configured architecture tailored to your specific requirements.\r\n\r\nIf you want to learn how to use it, see the full options available, or\r\nunderstand how the scaffolding engine works, check the\r\n**[CLI Documentation](https://www.xeno-js.it/cli/overview)**.\r\n\r\n---\r\n\r\n## 🤝 For Contributors\r\n\r\nWe welcome contributions to Xeno! To maintain the highest code quality and\r\nstability of the core framework, **direct pushes to the \\`main\\` and \\`develop\\`\r\nbranches are strictly prohibited.** Please follow this Git Flow to contribute:\r\n\r\n1. **Branch off from \\`develop\\`**: Create a new branch for your feature or\r\n bugfix.\r\n\r\n\\`\\`\\`bash\r\n git checkout develop\r\n git pull origin develop\r\n git checkout -b feat/your-awesome-feature\r\n\\`\\`\\`\r\n\r\n2. **Make your changes**: Write your code and ensure it passes all local checks\r\n (linting, types, and tests).\r\n\r\n\\`\\`\\`bash\r\nnpm run check\r\n\\`\\`\\`\r\n\r\n3. **Commit your changes**: We enforce\r\n [Conventional Commits](https://www.conventionalcommits.org/). Husky will\r\n verify your commit message format.\r\n\r\n4. **Commit Format:**\r\n\r\n\\`\\`\\`bash\r\nfeat(scope): add new feature\r\nfix(scope): resolve bug\r\nchore(scope): update dependencies\r\n\\`\\`\\`\r\n\r\n5. **Submit a Pull Request (PR)**: Push your branch to GitHub and open a Pull\r\n Request targeting the **\\`develop\\`** branch.\r\n\r\n6. **Review**: The repository owner will review your code, run pipeline tests,\r\n and merge it into \\`develop\\`.\r\n\r\n_Note: The \\`main\\` branch is strictly reserved for production releases. Code\r\nflows from feature branches ➡️ \\`develop\\` ➡️ \\`main\\`._\r\n\r\n### Scripts\r\n\r\n| Command | Description |\r\n| ----------------------- | ---------------------------------------------- |\r\n| \\`npm run build\\` | Builds the TypeScript source code into \\`dist/\\` |\r\n| \\`npm run typecheck\\` | Checks types without emitting files |\r\n| \\`npm run lint\\` | Runs ESLint |\r\n| \\`npm run format\\` | Formats code with Prettier |\r\n| \\`npm run test\\` | Runs the Vitest test suite |\r\n| \\`npm run test:coverage\\` | Runs tests and generates a coverage report |\r\n\r\n### Code Quality (Husky & Git Hooks)\r\n\r\nThis project strictly enforces code quality rules before pushing to the\r\nrepository:\r\n\r\n- **\\`pre-commit\\`**: Runs \\`lint-staged\\` on staged files (ESLint + Prettier).\r\n- **\\`commit-msg\\`**: Checks commit messages with \\`commitlint\\` (we use\r\n Conventional Commits).\r\n- **\\`pre-push\\`**: Runs type checking, linting, and testing before code leaves\r\n your machine.\r\n\r\n---\r\n\r\n## 🌱 Support & Appreciation\r\n\r\nBuilding, benchmarking, and maintaining a progressive, enterprise-ready\r\nopen-source framework requires a massive amount of continuous dedication and\r\narchitectural engineering.\r\n\r\nIf Xeno has brought value to your development workflows, helped decouple your\r\ncore business logic, or simplified your system infrastructure layout, consider\r\nsupporting its open-source lifecycle. Your backing directly accelerates our\r\nstrategic roadmap for new out-of-the-box transport integrations (such as gRPC,\r\nRabbitMQ, and GraphQL) and keeps the documentation pristine.\r\n\r\n**Want to know how you can contribute or sponsor Xeno?** We rely on the\r\ncommitment of our community to keep the project independent and thriving.\r\nWhether you are an individual developer or a business using Xeno, your support\r\nmakes a real difference.\r\n\r\n👉\r\n**[Read our support guidelines and find out how to help](https://www.xeno-js.it/support-us)**\r\n\r\nThank you for being part of this decoupled open-source journey!\r\n\r\n<amp-bounce>\r\n</amp-bounce>\r\n<a href=\"https://www.buymeacoffee.com/xenojs\" target=\"_blank\">\r\n<img src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" height=\"42\" style=\"height: 42px !important;\" />\r\n</a>\r\n\r\n---\r\n\r\n## 🛡️ Powered by Xeno\r\n\r\nIf you are using Xeno in your project, let the world know! Add this badge to\r\nyour README:\r\n\r\n\\`\\`\\`html\r\n<a\r\n href=\"[https://github.com/xeno-js/xeno-js](https://github.com/xeno-js/xeno-js)\"\r\n target=\"_blank\"\r\n>\r\n <img\r\n src=\"[https://img.shields.io/badge/Powered%20by-Xeno-black?style=flat-square](https://img.shields.io/badge/Powered%20by-Xeno-black?style=flat-square)\"\r\n alt=\"Powered by Xeno\"\r\n height=\"20\"\r\n />\r\n</a>\r\n\\`\\`\\`\r\n\r\n## 📄 License\r\n\r\nCopyright (c) 2026 Xeno. Licensed under the [ISC License](LICENSE).\r\n\r\n `\r\n\r\n const filePath = path.join(projectPath, 'readme')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\r\n\r\nexport class RegistryGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n let dbImport = ''\r\n let registryType = ''\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n dbImport = `import type { DbSchema } from './schema';`\r\n registryType = `XenoRegistry<DbSchema>`\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n dbImport = `import type { SqliteSchema } from './schema';`\r\n registryType = `XenoRegistry<SqliteSchema>`\r\n }\r\n } else {\r\n registryType = `XenoRegistry`\r\n }\r\n\r\n const content = `import type { XenoRegistry } from '@xeno-js/core';\r\n${dbImport}\r\n\r\n/**\r\n * @file registry.ts\r\n * @description Centralized Type Contract for Dependency Injection.\r\n */\r\nexport interface MyRegistry extends ${registryType} {\r\n // Add your application injection tokens here\r\n // e.g., USER_REPOSITORY: IUserRepository;\r\n}\r\n`\r\n\r\n const filePath = path.join(projectPath, 'src', 'registry.ts')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\r\n\r\nexport class TsconfigGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n const tsconfig = {\r\n compilerOptions: {\r\n target: 'ES2022',\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n strict: true,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n forceConsistentCasingInFileNames: true,\r\n outDir: './dist',\r\n rootDir: './src',\r\n types: ['node'],\r\n paths: {\r\n '@/*': ['./src/*'],\r\n },\r\n },\r\n include: ['src/**/*.ts'],\r\n }\r\n\r\n if (\r\n options.database === CORE_CONSTANTS.DRIZZLE ||\r\n options.database === CORE_CONSTANTS.SQL_LITE\r\n ) {\r\n tsconfig.include.push('drizzle.config.ts')\r\n }\r\n\r\n const filePath = path.join(projectPath, 'tsconfig.json')\r\n await this._fileService.writeFileRecursive(filePath, JSON.stringify(tsconfig, null, 2))\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { type CoreOptions } from '../../../shared'\r\n\r\n/**\r\n * @class DrizzleGenerator\r\n * @description Generates the Drizzle configuration file (drizzle.config.ts) and a basic schema file (src/schema.ts) for database scaffolding.\r\n * The generator is only invoked if the user has opted to include database support in their project.\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @license ISC\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\nexport class DrizzleGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n async generate(projectPath: string, _options: CoreOptions): Promise<void> {\r\n const configContent = this.composeDrizzleConfig()\r\n const filePath = path.join(projectPath, 'drizzle.config.ts')\r\n await this._fileService.writeFileRecursive(filePath, configContent)\r\n\r\n const schemaContent = this.composeSchema()\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'schema.ts'),\r\n schemaContent,\r\n )\r\n }\r\n\r\n private composeDrizzleConfig(): string {\r\n return `import 'dotenv/config';\r\nimport { defineConfig } from 'drizzle-kit';\r\n\r\n/**\r\n * Drizzle Kit configuration file.\r\n * Defines the schema location, migration output directory, and database connection.\r\n */\r\nexport default defineConfig({\r\n schema: './src/schema.ts',\r\n out: './drizzle',\r\n dialect: 'postgresql',\r\n dbCredentials: {\r\n url: process.env.DATABASE_URL!,\r\n },\r\n verbose: true,\r\n strict: true,\r\n});\r\n`\r\n }\r\n\r\n private composeSchema(): string {\r\n return `import { boolean, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\r\n\r\n/**\r\n * @description Define your database tables here.\r\n * The 'usersTable' serves as a baseline example. \r\n * You can add more tables, relations, and indexes according to your domain requirements.\r\n */\r\nexport const usersTable = pgTable('users', {\r\n id: serial('id').primaryKey(),\r\n name: text('name').notNull(),\r\n email: text('email').notNull().unique(),\r\n isDeleted: boolean('is_deleted').notNull().default(false),\r\n deletedAt: timestamp('deleted_at'),\r\n createdAt: timestamp('created_at').defaultNow(),\r\n});\r\n\r\n/**\r\n * Types inferred from the schema.\r\n * - UserDto: Represents the shape of the data retrieved from the database ($inferSelect).\r\n * - NewUserDto: Represents the shape of the data required to insert a new record ($inferInsert).\r\n */\r\nexport type UserDto = typeof usersTable.$inferSelect;\r\nexport type NewUserDto = typeof usersTable.$inferInsert;\r\n\r\n/**\r\n * Centralized Database Schema dictionary.\r\n */\r\nexport type DbSchema = {\r\n users: typeof usersTable;\r\n};\r\n`\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { type CoreOptions } from '../../../shared'\r\n\r\n/**\r\n * @class DrizzleSqlLiteGenerator\r\n * @description Generates a Drizzle configuration file (drizzle.config.ts) and a\r\n * SQLite schema example (src/infrastructure/db/sqlite-schema.ts) when the user\r\n * opts to use SQLite/libSQL instead of Postgres.\r\n */\r\nexport class DrizzleSqlLiteGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n async generate(projectPath: string, _options: CoreOptions): Promise<void> {\r\n const configContent = this.composeDrizzleConfig()\r\n const filePath = path.join(projectPath, 'drizzle.config.ts')\r\n await this._fileService.writeFileRecursive(filePath, configContent)\r\n\r\n const schemaPath = path.join(projectPath, 'src', 'schema.ts')\r\n const schemaContent = this.composeSchema()\r\n await this._fileService.writeFileRecursive(schemaPath, schemaContent)\r\n }\r\n\r\n private composeDrizzleConfig(): string {\r\n return `import 'dotenv/config';\r\nimport { defineConfig } from 'drizzle-kit';\r\n\r\n/**\r\n * Drizzle Kit configuration for SQLite / libSQL.\r\n * Uses environment variable SQLITE_DATABASE_URL to locate the database.\r\n */\r\nexport default defineConfig({\r\n schema: './src/schema.ts',\r\n out: './drizzle',\r\n dialect: 'sqlite',\r\n dbCredentials: {\r\n url: process.env.SQLITE_DATABASE_URL!,\r\n },\r\n verbose: true,\r\n strict: true,\r\n});\r\n`\r\n }\r\n\r\n private composeSchema(): string {\r\n return `import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core';\r\n\r\n /**\r\n * Example SQLite schema using Drizzle's libsql primitives.\r\n * Place your application tables here (this file is scaffolded by the CLI when\r\n * the user opts into SQLite support).\r\n */\r\n export const usersTable = sqliteTable('users', {\r\n id: integer('id').primaryKey().notNull(),\r\n name: text('name').notNull(),\r\n description: text('description'),\r\n });\r\n\r\n/**\r\n * Types inferred from the schema.\r\n * - UserDto: Represents the shape of the data retrieved from the database ($inferSelect).\r\n * - NewUserDto: Represents the shape of the data required to insert a new record ($inferInsert).\r\n */\r\nexport type UserDto = typeof usersTable.$inferSelect;\r\nexport type NewUserDto = typeof usersTable.$inferInsert;\r\n\r\n/**\r\n * Centralized Database Schema dictionary.\r\n */\r\nexport type SqliteSchema = {\r\n users: typeof usersTable;\r\n};\r\n`\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { type CoreOptions } from '../../../shared'\r\n\r\nexport class MainGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n const content = `import 'dotenv/config';\r\nimport { bootstrap } from './bootstrap';\r\nimport { TOKENS } from '@xeno-js/core';\r\n\r\n/**\r\n * Main Application Entry Point\r\n */\r\nasync function main() {\r\n try {\r\n console.info('⏳ Bootstrapping ${options.targetDir} application...');\r\n \r\n // Initialize the dependency injection container and infrastructure modules\r\n const container = await bootstrap();\r\n \r\n const logger = container.resolve(TOKENS.LOGGER)\r\n logger.info('✅ Application started successfully!');\r\n\r\n // TODO: Implement your logic here\r\n \r\n } catch (error) {\r\n console.error('❌ Critical error during startup:', error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nmain();\r\n`\r\n\r\n const filePath = path.join(projectPath, 'src', 'main.ts')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","// src/strategies/core.strategy.ts\r\nimport prompts from 'prompts'\r\n\r\nimport type { IFileService, IGenerator, IScaffoldStrategy } from '../../domain'\r\nimport type { CoreOptions } from '../../shared'\r\nimport { CORE_CONSTANTS, TARGET_ENV_CONSTANTS } from '../../shared'\r\n\r\nexport class CoreScaffoldStrategy implements IScaffoldStrategy<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n public async promptOptions(targetDir: string): Promise<CoreOptions> {\r\n const response = await prompts([\r\n { type: 'confirm', name: 'axios', message: 'Install Axios?', initial: true },\r\n { type: 'confirm', name: 'cockatiel', message: 'Install Cockatiel?', initial: true },\r\n { type: 'confirm', name: 'supabase', message: 'Install Supabase Auth?', initial: true },\r\n {\r\n type: 'select',\r\n name: 'database',\r\n message: 'Select database type',\r\n choices: [\r\n { title: 'Drizzle PostgreSQL', value: 'drizzle' },\r\n { title: 'SQL Lite', value: 'sqlLite' },\r\n { title: 'None', value: 'none' },\r\n ],\r\n },\r\n { type: 'confirm', name: 'pino', message: 'Install Pino Logger?', initial: true },\r\n { type: 'confirm', name: 'sentry', message: 'Install Sentry Logger?', initial: true },\r\n { type: 'confirm', name: 'redis', message: 'Install Redis?', initial: true },\r\n { type: 'confirm', name: 'zod', message: 'Install Zod?', initial: true },\r\n // {\r\n // type: 'select',\r\n // name: 'targetEnv',\r\n // message: 'Select target environment',\r\n // choices: [\r\n // { title: 'Console', value: 'console' },\r\n // { title: 'Vercel (Serverless)', value: 'vercel' },\r\n // { title: 'Fastify (Standalone)', value: 'fastify' },\r\n // ],\r\n // },\r\n {\r\n type: 'confirm',\r\n name: 'gitInit',\r\n message: 'Initialize a new Git repository?',\r\n initial: true,\r\n },\r\n ])\r\n\r\n return {\r\n targetDir,\r\n projectType: 'core',\r\n targetEnv: 'console',\r\n ...response,\r\n }\r\n }\r\n\r\n public async getGenerators(options: CoreOptions): Promise<IGenerator<CoreOptions>[]> {\r\n // Lazy Loading: Importiamo i moduli solo se servono!\r\n const generators: IGenerator<CoreOptions>[] = []\r\n\r\n const { PackageJsonCoreGenerator } = await import('../generators/core/packagejson.generator.js')\r\n const { BootstrapGenerator } = await import('../generators/core/bootstrap.generator.js')\r\n const { EnvGenerator } = await import('../generators/core/env.generator.js')\r\n const { GitIgnoreGenerator } = await import('../generators/gitignore.generator.js')\r\n const { ReadmeGenerator } = await import('../generators/core/readme.generator.js')\r\n const { RegistryGenerator } = await import('../generators/core/registry.generator.js')\r\n const { TsconfigGenerator } = await import('../generators/core/tsconfig.generator.js')\r\n\r\n generators.push(new PackageJsonCoreGenerator(this._fileService))\r\n generators.push(new BootstrapGenerator(this._fileService))\r\n generators.push(new EnvGenerator(this._fileService))\r\n generators.push(new GitIgnoreGenerator(this._fileService))\r\n generators.push(new ReadmeGenerator(this._fileService))\r\n generators.push(new RegistryGenerator(this._fileService))\r\n generators.push(new TsconfigGenerator(this._fileService))\r\n\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n const { DrizzleGenerator } = await import('../generators/core/drizzle.generator.js')\r\n generators.push(new DrizzleGenerator(this._fileService))\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n const { DrizzleSqlLiteGenerator } =\r\n await import('../generators/core/drizzle-sql-lite.generator.js')\r\n generators.push(new DrizzleSqlLiteGenerator(this._fileService))\r\n }\r\n }\r\n\r\n if (options.targetEnv === TARGET_ENV_CONSTANTS.CONSOLE) {\r\n const { MainGenerator } = await import('../generators/core/main.generator.js')\r\n generators.push(new MainGenerator(this._fileService))\r\n }\r\n // else if (options.targetEnv === CORE_CONSTANTS.VERCEL) {\r\n // const { VercelJsonGenerator } = await import('../generators');\r\n // generators.push(new VercelJsonGenerator());\r\n // } else if (options.targetEnv === CORE_CONSTANTS.FASTIFY) {\r\n // const { FastifysonGenerator } = await import('../generators');\r\n // generators.push(new FastifysonGenerator());\r\n // }\r\n\r\n return generators\r\n }\r\n}\r\n","#!/usr/bin/env node\r\nimport pc from 'picocolors'\r\n\r\nimport { Builder } from './infrastructure/builder'\r\n\r\n/**\r\n * @function init\r\n * @description Initializes the scaffolding process for a new Xeno project.\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @license ISC\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\nasync function init() {\r\n try {\r\n const dispatcher = Builder.getDispatcher()\r\n\r\n const rawArgs = process.argv.slice(2)\r\n\r\n await dispatcher.dispatch(rawArgs)\r\n } catch (error) {\r\n console.error(pc.red('\\n❌ Execution interrupted:'))\r\n console.error(error instanceof Error ? error.message : error)\r\n process.exit(1)\r\n }\r\n}\r\n\r\ninit().catch(console.error)\r\n","import { spawn } from 'node:child_process'\r\n\r\nimport { type ICommandRunner } from '../../domain'\r\n\r\n/**\r\n * @class CommandUtils\r\n * @description Utility class for executing shell commands in a cross-platform manner.\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @license ISC\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\nexport class CommandRunner implements ICommandRunner {\r\n public async run(command: string, args: string[], cwd: string, isWin = false): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const cmd = isWin ? `${command}.cmd` : command\r\n\r\n const child = spawn(cmd, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: false,\r\n })\r\n\r\n child.on('error', (error) => {\r\n reject(new Error(`Error during execution of the command ${command}: ${error.message}`))\r\n })\r\n\r\n child.on('close', (code) => {\r\n if (code === 0) resolve()\r\n else reject(new Error(`Command ${command} failed with code ${code}`))\r\n })\r\n })\r\n }\r\n}\r\n","import pc from 'picocolors'\r\n\r\nimport type { ICliCommand } from '../../domain'\r\nimport { Guards } from '../../shared'\r\nimport { COMMAND_CONSTANTS } from '../../shared/constants/command.constants'\r\nimport { FileUtils } from '../file'\r\n\r\nexport class GenerateCommandQuery implements ICliCommand {\r\n public readonly name: string = 'generate'\r\n public readonly aliases: string[] = ['g']\r\n\r\n public async execute(args: string[]): Promise<void> {\r\n const type = args[0] // \"command\" o \"query\"\r\n const componentName = args[1] // es: \"User\"\r\n const isCore = args.includes('--core')\r\n const isVue = args.includes('--vue')\r\n\r\n if (Guards.isNullOrEmpty(type) || Guards.isNullOrEmpty(componentName)) {\r\n throw new Error(`Invalid syntax. Usage: xeno-js g [command | query] <Name> [--core | --vue]`)\r\n }\r\n\r\n let outputPath: string | undefined = undefined\r\n const outputIndex = args.findIndex((arg) => arg === '--output' || arg === '-o' || arg === '--o')\r\n if (outputIndex !== -1 && args.length > outputIndex + 1) {\r\n outputPath = args[outputIndex + 1]\r\n }\r\n\r\n const targetDir = process.cwd()\r\n const fileService = new FileUtils()\r\n\r\n if (isCore || !isVue) {\r\n const cqrsType =\r\n type === COMMAND_CONSTANTS.COMMAND ? COMMAND_CONSTANTS.COMMAND : COMMAND_CONSTANTS.QUERY\r\n const { CqrsGenerator } = await import('../generators/core/command/cqrs.generator.js')\r\n const generator = new CqrsGenerator(fileService)\r\n\r\n await generator.generate(targetDir, componentName, cqrsType, outputPath)\r\n\r\n console.info(pc.green(`\\n Successfully generated ${type} component '${componentName}'!`))\r\n } else if (isVue) {\r\n const cqrsType =\r\n type === COMMAND_CONSTANTS.COMMAND ? COMMAND_CONSTANTS.COMMAND : COMMAND_CONSTANTS.QUERY\r\n const { CqrsVueGenerator } = await import('../generators/vue/command_query/cqrs.generator.js')\r\n const generator = new CqrsVueGenerator(fileService)\r\n\r\n await generator.generate(targetDir, componentName, cqrsType, outputPath)\r\n\r\n console.info(\r\n pc.green(`\\n✅ Successfully generated Vue ${type} component '${componentName}'!`),\r\n )\r\n } else {\r\n throw new Error(`Unsupported generator type: '${type}'. Use 'command' or 'query'.`)\r\n }\r\n }\r\n}\r\n","import { mkdir, writeFile } from 'fs/promises'\r\nimport { dirname } from 'path'\r\n\r\nimport { type IFileService } from '../../domain'\r\n\r\nexport class FileUtils implements IFileService {\r\n public async writeFileRecursive(filePath: string, content: string): Promise<void> {\r\n const dir = dirname(filePath)\r\n\r\n await mkdir(dir, { recursive: true })\r\n\r\n await writeFile(filePath, content, 'utf8')\r\n }\r\n}\r\n","import pc from 'picocolors'\r\n\r\nimport type { ICliCommand } from '../../domain'\r\nimport { ARGS_CONSTANTS, COMMAND_CONSTANTS } from '../../shared'\r\n\r\nexport class HelpCommand implements ICliCommand {\r\n public get name(): string {\r\n return COMMAND_CONSTANTS.HELP\r\n }\r\n public get aliases(): string[] {\r\n return [ARGS_CONSTANTS.HELP, '-h']\r\n }\r\n\r\n public async execute(): Promise<void> {\r\n console.info(pc.greenBright('\\n🚀 Xeno CLI - Usage Guide\\n'))\r\n\r\n // --- NEW PROJECT ---\r\n console.info(pc.bold(pc.blue('1. Create a new project:')))\r\n console.info(` xeno-js new ${pc.yellow('<name>')} ${pc.cyan('[--vue | --core]')}`)\r\n console.info(` ${pc.gray('•')} ${pc.yellow('<name>')}: The name of your project directory.`)\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.cyan('[--vue | --core]')}: Project type. ${pc.gray('(Default: --core)')}`,\r\n )\r\n console.info(` - ${pc.cyan('--core')}: Initializes a Backend project (Node.js/TS).`)\r\n console.info(` - ${pc.cyan('--vue')}: Initializes a Frontend project (Vue.js).\\n`)\r\n\r\n // --- GENERATE ---\r\n console.info(pc.bold(pc.blue('2. Generate CQRS components:')))\r\n console.info(\r\n ` xeno-js generate ${pc.magenta('<type>')} ${pc.yellow('<Name>')} ${pc.cyan('[--vue | --core]')} ${pc.green('[--output <path>]')}`,\r\n )\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.magenta('<type>')}: Component type to generate (${pc.magenta('command')} | ${pc.magenta('query')}).`,\r\n )\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.yellow('<Name>')}: The name of the component (e.g., UserCreate).`,\r\n )\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.cyan('[--vue | --core]')}: Target context. ${pc.gray('(Default: --core)')}`,\r\n )\r\n console.info(\r\n ` - ${pc.cyan('--core')}: Generates Controller, Handler, Command/Query, Module, and Zod/DB schemas.`,\r\n )\r\n console.info(\r\n ` - ${pc.cyan('--vue')}: Generates frontend-specific files (Stores, Services, etc.).`,\r\n )\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.green('[--output | -o]')}: Custom destination path inside 'src/'. ${pc.gray('(Default: src/<name-in-lowercase>)')}`,\r\n )\r\n console.info(\r\n ` ${pc.gray('Alias:')} ${pc.gray('xeno-js g <type> <Name> [--vue | --core] [-o | --o <path>]')}\\n`,\r\n )\r\n\r\n // --- HELP ---\r\n console.info(pc.bold(pc.blue('3. Help:')))\r\n console.info(` xeno-js --help ${pc.gray('Displays this guide.')}`)\r\n console.info(` ${pc.gray('Alias:')} ${pc.gray('xeno-js --h | -h')}\\n`)\r\n\r\n // --- DOCS ---\r\n console.info(pc.bold(pc.blue('Documentation:')))\r\n console.info(` ${pc.underline('https://www.xeno-js.it')}\\n`)\r\n }\r\n}\r\n","import pc from 'picocolors'\r\n\r\nimport type { ICliCommand } from '../../domain'\r\nimport type { IScaffoldStrategy } from '../../domain'\r\nimport { type ScaffoldingOptions } from '../../shared'\r\nimport { Bootstrapper } from '../bootstrap'\r\nimport { FileUtils } from '../file'\r\nimport { CommandRunner } from './command-runner.service'\r\n\r\nexport class NewProjectCommand implements ICliCommand {\r\n public readonly name: string = 'new'\r\n public readonly aliases: string[] = []\r\n\r\n public async execute(args: string[]): Promise<void> {\r\n const targetDir = args.find((arg) => !arg.startsWith('--')) ?? 'my-xeno-app'\r\n const isVue = args.includes('--vue')\r\n const fileService = new FileUtils()\r\n\r\n let strategy: IScaffoldStrategy<ScaffoldingOptions>\r\n\r\n if (isVue) {\r\n const { VueScaffoldStrategy } = await import('../strategies/vue-scaffold.strategy.js')\r\n strategy = new VueScaffoldStrategy(fileService)\r\n } else {\r\n const { CoreScaffoldStrategy } = await import('../strategies/core-scaffold.strategy.js')\r\n strategy = new CoreScaffoldStrategy(fileService)\r\n }\r\n\r\n const options = await strategy.promptOptions(targetDir)\r\n\r\n const generators = await strategy.getGenerators(options)\r\n const bootstrapper = new Bootstrapper(generators)\r\n await bootstrapper.run(targetDir, options)\r\n\r\n const commandRunner = new CommandRunner()\r\n if (options.gitInit) {\r\n console.info(pc.greenBright('\\n🗂️ Initializing Git repository...'))\r\n await commandRunner.run('git', ['init'], targetDir)\r\n }\r\n console.info(pc.greenBright('\\n📦 Installing dependencies...'))\r\n const isWin = process.platform === 'win32'\r\n await commandRunner.run('npm', ['install'], targetDir, isWin)\r\n\r\n console.info(pc.green(`\\n✅ Project successfully created in ./${targetDir}`))\r\n console.info(pc.white(`\\nNext steps:\\n cd ${targetDir}\\n npm run start\\n`))\r\n }\r\n}\r\n","// src/core/bootstrapper.ts\r\nimport { mkdir } from 'node:fs/promises'\r\nimport { resolve } from 'node:path'\r\n\r\nimport pc from 'picocolors'\r\n\r\nimport type { IGenerator } from '../../domain'\r\nimport { type BaseOptions, type ScaffoldingOptions } from '../../shared'\r\n\r\nexport class Bootstrapper<T extends BaseOptions = ScaffoldingOptions> {\r\n constructor(private readonly _generators: IGenerator<T>[]) {}\r\n\r\n public async run(projectPath: string, options: T): Promise<void> {\r\n console.info(pc.cyan('\\n🚀 Initializing scaffolding...'))\r\n\r\n const absolutePath = resolve(process.cwd(), projectPath)\r\n await mkdir(absolutePath, { recursive: true })\r\n\r\n for (const generator of this._generators) {\r\n try {\r\n await generator.generate(absolutePath, options)\r\n } catch (error) {\r\n console.error(pc.red(`\\n❌ Error during execution of ${generator.constructor.name}`))\r\n throw error\r\n }\r\n }\r\n\r\n console.info(pc.green('\\n✨ Scaffolding completed succesfully!'))\r\n }\r\n}\r\n","import pc from 'picocolors'\r\n\r\nimport type { ICliCommand, IDispatcher } from '../../domain'\r\nimport { ARGS_CONSTANTS, COMMAND_CONSTANTS, Guards } from '../../shared'\r\n\r\nexport class CliDispatcher implements IDispatcher {\r\n private readonly _commands = new Map<string, ICliCommand>()\r\n\r\n constructor(commands: ICliCommand[]) {\r\n for (const command of commands) {\r\n this._commands.set(command.name, command)\r\n for (const alias of command.aliases) {\r\n this._commands.set(alias, command)\r\n }\r\n }\r\n }\r\n\r\n public async dispatch(rawArgs: string[]): Promise<void> {\r\n const action = rawArgs[0]\r\n\r\n if (\r\n !Guards.isDefined(action) ||\r\n action === ARGS_CONSTANTS.HELP ||\r\n action === '-h' ||\r\n action === '--h'\r\n ) {\r\n const helpCommand = this._commands.get(COMMAND_CONSTANTS.HELP)\r\n await helpCommand?.execute([])\r\n return\r\n }\r\n\r\n const command = this._commands.get(action)\r\n\r\n if (!Guards.isDefined(command)) {\r\n console.error(pc.red(`\\n❌ '${action}' is not a command`))\r\n console.info(\r\n pc.yellow(`See 'xeno-js --help' for cli usage guide or https://www.xeno-js.it for docs.\\n`),\r\n )\r\n process.exit(1)\r\n }\r\n\r\n const commandArgs = rawArgs.slice(1)\r\n await command.execute(commandArgs)\r\n }\r\n}\r\n","import { type IDispatcher } from '../../domain'\r\nimport { GenerateCommandQuery, HelpCommand, NewProjectCommand } from '../commands'\r\nimport { CliDispatcher } from '../dispatcher'\r\n\r\nexport class Builder {\r\n public static getDispatcher(): IDispatcher {\r\n const dispatcher = new CliDispatcher([\r\n new NewProjectCommand(),\r\n new GenerateCommandQuery(),\r\n new HelpCommand(),\r\n ])\r\n\r\n return dispatcher\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAa,gBAOA,mBAMA;AAbb;AAAA;AAAA;AAAO,IAAM,iBAAiB,OAAO,OAAO;AAAA,MAC1C,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAU;AAEH,IAAM,oBAAoB,OAAO,OAAO;AAAA,MAC7C,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,IACT,CAAU;AAEH,IAAM,uBAAuB,OAAO,OAAO;AAAA,MAChD,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAU;AAAA;AAAA;;;ACjBV,IAAa;AAAb;AAAA;AAAA;AAAO,IAAM,iBAAiB,OAAO,OAAO;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAU;AAAA;AAAA;;;ACNV;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA,IAEM,YACA,UAWO;AAdb;AAAA;AAAA;AAEA,IAAM,aAAa;AACnB,IAAM,WAAW;AAWV,IAAM,SAAS,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYlC,UAAkB,OAAuC;AACvD,eAAO,UAAU,QAAQ,UAAU,UAAa,UAAU,MAAM,CAAC,OAAO,MAAM,KAAK;AAAA,MACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,cAAsB,OAAiD;AACrE,eACE,CAAC,OAAO,UAAU,KAAK,KACtB,OAAO,SAAS,KAAK,KAAK,MAAM,KAAK,MAAM,MAC3C,OAAO,QAAQ,KAAK,KAAK,MAAM,WAAW;AAAA,MAE/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAcA,mBAA2B,OAAsB,cAA4B;AAC3E,YAAI,OAAO,cAAc,KAAK,GAAG;AAC/B,gBAAM,IAAI,MAAM,YAAY;AAAA,QAC9B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAcA,gBAAgB,OAAe,cAA4B;AACzD,YAAI,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACxC,gBAAM,IAAI,MAAM,YAAY;AAAA,QAC9B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAcA,kBAAkB,OAAe,cAA4B;AAC3D,YAAI,CAAC,OAAO,UAAU,KAAK,GAAG;AAC5B,gBAAM,IAAI,MAAM,YAAY;AAAA,QAC9B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAcA,UAAU,KAAc,YAA6B;AACnD,YAAI,CAAC,KAAK,UAAU,GAAG,EAAG,QAAO;AAGjC,eAAO,OAAO,WAAY,IAA4B,UAAU,CAAC;AAAA,MACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,SAAS,OAAiC;AACxC,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,SAAS,OAAiC;AACxC,eAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,UAAU,OAAiC;AACzC,eAAO,OAAO,SAAS,KAAK,KAAK,OAAO,UAAU,KAAK;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,UAAU,OAAkC;AAC1C,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,SAAS,OAAiC;AACxC,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,SAAS,OAAiC;AACxC,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,WAAW,OAAmE;AAC5E,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,QAAgB,OAAmC;AACjD,eAAO,MAAM,QAAQ,KAAK;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,OAAO,OAA+B;AACpC,YAAI,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM,UAAU;AACtD,iBAAO;AAAA,QACT;AAEA,eAAO,OAAO,SAAU,MAAe,QAAQ,CAAC;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,QAAQ,OAAgC;AACtC,eAAO,iBAAiB;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,eAAe,OAAwD;AACrE,YAAI,CAAC,OAAO,UAAU,KAAK,GAAG;AAC5B,iBAAO;AAAA,QACT;AAEA,eAAO,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,SAAS,OAAiC;AACxC,eAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK;AAAA,MAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,cAAsB,OAA8C;AAClE,YAAI,CAAC,OAAO,UAAU,KAAK,GAAG;AAC5B,iBAAO;AAAA,QACT;AAEA,YAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,WAAW,KAAK,GAAG;AACxD,iBAAO;AAAA,QACT;AAEA,cAAM,aAAc,MAA8B,MAAM;AACxD,eAAO,OAAO,WAAW,UAAU;AAAA,MACrC;AAAA,IACF,CAAU;AAAA;AAAA;;;AC7UV,IAEa;AAFb;AAAA;AAAA;AAAA;AAEO,IAAM,cAAc,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWvC,6BAA6B,OAAuB;AAClD,YAAI,CAAC,OAAO,SAAS,KAAK,KAAK,OAAO,cAAc,KAAK,EAAG,QAAO;AACnE,eAAO,MAAM,QAAQ,mBAAmB,OAAO;AAAA,MACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,UAAU,OAAuB;AAC/B,cAAM,WAAW,MAAM,MAAM,SAAS;AACtC,cAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,cAAM,OAAO,OAAO,UAAU,KAAK,IAAI,MAAM,YAAY,IAAI;AAC7D,eAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,MACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,WAAW,OAAuB;AAChC,YAAI,CAAC,OAAO,SAAS,KAAK,KAAK,OAAO,cAAc,KAAK,EAAG,QAAO;AAEnE,cAAM,WAAW,MAAM,MAAM,SAAS;AAEtC,eAAO,SACJ,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,EAC9B,IAAI,CAAC,QAAQ;AAGZ,gBAAM,aAAa,QAAQ,IAAI,YAAY,IAAI,IAAI,YAAY,IAAI;AACnE,iBAAO,WAAW,OAAO,CAAC,EAAE,YAAY,IAAI,WAAW,MAAM,CAAC;AAAA,QAChE,CAAC,EACA,KAAK,EAAE;AAAA,MACZ;AAAA,IACF,CAAU;AAAA;AAAA;;;AC3DV;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA;AAAA;AAAA;AAAA;AAAA,sBAIa;AAJb;AAAA;AAAA;AAAA,uBAAiB;AAIV,IAAM,+BAAN,MAAmC;AAAA,MACxC,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SACX,YACA,WACA,aACA,cACA,QACA,YACe;AAEf,cAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMZ,UAAU;AAAA;AAAA,iBAER,WAAW;AAAA;AAAA;AAAA;AAIxB,cAAM,KAAK,aAAa;AAAA,UACtB,iBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,aAAa;AAAA,UACjD;AAAA,QACF;AAGA,cAAM,iBAAiB;AAAA;AAAA,WAEhB,UAAU,qBAAqB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMpC,UAAU,+BAA+B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAOzB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO/C,cAAM,KAAK,aAAa;AAAA,UACtB,iBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,aAAa;AAAA,UACjD;AAAA,QACF;AAGA,cAAM,oBAAoB;AAAA;AAAA,WAEnB,UAAU,qBAAqB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMpC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BASC,UAAU;AAAA;AAAA;AAAA;AAAA,uEAImC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7E,cAAM,KAAK,aAAa;AAAA,UACtB,iBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,gBAAgB;AAAA,UACpD;AAAA,QACF;AAGA,cAAM,gBAAgB;AAAA;AAAA,mBAEP,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQd,UAAU,mBAAmB,UAAU;AAAA,iCACrB,UAAU;AAAA;AAAA;AAAA;AAAA,2BAIhB,UAAU,wBAAwB,UAAU;AAAA,qBAClD,UAAU;AAAA;AAAA;AAAA;AAI3B,cAAM,KAAK,aAAa;AAAA,UACtB,iBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,YAAY;AAAA,UAChD;AAAA,QACF;AAGA,YAAI,QAAQ;AACV,gBAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOV,UAAU;AAAA;AAAA;AAAA;AAInB,gBAAM,KAAK,aAAa;AAAA,YACtB,iBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,gBAAgB;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AAGA,YAAI,YAAY;AACd,gBAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOT,SAAS,gBAAgB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMnC,UAAU,gBAAgB,SAAS;AAAA,iBAChC,UAAU,gBAAgB,SAAS;AAAA;AAE9C,gBAAM,KAAK,aAAa;AAAA,YACtB,iBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,eAAe;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAGA,cAAM,gBAAgB;AAAA;AAAA,WAEf,UAAU,wBAAwB,SAAS;AAAA,WAC3C,UAAU,qBAAqB,SAAS;AAAA;AAAA,eAEpC,UAAU;AAAA;AAAA,6BAEI,WAAW,oCAAoC,UAAU;AAAA,0BAC5D,WAAW,iCAAiC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMnE,WAAW;AAAA,aACX,WAAW,8BAA8B,UAAU;AAAA;AAAA;AAAA;AAAA;AAK5D,cAAM,KAAK,aAAa;AAAA,UACtB,iBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,YAAY;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC9LA;AAAA;AAAA;AAAA;AAAA,IAAAC,mBAIa;AAJb;AAAA;AAAA;AAAA,IAAAA,oBAAiB;AAIV,IAAM,6BAAN,MAAiC;AAAA,MACtC,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SACX,YACA,WACA,aACA,cACA,QACe;AACf,cAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMV,UAAU;AAAA;AAAA;AAAA,eAGV,WAAW;AAAA;AAAA;AAAA;AAAA,8BAII,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASnC,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAC,QAAK,KAAK,cAAc,GAAG,SAAS,WAAW;AAAA,UAC/C;AAAA,QACF;AAGA,cAAM,iBAAiB;AAAA;AAAA,WAEhB,UAAU,mBAAmB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMlC,UAAU,+BAA+B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAQzB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO/C,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,aAAa;AAAA,UACjD;AAAA,QACF;AAGA,cAAM,oBAAoB;AAAA;AAAA,WAEnB,UAAU,mBAAmB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMlC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BASG,UAAU;AAAA;AAAA;AAAA;AAAA,uEAIiC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7E,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,gBAAgB;AAAA,UACpD;AAAA,QACF;AAGA,YAAI,QAAQ;AACV,gBAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOV,UAAU;AAAA;AAAA;AAAA;AAInB,gBAAM,KAAK,aAAa;AAAA,YACtB,kBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,gBAAgB;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AAGA,cAAM,gBAAgB;AAAA;AAAA,WAEf,UAAU,wBAAwB,SAAS;AAAA,WAC3C,UAAU,qBAAqB,SAAS;AAAA;AAAA,eAEpC,UAAU;AAAA;AAAA,6BAEI,WAAW,kCAAkC,UAAU;AAAA,0BAC1D,WAAW,+BAA+B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMjE,WAAW;AAAA,aACX,WAAW,4BAA4B,UAAU;AAAA;AAAA;AAAA;AAAA;AAK1D,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,YAAY;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACrJA;AAAA;AAAA;AAAA;AAAA,IAAAC,kBACAC,mBAKa;AANb;AAAA;AAAA;AAAA,IAAAD,mBAAe;AACf,IAAAC,oBAAiB;AAGjB;AAEO,IAAM,gBAAN,MAAoB;AAAA,MACzB,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SACX,WACA,MACA,MACA,YACe;AACf,cAAM,aAAa,YAAY,WAAW,IAAI;AAC9C,cAAM,cAAc,YAAY,6BAA6B,UAAU,EAAE,YAAY;AACrF,cAAM,YAAY,KAAK,YAAY;AACnC,cAAM,oBAAoB,cAAc;AACxC,cAAM,eAAe,kBAAAC,QAAK,KAAK,WAAW,OAAO,iBAAiB;AAElE,YAAI,SAAS;AACb,YAAI,aAAa;AAEjB,YAAI;AACF,gBAAM,aAAa,MAAM,iBAAAC,QAAG,SAAS,kBAAAD,QAAK,KAAK,WAAW,cAAc,GAAG,MAAM;AACjF,gBAAM,UAAU,KAAK,MAAM,UAAU;AAIrC,gBAAM,OAAO,EAAE,GAAI,QAAQ,gBAAgB,CAAC,GAAI,GAAI,QAAQ,mBAAmB,CAAC,EAAG;AACnF,mBAAS,CAAC,CAAC,OAAO,UAAU,KAAK,KAAK,CAAC;AACvC,uBAAa,CAAC,CAAC,OAAO,UAAU,KAAK,aAAa,CAAC;AAAA,QACrD,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,MAAM;AAAA,UACZ,KAAK,kBAAkB,SAAS;AAC9B,kBAAM,EAAE,8BAAAE,8BAA6B,IAAI,MAAM;AAC/C,kBAAM,YAAY,IAAIA,8BAA6B,KAAK,YAAY;AACpE,mBAAO,UAAU;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,UACA,KAAK,kBAAkB,OAAO;AAC5B,kBAAM,EAAE,4BAAAC,4BAA2B,IAAI,MAAM;AAC7C,kBAAM,iBAAiB,IAAIA,4BAA2B,KAAK,YAAY;AACvE,mBAAO,eAAe,SAAS,YAAY,WAAW,aAAa,cAAc,MAAM;AAAA,UACzF;AAAA,UACA;AACE,kBAAM,IAAI,MAAM,gCAAgC,OAAO,IAAI,CAAC,8BAA8B;AAAA,QAC9F;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC9DA;AAAA;AAAA;AAAA;AAAA,IAAAC,mBAIa;AAJb;AAAA;AAAA;AAAA,IAAAA,oBAAiB;AAIV,IAAM,8BAAN,MAAkC;AAAA,MACvC,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SACX,YACA,WACA,aACA,cACe;AAEf,cAAM,iBAAiB;AAAA;AAAA,eAEZ,UAAU;AAAA;AAAA,iBAER,WAAW;AAAA;AAAA;AAAA;AAIxB,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAC,QAAK,KAAK,cAAc,GAAG,SAAS,aAAa;AAAA,UACjD;AAAA,QACF;AAEA,cAAM,iBAAiB;AAAA;AAAA,gBAEX,UAAU,qBAAqB,SAAS;AAAA,gBACxC,UAAU,sBAAsB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQpD,WAAW,sBAAsB,UAAU,YAAY,UAAU;AAAA;AAAA;AAAA;AAAA,mBAInD,WAAW,kBAAkB,UAAU;AAAA;AAAA;AAAA,eAG3C,UAAU,+BAA+B,UAAU,YAAY,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,mCAKrD,UAAU,qDAAqD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxG,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,aAAa;AAAA,UACjD;AAAA,QACF;AAEA,cAAM,oBAAoB;AAAA;AAAA;AAAA,WAGnB,UAAU,qBAAqB,SAAS;AAAA,gBACnC,UAAU,YAAY,UAAU,sBAAsB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQ1E,WAAW,sBAAsB,UAAU,YAAY,UAAU;AAAA;AAAA;AAAA;AAAA,mBAInD,WAAW,kBAAkB,UAAU;AAAA;AAAA;AAAA,qBAGrC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,sCAKO,UAAU,gCAAgC,UAAU;AAAA;AAAA;AAAA;AAAA,qBAIrE,UAAU;AAAA,wBACP,UAAU;AAAA,qBACb,WAAW;AAAA;AAAA,gCAEA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAOX,WAAW;AAAA,kCACT,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BxC,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,OAAO,SAAS,gBAAgB;AAAA,UACxD;AAAA,QACF;AAGA,cAAM,eAAe,oBAAoB,UAAU;AAAA;AAAA;AAAA;AAAA,mBAIpC,UAAU;AAAA;AAAA;AAAA;AAIzB,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,WAAW;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACxJA;AAAA;AAAA;AAAA;AAAA,IAAAC,mBAIa;AAJb;AAAA;AAAA;AAAA,IAAAA,oBAAiB;AAIV,IAAM,4BAAN,MAAgC;AAAA,MACrC,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SACX,YACA,WACA,aACA,cACe;AAEf,cAAM,eAAe;AAAA,gBACT,UAAU,sBAAsB,SAAS;AAAA;AAAA,eAE1C,UAAU,uBAAuB,UAAU;AAAA;AAAA,iBAEzC,WAAW;AAAA;AAAA,0BAEF,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ/B,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAC,QAAK,KAAK,cAAc,GAAG,SAAS,WAAW;AAAA,UAC/C;AAAA,QACF;AAEA,cAAM,iBAAiB;AAAA;AAAA,gBAEX,UAAU,mBAAmB,SAAS;AAAA,gBACtC,UAAU,sBAAsB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQpD,WAAW,sBAAsB,UAAU,UAAU,UAAU;AAAA;AAAA;AAAA;AAAA,mBAIjD,WAAW,kBAAkB,UAAU;AAAA;AAAA;AAAA,eAG3C,UAAU,+BAA+B,UAAU,UAAU,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,iCAKrD,UAAU,mDAAmD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQpG,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,aAAa;AAAA,UACjD;AAAA,QACF;AAGA,cAAM,oBAAoB;AAAA;AAAA;AAAA,WAGnB,UAAU,mBAAmB,SAAS;AAAA,gBACjC,UAAU,sBAAsB,SAAS;AAAA;AAAA,qBAEpC,UAAU;AAAA;AAAA;AAAA,uBAGR,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAS5B,WAAW,sBAAsB,UAAU,UAAU,UAAU;AAAA;AAAA;AAAA;AAAA,mBAIjD,WAAW,kBAAkB,UAAU;AAAA;AAAA;AAAA,6CAGb,UAAU;AAAA;AAAA;AAAA;AAAA,qBAIlC,UAAU;AAAA,wBACP,UAAU;AAAA,qBACb,WAAW;AAAA;AAAA,gCAEA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAQX,WAAW;AAAA,gCACX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCtC,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,OAAO,SAAS,gBAAgB;AAAA,UACxD;AAAA,QACF;AAGA,cAAM,eAAe,oBAAoB,UAAU;AAAA;AAAA;AAAA;AAInD,cAAM,KAAK,aAAa;AAAA,UACtB,kBAAAA,QAAK,KAAK,cAAc,GAAG,SAAS,WAAW;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChKA,IAAAC,0BAAA;AAAA,SAAAA,yBAAA;AAAA;AAAA;AAAA,IAAAC,mBAKa;AALb,IAAAC,uBAAA;AAAA;AAAA;AAAA,IAAAD,oBAAiB;AAGjB;AAEO,IAAM,mBAAN,MAAuB;AAAA,MAC5B,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SACX,WACA,MACA,MACA,YACe;AACf,cAAM,aAAa,YAAY,WAAW,IAAI;AAC9C,cAAM,cAAc,YAAY,6BAA6B,UAAU,EAAE,YAAY;AACrF,cAAM,YAAY,KAAK,YAAY;AACnC,cAAM,oBAAoB,cAAc;AACxC,cAAM,eAAe,kBAAAE,QAAK,KAAK,WAAW,OAAO,iBAAiB;AAElE,gBAAQ,MAAM;AAAA,UACZ,KAAK,kBAAkB,SAAS;AAC9B,kBAAM,EAAE,6BAAAC,6BAA4B,IAAI,MAAM;AAC9C,kBAAM,YAAY,IAAIA,6BAA4B,KAAK,YAAY;AACnE,mBAAO,UAAU,SAAS,YAAY,WAAW,aAAa,YAAY;AAAA,UAC5E;AAAA,UACA,KAAK,kBAAkB,OAAO;AAC5B,kBAAM,EAAE,2BAAAC,2BAA0B,IAAI,MAAM;AAC5C,kBAAM,iBAAiB,IAAIA,2BAA0B,KAAK,YAAY;AACtE,mBAAO,eAAe,SAAS,YAAY,WAAW,aAAa,YAAY;AAAA,UACjF;AAAA,UACA;AACE,kBAAM,IAAI,MAAM,gCAAgC,OAAO,IAAI,CAAC,8BAA8B;AAAA,QAC9F;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACnCA;AAAA;AAAA;AAAA;AAAA,IAAAC,mBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,oBAAiB;AAKV,IAAM,0BAAN,MAAgE;AAAA,MACrE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAC7E,cAAM,cAAc;AAAA,UAClB,MAAM,QAAQ;AAAA,UACd,SAAS;AAAA,UACT,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS;AAAA,YACP,KAAK;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,GAAG;AAAA,UACL;AAAA,UACA,cAAc;AAAA,YACZ,gBAAgB;AAAA,YAChB,OAAO;AAAA,UACT;AAAA,UACA,iBAAiB;AAAA,YACf,eAAe;AAAA,YACf,sBAAsB;AAAA,YACtB,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,WAAW;AAAA,UACb;AAAA,QACF;AAEA,YAAI,QAAQ,MAAO,aAAY,aAAa,OAAO,IAAI;AACvD,YAAI,QAAQ,UAAW,aAAY,aAAa,WAAW,IAAI;AAC/D,YAAI,QAAQ,SAAU,aAAY,aAAa,uBAAuB,IAAI;AAC1E,YAAI,QAAQ,OAAQ,aAAY,aAAa,aAAa,IAAI;AAC9D,YAAI,QAAQ,MAAO,aAAY,aAAa,OAAO,IAAI;AACvD,YAAI,QAAQ,OAAQ,aAAY,aAAa,YAAY,IAAI;AAC7D,YAAI,QAAQ,IAAK,aAAY,aAAa,KAAK,IAAI;AAEnD,YAAI,QAAQ,UAAU;AACpB,sBAAY,gBAAgB,aAAa,IAAI;AAC7C,sBAAY,gBAAgB,mBAAmB,IAAI;AAAA,QACrD;AAEA,cAAM,WAAW,kBAAAC,QAAK,KAAK,aAAa,cAAc;AACtD,cAAM,KAAK,aAAa,mBAAmB,UAAU,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,MAC3F;AAAA,IACF;AAAA;AAAA;;;ACjDA;AAAA;AAAA;AAAA;AAAA,IACAC,mBAKa;AANb;AAAA;AAAA;AACA,IAAAA,oBAAiB;AAKV,IAAM,sBAAN,MAA4D;AAAA,MACjE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAC7E,cAAM,iBAAiB,QAAQ,WAAW;AAAA,gDAAmD;AAC7F,cAAM,iBAAiB,QAAQ,WAAW;AAAA,sBAAyB;AAEnE,cAAM,UAAU;AAAA,uCACmB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,YAKzC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYtB,cAAM,WAAW,kBAAAC,QAAK,KAAK,aAAa,gBAAgB;AACxD,cAAM,KAAK,aAAa,mBAAmB,UAAU,OAAO;AAAA,MAC9D;AAAA,IACF;AAAA;AAAA;;;AClCA;AAAA;AAAA;AAAA;AAAA,IACAC,oBAKa;AANb;AAAA;AAAA;AACA,IAAAA,qBAAiB;AAKV,IAAM,kBAAN,MAAwD;AAAA,MAC7D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAC7E,YAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAMd,YAAI,QAAQ,OAAO;AACjB,qBAAW;AAAA;AAAA;AAAA;AAAA,QAGb;AAEA,YAAI,QAAQ,UAAU;AACpB,qBAAW;AAAA;AAAA;AAAA;AAAA;AAAA,QAIb;AAEA,YAAI,QAAQ,QAAQ;AAClB,qBAAW;AAAA;AAAA;AAAA;AAAA,QAGb;AAEA,cAAM,KAAK,aAAa,mBAAmB,mBAAAC,QAAK,KAAK,aAAa,MAAM,GAAG,OAAO;AAClF,cAAM,KAAK,aAAa,mBAAmB,mBAAAA,QAAK,KAAK,aAAa,cAAc,GAAG,OAAO;AAAA,MAC5F;AAAA,IACF;AAAA;AAAA;;;ACtCA;AAAA;AAAA;AAAA;AAAA,IACAC,oBAKa;AANb;AAAA;AAAA;AACA,IAAAA,qBAAiB;AAKV,IAAM,uBAAN,MAA6D;AAAA,MAClE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,UAAqC;AAC9E,cAAM,WAAW;AAAA,UACf,iBAAiB;AAAA,YACf,QAAQ;AAAA,YACR,yBAAyB;AAAA,YACzB,QAAQ;AAAA,YACR,kBAAkB;AAAA,YAClB,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,mBAAmB;AAAA,YACnB,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,KAAK,CAAC,UAAU,OAAO,cAAc;AAAA,YACrC,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,OAAO,CAAC,aAAa;AAAA,YACrB,OAAO;AAAA,cACL,OAAO,CAAC,SAAS;AAAA,YACnB;AAAA,UACF;AAAA,UACA,SAAS,CAAC,eAAe,iBAAiB,gBAAgB,cAAc;AAAA,QAC1E;AAEA,cAAM,KAAK,aAAa;AAAA,UACtB,mBAAAC,QAAK,KAAK,aAAa,eAAe;AAAA,UACtC,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACrCA;AAAA;AAAA;AAAA;AAAA,IACAC,oBAKa;AANb;AAAA;AAAA;AACA,IAAAA,qBAAiB;AAKV,IAAM,qBAAN,MAA2D;AAAA,MAChE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAC7E,cAAM,UAAU,KAAK,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["path","import_node_path","path","import_promises","import_node_path","path","fs","GenerateCommandCoreGenerator","GenerateQueryCoreGenerator","import_node_path","path","import_node_path","path","cqrs_generator_exports","import_node_path","init_cqrs_generator","path","GenerateCommandVueGenerator","GenerateQueryVueGenerator","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","prompts","PackageJsonVueGenerator","ViteconfigGenerator","EnvVueGenerator","TsconfigVueGenerator","ReadmeVueGenerator","GitIgnoreGenerator","AppVueGenerator","BootstrapGenerator","IndexVueGenerator","MainGenerator","RegistryGenerator","RouterGenerator","TailwindGenerator","UseAppVueGenerator","packagejson_generator_exports","import_node_path","init_packagejson_generator","path","BootstrapGenerator","import_node_path","path","env_generator_exports","import_node_path","init_env_generator","path","readme_generator_exports","import_node_path","init_readme_generator","path","RegistryGenerator","import_node_path","path","tsconfig_generator_exports","import_node_path","init_tsconfig_generator","path","import_node_path","path","import_node_path","path","main_generator_exports","MainGenerator","import_node_path","init_main_generator","path","import_prompts","prompts","PackageJsonCoreGenerator","BootstrapGenerator","EnvGenerator","GitIgnoreGenerator","ReadmeGenerator","RegistryGenerator","TsconfigGenerator","DrizzleGenerator","DrizzleSqlLiteGenerator","MainGenerator","import_picocolors","resolve","CqrsGenerator","pc","CqrsVueGenerator","import_picocolors","pc","import_picocolors","import_promises","import_node_path","import_picocolors","pc","VueScaffoldStrategy","CoreScaffoldStrategy","pc","import_picocolors","pc","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants/command.constants.ts","../src/shared/constants/core.constants.ts","../src/shared/constants/index.ts","../src/shared/utils/guards.utils.ts","../src/shared/utils/string.utils.ts","../src/shared/utils/index.ts","../src/shared/index.ts","../src/infrastructure/generators/core/command/generate-command.generator.ts","../src/infrastructure/generators/core/command/generate-query.generator.ts","../src/infrastructure/generators/core/command/cqrs.generator.ts","../src/infrastructure/generators/vue/command_query/generate-command-vue.generator.ts","../src/infrastructure/generators/vue/command_query/generate-query-vue.generator.ts","../src/infrastructure/generators/vue/command_query/cqrs.generator.ts","../src/infrastructure/generators/vue/packagejson.generator.ts","../src/infrastructure/generators/vue/vite-config.generator.ts","../src/infrastructure/generators/vue/env.generator.ts","../src/infrastructure/generators/vue/tsconfig.generator.ts","../src/infrastructure/generators/vue/readme.generator.ts","../src/infrastructure/generators/gitignore.generator.ts","../src/infrastructure/generators/vue/app-vue.generator.ts","../src/infrastructure/generators/vue/bootstrap-ts.generator.ts","../src/infrastructure/generators/vue/index-html.generator.ts","../src/infrastructure/generators/vue/main.generator.ts","../src/infrastructure/generators/vue/registry-ts.generator.ts","../src/infrastructure/generators/vue/router.generator.ts","../src/infrastructure/generators/vue/tailwind.generator.ts","../src/infrastructure/generators/vue/use-app.generator.ts","../src/infrastructure/strategies/vue-scaffold.strategy.ts","../src/infrastructure/generators/core/packagejson.generator.ts","../src/infrastructure/generators/core/bootstrap.generator.ts","../src/infrastructure/generators/core/env.generator.ts","../src/infrastructure/generators/core/readme.generator.ts","../src/infrastructure/generators/core/registry.generator.ts","../src/infrastructure/generators/core/tsconfig.generator.ts","../src/infrastructure/generators/core/drizzle.generator.ts","../src/infrastructure/generators/core/drizzle-sql-lite.generator.ts","../src/infrastructure/generators/core/main.generator.ts","../src/infrastructure/strategies/core-scaffold.strategy.ts","../src/index.ts","../src/infrastructure/commands/command-runner.service.ts","../src/infrastructure/commands/generate.command.ts","../src/infrastructure/file/file.service.ts","../src/infrastructure/commands/help.command.ts","../src/infrastructure/commands/new-project.command.ts","../src/infrastructure/bootstrap/bootstrapper.ts","../src/infrastructure/dispatcher/dispatcher.ts","../src/infrastructure/builder/builder.ts"],"sourcesContent":["export const ARGS_CONSTANTS = Object.freeze({\r\n HELP: '--help',\r\n VUE: '--vue',\r\n CORE: '--core',\r\n CONSOLE: '--console',\r\n} as const)\r\n\r\nexport const COMMAND_CONSTANTS = Object.freeze({\r\n HELP: 'help',\r\n COMMAND: 'command',\r\n QUERY: 'query',\r\n} as const)\r\n\r\nexport const TARGET_ENV_CONSTANTS = Object.freeze({\r\n CONSOLE: 'console',\r\n VERCEL: 'vercel',\r\n FASTIFY: 'fastify',\r\n} as const)\r\n","export const CORE_CONSTANTS = Object.freeze({\r\n VERCEL: 'vercel',\r\n FASTIFY: 'fastify',\r\n DRIZZLE: 'drizzle',\r\n SQL_LITE: 'sqlLite',\r\n NONE: 'none',\r\n} as const)\r\n","export * from './command.constants'\r\nexport * from './core.constants'\r\n","import type { Dictionary, Maybe } from '../types/common.types'\r\n\r\nconst OBJECT_TAG = '[object Object]'\r\nconst DATE_TAG = '[object Date]'\r\n\r\n/**\r\n * @description Centralized type guards and runtime predicates.\r\n\r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\nexport const Guards = Object.freeze({\r\n /**\r\n * @description Checks value is neither null nor undefined.\r\n * @param value Candidate value.\r\n * @returns True when value is defined.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isDefined<TValue>(value: Maybe<TValue>): value is TValue {\r\n return value !== null && value !== undefined && value !== '' && !Number.isNaN(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is null, undefined, empty string, or false.\r\n * @param value Candidate value.\r\n * @returns True when value is null, undefined, empty string, or false.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isNullOrEmpty<TValue>(value: Maybe<TValue>): value is null | undefined {\r\n return (\r\n !Guards.isDefined(value) ||\r\n (Guards.isString(value) && value.trim() === '') ||\r\n (Guards.isArray(value) && value.length === 0)\r\n )\r\n },\r\n\r\n /**\r\n * @description Throws an error if the value is null, undefined, empty string, or false.\r\n * @param value Candidate value.\r\n * @param errorMessage Error message to throw if the check fails.\r\n * @throws Error with the provided message if the value is null, undefined, empty string, or false.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n throwIfNullOrEmpty<TValue>(value: Maybe<TValue>, errorMessage: string): void {\r\n if (Guards.isNullOrEmpty(value)) {\r\n throw new Error(errorMessage)\r\n }\r\n },\r\n\r\n /**\r\n * @description Throws an error if the value is not a positive integer.\r\n * @param value Candidate value.\r\n * @param errorMessage Error message to throw if the check fails.\r\n * @throws Error with the provided message if the value is not a positive integer.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n throwIfNegative(value: number, errorMessage: string): void {\r\n if (Guards.isInteger(value) && value < 0) {\r\n throw new Error(errorMessage)\r\n }\r\n },\r\n\r\n /**\r\n * @description Throws an error if the value is not an integer.\r\n * @param value Candidate value.\r\n * @param errorMessage Error message to throw if the check fails.\r\n * @throws Error with the provided message if the value is not an integer.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n throwIfNotInteger(value: number, errorMessage: string): void {\r\n if (!Guards.isInteger(value)) {\r\n throw new Error(errorMessage)\r\n }\r\n },\r\n\r\n /**\r\n * @description Checks if an object has a method with the given name.\r\n * @param obj Object to check.\r\n * @param methodName Name of the method to look for.\r\n * @returns True when obj has a function property named methodName.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n hasMethod(obj: unknown, methodName: string): boolean {\r\n if (!this.isDefined(obj)) return false\r\n\r\n // Essendo all'interno del namespace di utilità, l'uso di typeof qui è consentito\r\n return Guards.isFunction((obj as Dictionary<unknown>)[methodName])\r\n },\r\n\r\n /**\r\n * @description Checks value is a string.\r\n * @param value Candidate value.\r\n * @returns True when value is string.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isString(value: unknown): value is string {\r\n return typeof value === 'string'\r\n },\r\n\r\n /**\r\n * @description Checks value is a finite number.\r\n * @param value Candidate value.\r\n * @returns True when value is finite number.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isNumber(value: unknown): value is number {\r\n return typeof value === 'number' && Number.isFinite(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is an integer number.\r\n * @param value Candidate value.\r\n * @returns True when value is integer number.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isInteger(value: unknown): value is number {\r\n return Guards.isNumber(value) && Number.isInteger(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is boolean.\r\n * @param value Candidate value.\r\n * @returns True when value is boolean.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isBoolean(value: unknown): value is boolean {\r\n return typeof value === 'boolean'\r\n },\r\n\r\n /**\r\n * @description Checks value is bigint.\r\n * @param value Candidate value.\r\n * @returns True when value is bigint.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isBigInt(value: unknown): value is bigint {\r\n return typeof value === 'bigint'\r\n },\r\n\r\n /**\r\n * @description Checks value is symbol.\r\n * @param value Candidate value.\r\n * @returns True when value is symbol.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isSymbol(value: unknown): value is symbol {\r\n return typeof value === 'symbol'\r\n },\r\n\r\n /**\r\n * @description Checks value is a function.\r\n * @param value Candidate value.\r\n * @returns True when value is function.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isFunction(value: unknown): value is (...args: readonly unknown[]) => unknown {\r\n return typeof value === 'function'\r\n },\r\n\r\n /**\r\n * @description Checks value is an array.\r\n * @param value Candidate value.\r\n * @returns True when value is array.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isArray<TValue>(value: unknown): value is TValue[] {\r\n return Array.isArray(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is a Date instance with valid timestamp.\r\n * @param value Candidate value.\r\n * @returns True when value is valid Date.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isDate(value: unknown): value is Date {\r\n if (Object.prototype.toString.call(value) !== DATE_TAG) {\r\n return false\r\n }\r\n\r\n return Number.isFinite((value as Date).getTime())\r\n },\r\n\r\n /**\r\n * @description Checks value is an Error instance.\r\n * @param value Candidate value.\r\n * @returns True when value is Error.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isError(value: unknown): value is Error {\r\n return value instanceof Error\r\n },\r\n\r\n /**\r\n * @description Checks value is a plain object record.\r\n * @param value Candidate value.\r\n * @returns True when value is object record.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isObjectRecord(value: unknown): value is Readonly<Dictionary<unknown>> {\r\n if (!Guards.isDefined(value)) {\r\n return false\r\n }\r\n\r\n return Object.prototype.toString.call(value) === OBJECT_TAG\r\n },\r\n\r\n /**\r\n * @description Checks value is an object (not null).\r\n * @param value Candidate value.\r\n * @returns True when value is object.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isObject(value: unknown): value is object {\r\n return typeof value === 'object' && Guards.isDefined(value)\r\n },\r\n\r\n /**\r\n * @description Checks value is PromiseLike.\r\n * @param value Candidate value.\r\n * @returns True when value has then function.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n isPromiseLike<TValue>(value: unknown): value is PromiseLike<TValue> {\r\n if (!Guards.isDefined(value)) {\r\n return false\r\n }\r\n\r\n if (!Guards.isObject(value) && !Guards.isFunction(value)) {\r\n return false\r\n }\r\n\r\n const thenMember = (value as Dictionary<unknown>)['then']\r\n return Guards.isFunction(thenMember)\r\n },\r\n} as const)\r\n","import { Guards } from './guards.utils'\r\n\r\nexport const StringUtils = Object.freeze({\r\n /**\r\n * @description Inserisce un underscore (_) tra la fine di una parola e l'inizio della successiva in formato camelCase o PascalCase.\r\n * @param input Stringa in input (es. \"CreateUser\").\r\n * @returns Stringa separata da underscore (es. \"Create_User\").\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2026-09-18\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\n splitCamelCaseWithUnderscore(input: string): string {\r\n if (!Guards.isString(input) || Guards.isNullOrEmpty(input)) return input\r\n return input.replace(/([a-z])([A-Z])/g, '$1_$2')\r\n },\r\n /**\r\n * @description Converts a string to camelCase.\r\n * @param input Input string (supports snake_case, kebab-case, or space-separated).\r\n * @returns camelCase string.\r\n \r\n * \r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js \r\n */\r\n camelCase(input: string): string {\r\n const segments = input.split(/[-_\\s]+/)\r\n const [first, ...rest] = segments\r\n const head = Guards.isDefined(first) ? first.toLowerCase() : ''\r\n return head + rest.map((seg) => seg.charAt(0).toUpperCase() + seg.slice(1)).join('')\r\n },\r\n /**\r\n * @description Converts a string to PascalCase.\r\n * @param input Input string (supports snake_case, kebab-case, space-separated, or camelCase).\r\n * @returns PascalCase string.\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @since 2026-09-18\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\n pascalCase(input: string): string {\r\n if (!Guards.isString(input) || Guards.isNullOrEmpty(input)) return ''\r\n\r\n const segments = input.split(/[-_\\s]+/)\r\n\r\n return segments\r\n .filter((seg) => seg.length > 0)\r\n .map((seg) => {\r\n // Se il segmento è tutto maiuscolo (es. CREATE), lo normalizziamo in minuscolo per evitare cREATE.\r\n // Altrimenti, preserviamo il casing interno originale (es. UserService resta UserService).\r\n const normalized = seg === seg.toUpperCase() ? seg.toLowerCase() : seg\r\n return normalized.charAt(0).toUpperCase() + normalized.slice(1)\r\n })\r\n .join('')\r\n },\r\n} as const)\r\n","export * from './guards.utils'\r\nexport * from './string.utils'\r\n","export * from './constants'\r\nexport type * from './types'\r\nexport * from './utils'\r\n","import path from 'node:path'\n\nimport type { IFileService } from '../../../../domain'\n\nexport class GenerateCommandCoreGenerator {\n constructor(private readonly _fileService: IFileService) {}\n\n public async generate(\n pascalName: string,\n lowerName: string,\n tokenPrefix: string,\n componentDir: string,\n hasZod: boolean,\n hasDrizzle: boolean,\n ): Promise<void> {\n const appDir = path.join(componentDir, 'application')\n const infraDir = path.join(componentDir, 'infrastructure')\n const domainDir = path.join(componentDir, 'domain')\n const presDir = path.join(componentDir, 'presentation')\n\n // 1. Command\n const commandContent = `import { Command } from '@xeno-js/core';\nexport interface ${pascalName}Payload {\n // TODO: Define your command payload properties here\n}\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Please replace <void> with your specific payload and response types.\n */\nexport class ${pascalName}Command extends Command<void> {\n constructor(public readonly payload: ${pascalName}Payload) {\n super('${tokenPrefix}_COMMAND_HANDLER');\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(appDir, `${lowerName}.command.ts`),\n commandContent,\n )\n\n // 2. Handler\n const handlerContent = `import type { IFactory, ResultType, UserContext } from '@xeno-js/core';\nimport { AppError, BaseHandler, Result } from '@xeno-js/core';\nimport { ${pascalName}Command } from './${lowerName}.command';\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Please replace <void> with your specific response type.\n */\nexport class ${pascalName}Handler extends BaseHandler<${pascalName}Command, void> {\n constructor(\n identityFactory: IFactory<void, UserContext>\n ) {\n super(identityFactory);\n }\n\n protected async executeAsync(request: ${pascalName}Command, singal: AbortSignal): Promise<ResultType<void>> {\n // TODO: Implement your business logic here\n\n return Result.ok();\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(appDir, `${lowerName}.handler.ts`),\n handlerContent,\n )\n\n // 3. Controller\n const controllerContent = `import type { IContextAccessor, IMediator, RequestContext, ResponseDto } from '@xeno-js/core';\nimport { BaseController } from '@xeno-js/core';\nimport { ${pascalName}Command, ${pascalName}Payload } from '../application/${lowerName}.command';\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Please replace <{pascalName}Payload, void> with your specific request and response types.\n */\nexport class ${pascalName}Controller extends BaseController<${pascalName}Payload, void> {\n constructor(\n requestContext: IContextAccessor<RequestContext>,\n mediator: IMediator,\n ) {\n super(requestContext, mediator);\n }\n\n public async handle(request: {pascalName}Payload): Promise<ResponseDto<void>> {\n const cmd = new ${pascalName}Command(request);\n const result = await this._send(cmd);\n\n if (!result.isOk()) {\n return this.fail(result.getErrorOrThrow(), 'Error during ${pascalName} operation');\n }\n\n return this.ok(result.getValueOrThrow());\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(presDir, `${lowerName}.controller.ts`),\n controllerContent,\n )\n\n // 4. Entity\n const entityContent = `import { Entity } from '@xeno-js/core';\n\nexport interface ${pascalName}Props {\n // TODO: Define your entity properties\n}\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Adjust the properties and types according to your domain logic.\n */\nexport class ${pascalName} extends Entity<${pascalName}Props> {\n private constructor(props: ${pascalName}Props, id?: string) {\n super(props, id);\n }\n\n static create(props: ${pascalName}Props, id?: string): ${pascalName} {\n return new ${pascalName}(props, id);\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(domainDir, `${lowerName}.entity.ts`),\n entityContent,\n )\n\n // 5. Schema Zod (Condizionale)\n if (hasZod) {\n const zodContent = `import { z } from 'zod';\nimport { ZodUtils } from '@xeno-js/core';\n\n/**\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Define the actual Zod validation schema for your command payload.\n */\nexport const ${pascalName}Schema = ZodUtils.createCommandSchema({\n payload: z.object({\n // TODO: Define strict validation rules here, e.g.:\n // email: z.string().email(),\n // name: z.string().min(1),\n }),\n});\n`\n await this._fileService.writeFileRecursive(\n path.join(infraDir, `${lowerName}.schema-zod.ts`),\n zodContent,\n )\n }\n\n // 6. Schema DB (Condizionale)\n if (hasDrizzle) {\n const dbContent = `import { pgTable, text, timestamp } from 'drizzle-orm/pg-core';\n// Note: If you are using SQLite, change the import to 'drizzle-orm/sqlite-core' and update the table definition.\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Update the schema definition with your actual database columns.\n */\nexport const ${lowerName}s = pgTable('${lowerName}s', {\n id: text('id').primaryKey(),\n createdAt: timestamp('created_at').defaultNow(),\n updatedAt: timestamp('updated_at').defaultNow().$onUpdate(() => new Date()),\n});\n\nexport type ${pascalName}Dto = typeof ${lowerName}s.$inferSelect;\nexport type New${pascalName}Dto = typeof ${lowerName}s.$inferInsert;\n`\n await this._fileService.writeFileRecursive(\n path.join(infraDir, `${lowerName}.schema-db.ts`),\n dbContent,\n )\n }\n\n // 7. Module\n const moduleContent = `import type { IServiceContainer, IConfigurationService } from '@xeno-js/core';\nimport { TOKENS } from '@xeno-js/core';\nimport { ${pascalName}Controller } from './presentation/${lowerName}.controller';\nimport { ${pascalName}Handler } from './application/${lowerName}.handler';\n\nexport const ${pascalName}Module = Object.freeze({\n register(opts: IServiceContainer<any>, _config: IConfigurationService): void {\n opts.addTransient('${tokenPrefix}_COMMAND_CONTROLLER', (c) => new ${pascalName}Controller(c.resolve(TOKENS.REQUEST_CONTEXT), c.resolve(TOKENS.MEDIATOR)));\n opts.addScoped('${tokenPrefix}_COMMAND_HANDLER', (c) => new ${pascalName}Handler(c.resolve(TOKENS.USER_CONTEXT_FACTORY)));\n\n /*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Please copy and paste the following tokens to your MyRegistry interface (usually in src/registry.ts):\n *\n * ${tokenPrefix}_COMMAND_CONTROLLER: IController<any, any>;\n * ${tokenPrefix}_COMMAND_HANDLER: IHandler<${pascalName}Command, any>;\n */\n }\n} as const);\n`\n await this._fileService.writeFileRecursive(\n path.join(componentDir, `${lowerName}.module.ts`),\n moduleContent,\n )\n }\n}\n","import path from 'node:path'\n\nimport type { IFileService } from '../../../../domain'\n\nexport class GenerateQueryCoreGenerator {\n constructor(private readonly _fileService: IFileService) {}\n\n public async generate(\n pascalName: string,\n lowerName: string,\n tokenPrefix: string,\n componentDir: string,\n hasZod: boolean,\n ): Promise<void> {\n const appDir = path.join(componentDir, 'application')\n const infraDir = path.join(componentDir, 'infrastructure')\n const domainDir = path.join(componentDir, 'domain')\n const presDir = path.join(componentDir, 'presentation')\n\n const queryContent = `import { BaseQuery } from '@xeno-js/core';\nexport interface ${pascalName}Payload {\n // TODO: Define your command payload properties here\n}\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Please replace <void> with your specific payload and response types.\n */\nexport class ${pascalName}Query extends BaseQuery<void> {\n constructor(public readonly payload: ${pascalName}Payload) {\n super(\n '${tokenPrefix}_QUERY_HANDLER', \n // Default cache options:\n {\n ttl: 60,\n cacheKey: \\`${lowerName}:\\${JSON.stringify(payload)}\\`,\n bypassCache: false,\n consistentRead: false\n isUserScoped: false,\n }\n );\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(appDir, `${lowerName}.query.ts`),\n queryContent,\n )\n\n // 2. Handler\n const handlerContent = `import type { IFactory, ResultType, UserContext } from '@xeno-js/core';\nimport { AppError, BaseHandler, Result } from '@xeno-js/core';\nimport { ${pascalName}Query } from './${lowerName}.query';\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Please replace <void> with your specific response type.\n */\nexport class ${pascalName}Handler extends BaseHandler<${pascalName}Query, void> {\n constructor(\n identityFactory: IFactory<void, UserContext>\n // TODO: Inject your ReadDao or DataSource here\n ) {\n super(identityFactory);\n }\n\n protected async executeAsync(request: ${pascalName}Query, singal: AbortSignal): Promise<ResultType<void>> {\n // TODO: Implement your query logic here\n\n return Result.ok();\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(appDir, `${lowerName}.handler.ts`),\n handlerContent,\n )\n\n // 3. Controller\n const controllerContent = `import type { IContextAccessor, IMediator, RequestContext, ResponseDto } from '@xeno-js/core';\nimport { BaseController } from '@xeno-js/core';\nimport { ${pascalName}Query, ${pascalName}Payload } from '../presentation/${lowerName}.query';\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Please replace <${pascalName}Payload, void> with your specific request and response types.\n */\nexport class ${pascalName}Controller extends BaseController<${pascalName}Payload, void> {\n constructor(\n requestContext: IContextAccessor<RequestContext>,\n mediator: IMediator,\n ) {\n super(requestContext, mediator);\n }\n\n public async handle(request: ${pascalName}Payload): Promise<ResponseDto<void>> {\n const query = new ${pascalName}Query(request);\n const result = await this._query(query);\n\n if (!result.isOk()) {\n return this.fail(result.getErrorOrThrow(), 'Error during ${pascalName} operation');\n }\n\n return this.ok(result.getValueOrThrow());\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(presDir, `${lowerName}.controller.ts`),\n controllerContent,\n )\n\n const entityContent = `import { Entity } from '@xeno-js/core';\n \n export interface ${pascalName}Props {\n // TODO: Define your entity properties\n }\n \n /*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Adjust the properties and types according to your domain logic.\n */\n export class ${pascalName} extends Entity<${pascalName}Props> {\n private constructor(props: ${pascalName}Props, id?: string) {\n super(props, id);\n }\n \n static create(props: ${pascalName}Props, id?: string): ${pascalName} {\n return new ${pascalName}(props, id);\n }\n }\n `\n await this._fileService.writeFileRecursive(\n path.join(domainDir, `${lowerName}.entity.ts`),\n entityContent,\n )\n\n // 4. Schema Zod\n if (hasZod) {\n const zodContent = `import { z } from 'zod';\nimport { ZodUtils } from '@xeno-js/core';\n\n/**\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Define the actual Zod validation schema for your command payload.\n */\nexport const ${pascalName}Schema = ZodUtils.createCommandSchema({\n payload: z.object({\n // TODO: Define strict validation rules here, e.g.:\n // email: z.string().email(),\n // name: z.string().min(1),\n }),\n});\n`\n await this._fileService.writeFileRecursive(\n path.join(infraDir, `${lowerName}.schema-zod.ts`),\n zodContent,\n )\n }\n\n // 5. Module\n const moduleContent = `import type { IServiceContainer, IConfigurationService } from '@xeno-js/core';\nimport { TOKENS } from '@xeno-js/core';\nimport { ${pascalName}Controller } from './${lowerName}.controller';\nimport { ${pascalName}Handler } from './${lowerName}.handler';\n\nexport const ${pascalName}Module = Object.freeze({\n register(opts: IServiceContainer<any>, _config: IConfigurationService): void {\n opts.addTransient('${tokenPrefix}_QUERY_CONTROLLER', (c) => new ${pascalName}Controller(c.resolve(TOKENS.REQUEST_CONTEXT), c.resolve(TOKENS.MEDIATOR)));\n opts.addScoped('${tokenPrefix}_QUERY_HANDLER', (c) => new ${pascalName}Handler(c.resolve(TOKENS.USER_CONTEXT_FACTORY)));\n\n /*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * Please copy and paste the following tokens to your MyRegistry interface (usually in src/registry.ts):\n *\n * ${tokenPrefix}_QUERY_CONTROLLER: IController<${pascalName}Query, void>;\n * ${tokenPrefix}_QUERY_HANDLER: IHandler<${pascalName}Query, void>;\n */\n }\n} as const);\n`\n await this._fileService.writeFileRecursive(\n path.join(componentDir, `${lowerName}.module.ts`),\n moduleContent,\n )\n }\n}\n","import fs from 'node:fs/promises'\r\nimport path from 'node:path'\r\n\r\nimport type { IFileService } from '../../../../domain'\r\nimport { COMMAND_CONSTANTS, Guards, StringUtils } from '../../../../shared'\r\n\r\nexport class CqrsGenerator {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(\r\n targetDir: string,\r\n name: string,\r\n type: 'command' | 'query',\r\n outputPath?: string,\r\n ): Promise<void> {\r\n const pascalName = StringUtils.pascalCase(name)\r\n const tokenPrefix = StringUtils.splitCamelCaseWithUnderscore(pascalName).toUpperCase()\r\n const lowerName = name.toLowerCase()\r\n const destinationFolder = outputPath ?? lowerName\r\n const componentDir = path.join(targetDir, 'src', destinationFolder)\r\n\r\n let hasZod = false\r\n let hasDrizzle = false\r\n\r\n try {\r\n const pkgJsonStr = await fs.readFile(path.join(targetDir, 'package.json'), 'utf8')\r\n const pkgJson = JSON.parse(pkgJsonStr) as {\r\n dependencies?: Record<string, string>\r\n devDependencies?: Record<string, string>\r\n }\r\n const deps = { ...(pkgJson.dependencies ?? {}), ...(pkgJson.devDependencies ?? {}) }\r\n hasZod = !!Guards.isDefined(deps['zod'])\r\n hasDrizzle = !!Guards.isDefined(deps['drizzle-orm'])\r\n } catch (error) {\r\n console.warn(\r\n ' Warning: Could not read package.json. Assuming Zod and Drizzle are not installed.',\r\n error,\r\n )\r\n }\r\n\r\n switch (type) {\r\n case COMMAND_CONSTANTS.COMMAND: {\r\n const { GenerateCommandCoreGenerator } = await import('./generate-command.generator.js')\r\n const generator = new GenerateCommandCoreGenerator(this._fileService)\r\n return generator.generate(\r\n pascalName,\r\n lowerName,\r\n tokenPrefix,\r\n componentDir,\r\n hasZod,\r\n hasDrizzle,\r\n )\r\n }\r\n case COMMAND_CONSTANTS.QUERY: {\r\n const { GenerateQueryCoreGenerator } = await import('./generate-query.generator.js')\r\n const generatorQuery = new GenerateQueryCoreGenerator(this._fileService)\r\n return generatorQuery.generate(pascalName, lowerName, tokenPrefix, componentDir, hasZod)\r\n }\r\n default:\r\n throw new Error(`Unsupported generator type: '${String(type)}'. Use 'command' or 'query'.`)\r\n }\r\n }\r\n}\r\n","import path from 'node:path'\n\nimport type { IFileService } from '../../../../domain'\n\nexport class GenerateCommandVueGenerator {\n constructor(private readonly _fileService: IFileService) {}\n\n public async generate(\n pascalName: string,\n lowerName: string,\n tokenPrefix: string,\n componentDir: string,\n ): Promise<void> {\n const appDir = path.join(componentDir, 'application')\n const domainDir = path.join(componentDir, 'domain')\n const presDir = path.join(componentDir, 'presentation')\n\n // 1. Command (Application)\n const commandContent = `import { Command } from '@xeno-js/vue';\n\nexport class ${pascalName}Command extends Command {\n constructor() {\n super('${tokenPrefix}_COMMAND');\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(appDir, `${lowerName}.command.ts`),\n commandContent,\n )\n\n const handlerContent = `import type { ResultType } from '@xeno-js/vue';\nimport { AppError, BaseHandler, Result } from '@xeno-js/vue';\nimport type { ${pascalName}Command } from './${lowerName}.command';\nimport type { ${pascalName}Response } from '../entity/${lowerName}.model';\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n * \n * Please register your handler in the IoC container (e.g. src/bootstrap.ts) and add its token to MyRegistry.\n *\n * 1. In src/registry.ts:\n * ${tokenPrefix}_HANDLER: IHandler<${pascalName}Command, ${pascalName}Response>;\n * \n * 2. In src/bootstrap.ts:\n * .addServices((config, register) => {\n * register('${tokenPrefix}_HANDLER', new ${pascalName}Handler());\n * });\n */\nexport class ${pascalName}Handler extends BaseHandler<${pascalName}Command, ${pascalName}Response> {\n constructor(\n // TODO: Inject your remote DataSources or other services here\n ) {}\n\n protected async executeAsync(command: ${pascalName}Command, signal: AbortSignal): Promise<ResultType<${pascalName}Response>> {\n // TODO: Implement your frontend business logic or API calls here\n return Result.ok();\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(appDir, `${lowerName}.handler.ts`),\n handlerContent,\n )\n\n const composableContent = `import { ref } from 'vue';\nimport { AppError, Result, type ApiResponseDto, type ResultType } from '@xeno-js/vue';\nimport { ServicesUtils } from '@/use-app';\nimport { ${pascalName}Command } from '../application/${lowerName}.command';\nimport type { ${pascalName}Request, ${pascalName}Response } from '../domain/${lowerName}.model';\n\n/*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n *\n * Please register your handler in the IoC container (e.g. src/bootstrap.ts) and add its token to MyRegistry.\n *\n * 1. In src/registry.ts:\n * ${tokenPrefix}_HANDLER: IHandler<${pascalName}Command, ${pascalName}Response>;\n * \n * 2. In src/bootstrap.ts:\n * .addServices((config, register) => {\n * register('${tokenPrefix}_HANDLER', new ${pascalName}Handler());\n * });\n */\nexport function use${pascalName}() {\n const loading = ref(false);\n const error = ref<string | null>(null);\n let abortController: AbortController | null = null;\n\n const execute = async (payload: ${pascalName}Request): Promise<ResultType<${pascalName}Response>> => {\n abortController = new AbortController();\n \n if (loading.value) return Result.fail(AppError.create({\n name: '${pascalName}Command',\n message: '${pascalName}Command is already in progress',\n code: '${tokenPrefix}_COMMAND_ALREADY_IN_PROGRESS',\n status: 500,\n cause: new Error('${tokenPrefix}_COMMAND_ALREADY_IN_PROGRESS'),\n }));\n loading.value = true;\n error.value = null;\n\n try {\n // Resolve mediator and handler from the container\n const { mediator, ${tokenPrefix}_HANDLER: handler } = ServicesUtils.useApp();\n const command = new ${pascalName}Command();\n\n const result = await mediator.send(command, async () => {\n return await handler.handle(command, abortController?.signal);\n });\n\n if (!result.isOk()) {\n error.value = result.getErrorOrThrow().message;\n }\n\n return result;\n } finally {\n loading.value = false;\n }\n };\n\n const abort = () => {\n if (abortController) {\n abortController.abort();\n }\n };\n\n // Automatically cancel pending operations when the component unmounts\n onUnmounted(() => {\n abort();\n });\n\n return { loading, error, execute };\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(presDir, `use-${lowerName}.composable.ts`),\n composableContent,\n )\n\n // 3. Domain Model (Domain)\n const modelContent = `export interface ${pascalName}Request {\n // TODO: Define your request payload properties here\n}\n\nexport interface ${pascalName}Response {\n // TODO: Define your response properties here\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(domainDir, `${lowerName}.model.ts`),\n modelContent,\n )\n }\n}\n","import path from 'node:path'\n\nimport type { IFileService } from '../../../../domain'\n\nexport class GenerateQueryVueGenerator {\n constructor(private readonly _fileService: IFileService) {}\n\n public async generate(\n pascalName: string,\n lowerName: string,\n tokenPrefix: string,\n componentDir: string,\n ): Promise<void> {\n const appDir = path.join(componentDir, 'application')\n const domainDir = path.join(componentDir, 'domain')\n const presDir = path.join(componentDir, 'presentation')\n\n // 1. Query (Application)\n const queryContent = `import { Query } from '@xeno-js/vue';\nimport type { ${pascalName}Response } from './${lowerName}.model';\n\nexport class ${pascalName}Query extends Query<${pascalName}Response> {\n constructor() {\n super('${tokenPrefix}_QUERY', {\n ttl: 60,\n cacheKey: \\`${lowerName}.query\\`,\n bypassCache: false,\n consistentRead: false,\n isUserScoped: true\n });\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(appDir, `${lowerName}.query.ts`),\n queryContent,\n )\n\n const handlerContent = `import type { ResultType } from '@xeno-js/vue';\nimport { AppError, BaseHandler, Result } from '@xeno-js/vue';\nimport type { ${pascalName}Query } from './${lowerName}.query';\nimport type { ${pascalName}Response } from '../domain/${lowerName}.model';\n\n /*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n *\n * Please register your handler in the IoC container (e.g. src/bootstrap.ts) and add its token to MyRegistry.\n *\n * 1. In src/registry.ts:\n * ${tokenPrefix}_HANDLER: IHandler<${pascalName}Query, ${pascalName}Response>;\n * \n * 2. In src/bootstrap.ts:\n * .addServices((config, register) => {\n * register('${tokenPrefix}_HANDLER', new ${pascalName}Handler());\n * });\n */\nexport class ${pascalName}Handler extends BaseHandler<${pascalName}Query, ${pascalName}Response> {\n constructor(\n // TODO: Inject your remote DataSources or other services here\n ) {}\n\n protected async executeAsync(query: ${pascalName}Query, signal: AbortSignal): Promise<ResultType<${pascalName}Response>> {\n // TODO: Implement your frontend business logic or API calls here\n return Result.ok();\n }\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(appDir, `${lowerName}.handler.ts`),\n handlerContent,\n )\n\n // 2. Composable (Presentation)\n const composableContent = `import { ref } from 'vue';\nimport { AppError, Result, type ApiResponseDto, type ResultType } from '@xeno-js/vue';\nimport { ServicesUtils } from '@/use-app';\nimport { ${pascalName}Query } from '../application/${lowerName}.query';\nimport type { ${pascalName}Response } from '../domain/${lowerName}.model';\n\nexport function use${pascalName}() {\n const loading = ref(false);\n const error = ref<string | null>(null);\n const data = ref<${pascalName}Response | null>(null);\n let abortController: AbortController | null = null;\n\n /*\n * ⚠️ WARNING: ACTION REQUIRED ⚠️\n *\n * Please register your handler in the IoC container (e.g. src/bootstrap.ts) and add its token to MyRegistry.\n *\n * 1. In src/registry.ts:\n * ${tokenPrefix}_HANDLER: IHandler<${pascalName}Query, ${pascalName}Response>;\n * \n * 2. In src/bootstrap.ts:\n * .addServices((config, register) => {\n * register('${tokenPrefix}_HANDLER', new ${pascalName}Handler());\n * });\n */\nconst fetch = async (): Promise<ResultType<${pascalName}Response>> => {\n abortController = new AbortController();\n\n if (loading.value) return Result.fail(AppError.create({\n name: '${pascalName}Query',\n message: '${pascalName}Query is already in progress',\n code: '${tokenPrefix}_QUERY_ALREADY_IN_PROGRESS',\n status: 500,\n cause: new Error('${tokenPrefix}_QUERY_ALREADY_IN_PROGRESS'),\n }));\n loading.value = true;\n error.value = null;\n\n try {\n try {\n // Resolve mediator and handler from the container\n const { mediator, ${tokenPrefix}_HANDLER: handler } = ServicesUtils.useApp();\n const query = new ${pascalName}Query();\n\n const result = await mediator.query(query, async () => {\n return await handler.handle(query, abortController?.signal);\n });\n\n if (result.isOk()) {\n data.value = result.getValueOrThrow();\n } else {\n error.value = result.getErrorOrThrow().message;\n }\n\n return result;\n } finally {\n loading.value = false;\n }\n };\n\n const abort = () => {\n if (abortController) {\n abortController.abort();\n }\n };\n\n // Automatically cancel pending operations when the component unmounts\n onUnmounted(() => {\n abort();\n });\n\n return { loading, error, data, fetch };\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(presDir, `use-${lowerName}.composable.ts`),\n composableContent,\n )\n\n // 3. Domain Model (Domain)\n const modelContent = `export interface ${pascalName}Response {\n // TODO: Define your response properties here\n}\n`\n await this._fileService.writeFileRecursive(\n path.join(domainDir, `${lowerName}.model.ts`),\n modelContent,\n )\n }\n}\n","import path from 'node:path'\r\n\r\nimport type { IFileService } from '../../../../domain'\r\nimport { COMMAND_CONSTANTS, StringUtils } from '../../../../shared'\r\n\r\nexport class CqrsVueGenerator {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(\r\n targetDir: string,\r\n name: string,\r\n type: 'command' | 'query',\r\n outputPath?: string,\r\n ): Promise<void> {\r\n const pascalName = StringUtils.pascalCase(name)\r\n const tokenPrefix = StringUtils.splitCamelCaseWithUnderscore(pascalName).toUpperCase()\r\n const lowerName = name.toLowerCase()\r\n const destinationFolder = outputPath ?? lowerName\r\n const componentDir = path.join(targetDir, 'src', destinationFolder)\r\n\r\n switch (type) {\r\n case COMMAND_CONSTANTS.COMMAND: {\r\n const { GenerateCommandVueGenerator } = await import('./generate-command-vue.generator.js')\r\n const generator = new GenerateCommandVueGenerator(this._fileService)\r\n return generator.generate(pascalName, lowerName, tokenPrefix, componentDir)\r\n }\r\n case COMMAND_CONSTANTS.QUERY: {\r\n const { GenerateQueryVueGenerator } = await import('./generate-query-vue.generator.js')\r\n const generatorQuery = new GenerateQueryVueGenerator(this._fileService)\r\n return generatorQuery.generate(pascalName, lowerName, tokenPrefix, componentDir)\r\n }\r\n default:\r\n throw new Error(`Unsupported generator type: '${String(type)}'. Use 'command' or 'query'.`)\r\n }\r\n }\r\n}\r\n","import path from 'node:path'\n\nimport type { IFileService, IGenerator } from '../../../domain'\nimport type { VueOptions } from '../../../shared'\n\nexport class PackageJsonVueGenerator implements IGenerator<VueOptions> {\n constructor(private readonly _fileService: IFileService) {}\n\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\n const packageJson = {\n name: options.targetDir,\n version: '1.0.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'vue-tsc -b && vite build',\n preview: 'vite preview',\n } as Record<string, string>,\n dependencies: {\n '@xeno-js/vue': 'latest',\n 'vue': '^3.5.43',\n } as Record<string, string>,\n devDependencies: {\n '@types/node': '^20.0.0',\n '@vitejs/plugin-vue': '^5.1.0',\n 'typescript': '^5.8.0',\n 'vite': '^5.4.0',\n 'vue-tsc': '^3.3.11',\n } as Record<string, string>,\n }\n\n if (options.axios) packageJson.dependencies['axios'] = '^1.20.0'\n if (options.cockatiel) packageJson.dependencies['cockatiel'] = '^4.0.0'\n if (options.supabase) packageJson.dependencies['@supabase/supabase-js'] = '^2.117.1'\n if (options.sentry) packageJson.dependencies['@sentry/vue'] = '^10.75.2'\n if (options.pinia) packageJson.dependencies['pinia'] = '^2.2.0'\n if (options.router) packageJson.dependencies['vue-router'] = '^4.6.4'\n if (options.zod) packageJson.dependencies['zod'] = '^4.6.5'\n\n if (options.tailwind) {\n packageJson.devDependencies['tailwindcss'] = '^4.0.0'\n packageJson.devDependencies['@tailwindcss/vite'] = '^4.0.0'\n }\n\n const filePath = path.join(projectPath, 'package.json')\n await this._fileService.writeFileRecursive(filePath, JSON.stringify(packageJson, null, 2))\n }\n}\n","// src/infrastructure/generators/viteconfig.generator.ts\r\nimport path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class ViteconfigGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n const tailwindImport = options.tailwind ? `\\nimport tailwindcss from '@tailwindcss/vite';` : ''\r\n const tailwindPlugin = options.tailwind ? `\\n tailwindcss(),` : ''\r\n\r\n const content = `import { defineConfig } from 'vite';\r\nimport vue from '@vitejs/plugin-vue';${tailwindImport}\r\nimport path from 'node:path';\r\n\r\nexport default defineConfig({\r\n plugins: [\r\n vue(),${tailwindPlugin}\r\n ],\r\n resolve: {\r\n alias: {\r\n '@': path.resolve(__dirname, './src'),\r\n },\r\n },\r\n server: {\r\n port: 5173,\r\n }\r\n});\r\n`\r\n const filePath = path.join(projectPath, 'vite.config.ts')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","// src/infrastructure/generators/env-vue.generator.ts\r\nimport path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class EnvVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n let content = `# ─────────────────────────────────────────────────────────────────────────────\r\n# Xeno VUE APPLICATION ENVIRONMENT VARIABLES\r\n# ─────────────────────────────────────────────────────────────────────────────\r\nVITE_APP_ENV=development\r\n`\r\n\r\n if (options.axios) {\r\n content += `\\n# --- Axios ---\r\nVITE_API_BASE_URL=http://localhost:3000\r\n`\r\n }\r\n\r\n if (options.supabase) {\r\n content += `\\n# --- Authentication (Supabase) ---\r\nVITE_SUPABASE_URL=https://your-project.supabase.co\r\nVITE_SUPABASE_KEY=your-anon-key\r\n`\r\n }\r\n\r\n if (options.sentry) {\r\n content += `\\n# --- Error Tracking (Sentry) ---\r\nVITE_SENTRY_DSN=https://your-sentry-dsn@o0.ingest.sentry.io/0\r\n`\r\n }\r\n\r\n await this._fileService.writeFileRecursive(path.join(projectPath, '.env'), content)\r\n await this._fileService.writeFileRecursive(path.join(projectPath, '.env.example'), content)\r\n }\r\n}\r\n","// src/infrastructure/generators/tsconfig-vue.generator.ts\r\nimport path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class TsconfigVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, _options: VueOptions): Promise<void> {\r\n const tsconfig = {\r\n compilerOptions: {\r\n target: 'ES2022',\r\n useDefineForClassFields: true,\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n strict: true,\r\n jsx: 'preserve',\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n esModuleInterop: true,\r\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\r\n skipLibCheck: true,\r\n noEmit: true,\r\n types: ['vite/client'],\r\n paths: {\r\n '@/*': ['./src/*'],\r\n },\r\n },\r\n include: ['src/**/*.ts', 'src/**/*.d.ts', 'src/**/*.tsx', 'src/**/*.vue'],\r\n }\r\n\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'tsconfig.json'),\r\n JSON.stringify(tsconfig, null, 2),\r\n )\r\n }\r\n}\r\n","// src/infrastructure/generators/vue-readme.generator.ts\nimport path from 'node:path'\n\nimport { type IFileService, type IGenerator } from '../../../domain'\nimport type { VueOptions } from '../../../shared'\n\nexport class ReadmeVueGenerator implements IGenerator<VueOptions> {\n constructor(private readonly _fileService: IFileService) {}\n\n public async generate(projectPath: string, _options: VueOptions): Promise<void> {\n const content = `\n<div align=\"center\">\n <img src=\"logo/logo.png\" alt=\"Xeno Vue Logo\" width=\"140\" />\n\n <h1>Xeno Vue</h1>\n\n <p><strong>Your UI framework handles the UI. Xeno handles the application.</strong></p>\n\n <p>\n Application architecture for Vue with explicit dependency injection,\n CQRS, composable pipelines, and clear boundaries between presentation,\n application behavior, and infrastructure.\n </p>\n\n <p>\n <a href=\"https://www.npmjs.com/package/@xeno-js/vue\">\n <img src=\"https://img.shields.io/npm/v/@xeno-js/vue?style=flat-square\" alt=\"npm version\" />\n </a>\n <a href=\"https://github.com/xeno-js/xeno-fe\">\n <img src=\"https://img.shields.io/github/stars/xeno-js/xeno-fe?style=flat-square\" alt=\"GitHub stars\" />\n </a>\n <a href=\"https://img.shields.io/npm/l/@xeno-js/vue?style=flat-square\">\n <img src=\"https://img.shields.io/npm/l/@xeno-js/vue?style=flat-square\" alt=\"License: MIT\" />\n </a>\n </p>\n</div>\n\n---\n\n## What is Xeno Vue?\n\n**Xeno Vue** (\\`@xeno-js / vue\\`) brings Xeno's application architecture to Vue applications.\n\nIt provides the composition root and application building blocks needed to keep\napplication behavior explicit instead of putting all of it inside Vue\ncomponents.\n\nThe package is built around:\n\n* explicit dependency injection;\n* a typed application registry;\n* commands and queries through a client-side mediator;\n* composable application pipelines;\n* remote data source boundaries;\n* browser request and identity context;\n* optional authentication, logging, validation, and caching integrations.\n\nThe goal is simple:\n\n> **Keep Vue responsible for presentation. Keep application behavior explicit.**\n\n---\n\n## The boundary\n\nA Vue application does not need to put every concern into components, stores, or router handlers.\n\nXeno gives the application layer a distinct place to live:\n\n\\`\\`\\`text\nVue UI\n ↓\n Application\n ↓\n Domain / Shared\n ↓\n Infrastructure\n ↓\n HTTP / external systems\n \\`\\`\\`\n\nVue remains your presentation layer.\n\nXeno provides the application composition and execution model around it.\n\n---\n\n## Why Xeno Vue?\n\nAs an application grows, API calls, validation, logging, caching, authentication,\nand application decisions can end up spread across components.\n\nXeno makes those responsibilities explicit.\n\n### Explicit dependency injection\n\n\\`XenoAppBuilder\\` is the composition root.\n\nDependencies are registered in code instead of being discovered through decorators,\nruntime scanning, or hidden framework conventions.\n\n\\`\\`\\`ts\n import { XenoAppBuilder } from '@xeno-js/vue'\n\n const builder = XenoAppBuilder.create()\n \\`\\`\\`\n\nYou configure the services your application needs through the builder.\n\n---\n\n### CQRS in the browser\n\nThe client mediator exposes two execution paths:\n\n\\`\\`\\`text\n Command\n ↓\nCommand pipeline\n ↓\nApplication action\n\n Query\n ↓\nQuery pipeline\n ↓\nApplication action\n \\`\\`\\`\n\nCommands are sent with:\n\n\\`\\`\\`ts\n await services.mediator.send(command, action)\n \\`\\`\\`\n\nQueries are executed with:\n\n\\`\\`\\`ts\n await services.mediator.query(query, action)\n \\`\\`\\`\n\nThe application action is supplied by your code, so the transport remains behind\nan infrastructure boundary.\n\n---\n\n## Pipelines\n\nCross-cutting behavior belongs in the application execution pipeline.\n\nThe current implementation provides pipeline building blocks for:\n\n* exception handling;\n* logging;\n* performance thresholds;\n* validation with Zod schemas;\n* query caching.\n\nPipelines are composed by the application module and executed around commands\nand queries.\n\nFor example:\n\n\\`\\`\\`ts\n builder.addPipeline((config) => {\n config.queryCaching = true\n config.threshold = 500\n })\n \\`\\`\\`\n\nQuery caching uses the configured cache and is intended for query requests.\n\n---\n\n## Remote data sources\n\nHTTP concerns can be isolated behind a remote data source.\n\n\\`\\`\\`ts\n import { RemoteDataSource } from '@xeno-js/vue'\n\n export class UsersRemoteDataSource extends RemoteDataSource {\n public getById(id: string) {\n return this.get<User>(\\`/users/\\${id}\\`)\n }\n\n public create(payload: CreateUserPayload) {\n return this.post<User, CreateUserPayload>('/users', payload)\n }\n }\n \\`\\`\\`\n\nThe data source depends on the framework-neutral HTTP client abstraction.\n\n\\`XenoAppBuilder.addHttpCore()\\` then provides the concrete HTTP client and registers\nthe resulting data source in the application registry.\n\n\\`\\`\\`ts\n type AppRegistry = XenoVueRegistry<{\n users: UsersRemoteDataSource\n }>\n\n const builder = XenoAppBuilder.create<AppRegistry>()\n .addHttpCore('users', (config) => {\n config.client.baseURL = '/api'\n config.factory = (http) => new UsersRemoteDataSource(http)\n })\n \\`\\`\\`\n\nAxios is used by the built-in HTTP adapter when \\`addHttpCore()\\` is configured.\n\n---\n\n## Application context\n\nBrowser applications still need contextual information around the current\nexecution.\n\nXeno provides a browser context accessor containing information such as:\n\n* request ID;\n* correlation ID;\n* user identity;\n* user agent;\n* path;\n* origin;\n* transport metadata.\n\nYou can use the default accessor or provide your own implementation.\n\n\\`\\`\\`ts\n builder.addContext((config) => {\n // Optional custom context accessor configuration.\n })\n \\`\\`\\`\n\n---\n\n## Logging\n\nLogging is configured independently from the application code.\n\nThe package currently supports:\n\n* console logging;\n* Sentry logging;\n* custom logger clients.\n\nExample:\n\n\\`\\`\\`ts\n builder.addLogger((config) => {\n config.console = true\n })\n \\`\\`\\`\n\nOptional integrations are loaded when they are configured, keeping them outside\nthe default bootstrap path.\n\n---\n\n## Authentication\n\nSupabase authentication is available as an infrastructure integration.\n\n\\`\\`\\`ts\n builder.addAuth((config, env) => {\n config.url = env.getOrThrow('SUPABASE_URL')\n config.key = env.getOrThrow('SUPABASE_KEY')\n })\n \\`\\`\\`\n\nThe default configuration service resolves \\`VITE_\\` environment variables in\nVite applications.\n\nFor example:\n\n\\`\\`\\`text\n VITE_SUPABASE_URL\n VITE_SUPABASE_KEY\n \\`\\`\\`\n\nAuthentication is an integration, not part of the application's business rules.\n\n---\n\n## Validation\n\nApplication request validation can be configured with Zod schemas.\n\n\\`\\`\\`ts\n builder.addPipeline((config) => {\n config.schemas = {\n CreateUser: createUserSchema,\n UpdateUser: updateUserSchema,\n }\n })\n \\`\\`\\`\n\nValidation is executed as part of the application pipeline.\n\nZod remains optional until validation schemas are actually configured.\n\n---\n\n## Query caching\n\nThe package includes an in-memory cache path for query requests.\n\nEnable it through the pipeline configuration:\n\n\\`\\`\\`ts\n builder.addPipeline((config) => {\n config.queryCaching = true\n })\n \\`\\`\\`\n\nCache keys can be contextual or user-scoped through the shared cache key builder.\n\n---\n\n## Bootstrap\n\nA complete browser composition root can look like this:\n\n\\`\\`\\`ts\n import { XenoAppBuilder } from '@xeno-js/vue'\n\n const builder = XenoAppBuilder.create()\n .addContext(() => { })\n .addLogger((config) => {\n config.console = true\n })\n .addAuth((config, env) => {\n config.url = env.getOrThrow('SUPABASE_URL')\n config.key = env.getOrThrow('SUPABASE_KEY')\n })\n .addPipeline((config) => {\n config.queryCaching = true\n config.threshold = 500\n })\n\n export async function bootstrap() {\n return builder.build()\n }\n \\`\\`\\`\n\nThe builder executes the registered tasks and returns a frozen application\nregistry.\n\nThe composition root is application code: there is no requirement to hide it\nbehind Vue plugins or decorators.\n\n---\n\n## Providing services to Vue\n\nThe package exports \\`XENO_SERVICES_KEY\\` so the application registry can be made\navailable through Vue's \\`provide / inject\\` mechanism.\n\n\\`\\`\\`ts\n import { createApp } from 'vue'\n import { XENO_SERVICES_KEY } from '@xeno-js/vue'\n\n import App from './App.vue'\n import { bootstrap } from './bootstrap'\n\n async function mountApp() {\n const app = createApp(App)\n const services = await bootstrap()\n\n app.provide(XENO_SERVICES_KEY, services)\n app.mount('#app')\n }\n\n mountApp()\n \\`\\`\\`\n\nFrom there, your application code can resolve the registry through Vue's normal\ndependency injection mechanism.\n\nThe package does not require a custom state-management abstraction.\n\n---\n\n## Keeping application logic outside components\n\nA component can remain focused on presentation while application behavior lives\nin a composable or application service written by your project.\n\nFor example:\n\n\\`\\`\\`ts\n import { inject } from 'vue'\n import { XENO_SERVICES_KEY } from '@xeno-js/vue'\n\n export function useUsersApplication() {\n const services = inject(XENO_SERVICES_KEY)\n\n if (!services) {\n throw new Error('Xeno services are not available')\n }\n\n return services\n }\n \\`\\`\\`\n\nThe composable belongs to your application.\n\nXeno provides the application infrastructure it uses.\n\n---\n\n## Public API\n\nThe package root currently exposes:\n\n\\`\\`\\`text\n XenoAppBuilder\n RemoteDataSource\n XENO_SERVICES_KEY\n \\`\\`\\`\n\nIt also re-exports the public contracts and primitives from \\`@xeno-js / shared\\`.\n\nThe concrete internal pipeline implementations are assembled by the builder and\nare not intended to be the primary public API of the package.\n\n---\n\n## Installation\n\nInstall Vue, Shared, and Xeno Vue:\n\n\\`\\`\\`bash\nnpm install @xeno-js / vue @xeno-js / shared vue\n \\`\\`\\`\n\nInstall the integrations you actually use.\n\nFor HTTP data sources:\n\n\\`\\`\\`bash\nnpm install axios\n \\`\\`\\`\n\nFor validation:\n\n\\`\\`\\`bash\nnpm install zod\n \\`\\`\\`\n\nFor Supabase authentication:\n\n\\`\\`\\`bash\nnpm install @supabase/supabase-js\n \\`\\`\\`\n\nFor Sentry:\n\n\\`\\`\\`bash\nnpm install @sentry/vue\n \\`\\`\\`\n\nFor Vue Router integration:\n\n\\`\\`\\`bash\nnpm install vue - router\n \\`\\`\\`\n\n---\n\n## CLI\n\nThe Xeno ecosystem includes an official CLI for creating Vue application\nstructures:\n\n\\`\\`\\`bash\nnpx @xeno-js / cli new my - app--vue\n \\`\\`\\`\n\nYou can also generate application components inside an existing project:\n\n\\`\\`\\`bash\nnpx @xeno-js / cli g command CreateUser--vue\n \\`\\`\\`\n\nCLI:\n\nhttps://github.com/xeno-js/xeno-cli\n\n---\n\n## Xeno ecosystem\n\n\\`\\`\\`text\n @xeno-js / shared\n Define the application.\n\n@xeno-js / core\n Execute the backend application.\n\n@xeno-js / vue\n Bring the application architecture to Vue.\n\n@xeno-js / cli\n Get started with the structure.\n\\`\\`\\`\n\nA useful mental model is:\n\n\\`\\`\\`text\n Transport\n hosts the application\n\n Application\n executes use cases\n\n Domain\n defines business rules\n\n Infrastructure\n connects external systems\n \\`\\`\\`\n\n---\n\n## Keep your stack\n\nXeno Vue does not replace Vue.\n\nIt does not replace your router.\n\nIt does not replace your state management solution.\n\nIt provides a place for application behavior and infrastructure composition to\nlive alongside the tools you already use.\n\n---\n\n## Browser environment\n\nThe default configuration service is designed for Vite/browser applications.\n\nThe package provides browser-oriented request context data and integrates with\nVue's dependency injection system.\n\nNode.js \\`20 + \\` is required by the package tooling.\n\n---\n\n## Development\n\nClone the repository:\n\n\\`\\`\\`bash\ngit clone https://github.com/xeno-js/xeno-fe.git\ncd xeno - fe\nnpm install\n \\`\\`\\`\n\nRun the checks:\n\n\\`\\`\\`bash\nnpm run check\n \\`\\`\\`\n\nUseful commands:\n\n\\`\\`\\`bash\nnpm run build\nnpm run typecheck\nnpm run lint\nnpm run test\nnpm run test: coverage\nnpm run format\n \\`\\`\\`\n\nDevelopment happens from feature branches targeting \\`develop\\`.\n\n---\n\n## Contributing\n\nContributions are welcome.\n\nCreate a feature branch from \\`develop\\`:\n\n\\`\\`\\`bash\ngit checkout develop\ngit pull origin develop\ngit checkout - b feat / your - feature\n \\`\\`\\`\n\nRun the project checks before opening a pull request:\n\n\\`\\`\\`bash\nnpm run check\n \\`\\`\\`\n\nWe use Conventional Commits:\n\n\\`\\`\\`text\n feat(vue): add application service\n fix(datasource): correct request handling\n refactor(builder): simplify bootstrap\n docs(readme): clarify architecture\n \\`\\`\\`\n\nOpen pull requests against:\n\n\\`\\`\\`text\n develop\n \\`\\`\\`\n\n---\n\n## License\n\nMIT License. See \\`LICENSE\\`.\n`\n await this._fileService.writeFileRecursive(path.join(projectPath, 'README.md'), content)\n }\n}\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../domain'\r\nimport type { CoreOptions, ScaffoldingOptions } from '../../shared'\r\nimport { CORE_CONSTANTS } from '../../shared'\r\n\r\nexport class GitIgnoreGenerator implements IGenerator<ScaffoldingOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: ScaffoldingOptions): Promise<void> {\r\n let content = `# Dependencies\r\nnode_modules/\r\n\r\n# Build artifacts\r\ndist/\r\nout/\r\nbuild/\r\n\r\n# Environment variables\r\n# We ignore actual .env files for security, but keep .env.example for documentation\r\n.env\r\n.env.local\r\n.env.*\r\n!.env.example\r\n\r\n# Logs\r\n*.log\r\nlogs/\r\nnpm-debug.log*\r\n\r\n# Test coverage\r\ncoverage/\r\n.nyc_output/\r\n\r\n# OS and IDE\r\n.DS_Store\r\nThumbs.db\r\n.vscode/\r\n.idea/\r\n`\r\n\r\n if ((options as CoreOptions).database === CORE_CONSTANTS.SQL_LITE) {\r\n content += `\\n# SQLite Database\r\n*.sqlite\r\n*.sqlite3\r\n*.sqlite-journal\r\n`\r\n }\r\n\r\n // Ignora la cartella di compilazione locale di Vercel se l'ambiente lo richiede\r\n if ((options as CoreOptions).targetEnv === CORE_CONSTANTS.VERCEL) {\r\n content += `\\n# Vercel\r\n.vercel/\r\n`\r\n }\r\n\r\n const filePath = path.join(projectPath, '.gitignore')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class AppVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n // 2. src/App.vue\r\n const appVue = `<script setup lang=\"ts\">\r\n</script>\r\n\r\n<template>\r\n <div id=\"xeno-app\">\r\n ${options.router ? '<router-view />' : '<h1>Welcome to Xeno Vue App</h1>'}\r\n </div>\r\n</template>`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'src', 'App.vue'), appVue)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class BootstrapGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n // 4. src/bootstrap.ts\r\n let builderNodes = ` const builder = XenoAppBuilder.create<MyRegistry>()\\n .addContext(() => {})`\r\n\r\n if (options.supabase) {\r\n builderNodes += `\\n .addAuth((opts, config) => {\r\n opts.url = config.getOrThrow('VITE_SUPABASE_URL');\r\n opts.key = config.getOrThrow('VITE_SUPABASE_KEY');\r\n })`\r\n }\r\n\r\n if (options.sentry) {\r\n builderNodes += `\\n .addLogger((opts, config) => {\r\n const env = config.get('APP_ENV') ?? 'development'\r\n const isDev = env.toLowerCase() === 'development'\r\n opts.console = isDev\r\n if (!isDev) {\r\n opts.sentry = {\r\n dsn: config.getOrThrow('VITE_SENTRY_DSN'),\r\n env,\r\n app,\r\n router,\r\n tracesSampleRate: 0.2,\r\n level: LOG_LEVEL.WARN,\r\n };\r\n }\r\n })`\r\n } else {\r\n builderNodes += `\\n .addLogger((opts, config) => {\r\n opts.console = config.get('VITE_APP_ENV') === 'development';\r\n })`\r\n }\r\n\r\n builderNodes += `\\n .addServices((config, register) => {\r\n // Register custom stores, API clients, and CQRS services here\r\n })`\r\n\r\n const bootstrapTs = `import { XenoAppBuilder, LOG_LEVEL } from '@xeno-js/vue';\r\nimport type { MyRegistry } from './registry';\r\n\r\nexport async function bootstrap(app: any, router: any) {\r\n${builderNodes}\r\n\r\n return await builder.build();\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'bootstrap.ts'),\r\n bootstrapTs,\r\n )\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class IndexVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n const indexHtml = `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${options.targetDir}</title>\r\n </head>\r\n <body>\r\n <div id=\"app\"></div>\r\n <script type=\"module\" src=\"/src/main.ts\"></script>\r\n </body>\r\n</html>`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'index.html'), indexHtml)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class MainGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n // 5. src/main.ts\r\n const routerImport = options.router ? `\\nimport router from './router';` : ''\r\n const piniaImport = options.pinia ? `\\nimport { createPinia } from 'pinia';` : ''\r\n const tailwindImport = options.tailwind ? `\\nimport './assets/style.css';` : ''\r\n\r\n const mainTs = `import { createApp } from 'vue';\r\nimport App from './App.vue';\r\nimport { bootstrap } from './bootstrap';\r\nimport { XENO_SERVICES_KEY } from '@xeno-js/vue';${routerImport}${piniaImport}${tailwindImport}\r\n\r\nasync function mountApp() {\r\n try {\r\n const app = createApp(App);\r\n ${options.pinia ? '\\n app.use(createPinia());' : ''}\r\n const container = await bootstrap(app, router);\r\n ${options.router ? '\\n app.use(router);' : ''}\r\n \r\n\r\n // Provide the Xeno IoC container globally to all components\r\n app.provide(XENO_SERVICES_KEY, container);\r\n\r\n app.mount('#app');\r\n } catch (error) {\r\n console.error('Critical error during frontend bootstrap:', error);\r\n }\r\n}\r\n\r\nmountApp();\r\n`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'src', 'main.ts'), mainTs)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class RegistryGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, _options: VueOptions): Promise<void> {\r\n const registryTs = `import type { XenoVueRegistry } from '@xeno-js/vue';\r\n\r\n/**\r\n * @file registry.ts\r\n * @description Centralized Type Contract for Dependency Injection in Vue.\r\n */\r\nexport interface MyRegistry extends XenoVueRegistry {\r\n // Add your frontend injection tokens here\r\n // e.g., USER_DATA_SOURCE: IUserDataSource;\r\n}\r\n`\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'registry.ts'),\r\n registryTs,\r\n )\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class RouterGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n // 6. Optional router and assets\r\n if (options.router) {\r\n const routerTs = `import { createRouter, createWebHistory } from 'vue-router';\r\n\r\nexport default createRouter({\r\n history: createWebHistory(),\r\n routes: [\r\n {\r\n path: '/',\r\n name: 'Home',\r\n component: () => import('../views/HomeView.vue')\r\n }\r\n ]\r\n});`\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'router', 'index.ts'),\r\n routerTs,\r\n )\r\n\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'views', 'HomeView.vue'),\r\n `<template>\\n <h1>Home View</h1>\\n</template>`,\r\n )\r\n }\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class TailwindGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: VueOptions): Promise<void> {\r\n if (options.tailwind) {\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'assets', 'style.css'),\r\n `@import \"tailwindcss\";\\n`,\r\n )\r\n }\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport type { VueOptions } from '../../../shared'\r\n\r\nexport class UseAppVueGenerator implements IGenerator<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, _options: VueOptions): Promise<void> {\r\n const content = `import type { Nullable } from \"@xeno-js/vue\";\r\nimport { Guards, XENO_SERVICES_KEY } from \"@xeno-js/vue\";\r\nimport { inject } from \"vue\";\r\nimport type { MyRegistry } from \"./registry\";\r\n\r\nlet globalServices: Nullable<MyRegistry> = null;\r\n\r\nexport const ServicesUtils = Object.freeze({\r\n // Metodo per registrare i servizi al bootstrap\r\n setGlobalServices(services: MyRegistry) {\r\n globalServices = services;\r\n },\r\n useApp(): MyRegistry {\r\n if (Guards.isDefined(globalServices))\r\n return globalServices;\r\n\r\n const services = inject<MyRegistry>(XENO_SERVICES_KEY);\r\n if (!services)\r\n throw new Error(\r\n '[Xeno Error]: XenoServices not found. Did you provide them using app.provide(XENO_SERVICES_KEY, services)?',\r\n );\r\n\r\n return services;\r\n }\r\n} as const);\r\n`\r\n await this._fileService.writeFileRecursive(path.join(projectPath, 'src', 'use-app.ts'), content)\r\n }\r\n}\r\n","import prompts from 'prompts'\r\n\r\nimport type { IFileService, IGenerator, IScaffoldStrategy } from '../../domain'\r\nimport type { VueOptions } from '../../shared'\r\n\r\nexport class VueScaffoldStrategy implements IScaffoldStrategy<VueOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async promptOptions(targetDir: string): Promise<VueOptions> {\r\n const response = await prompts([\r\n { type: 'confirm', name: 'axios', message: 'Install Axios?', initial: true },\r\n {\r\n type: 'confirm',\r\n name: 'cockatiel',\r\n message: 'Install Cockatiel (Resilience)?',\r\n initial: true,\r\n },\r\n { type: 'confirm', name: 'supabase', message: 'Install Supabase Auth?', initial: true },\r\n { type: 'confirm', name: 'sentry', message: 'Install Sentry Logger?', initial: true },\r\n {\r\n type: 'confirm',\r\n name: 'pinia',\r\n message: 'Install Pinia (State Management)?',\r\n initial: true,\r\n },\r\n { type: 'confirm', name: 'router', message: 'Install vue-router?', initial: true },\r\n { type: 'confirm', name: 'tailwind', message: 'Install Tailwind CSS?', initial: true },\r\n { type: 'confirm', name: 'zod', message: 'Install Zod Validator?', initial: true },\r\n {\r\n type: 'confirm',\r\n name: 'gitInit',\r\n message: 'Initialize a new Git repository?',\r\n initial: true,\r\n },\r\n ])\r\n\r\n return {\r\n targetDir,\r\n projectType: 'vue',\r\n ...response,\r\n }\r\n }\r\n\r\n public async getGenerators(_options: VueOptions): Promise<IGenerator<VueOptions>[]> {\r\n const generators: IGenerator<VueOptions>[] = []\r\n\r\n const { PackageJsonVueGenerator } = await import('../generators/vue/packagejson.generator.js')\r\n const { ViteconfigGenerator } = await import('../generators/vue/vite-config.generator.js')\r\n const { EnvVueGenerator } = await import('../generators/vue/env.generator.js')\r\n const { TsconfigVueGenerator } = await import('../generators/vue/tsconfig.generator.js')\r\n const { ReadmeVueGenerator } = await import('../generators/vue/readme.generator.js')\r\n const { GitIgnoreGenerator } = await import('../generators/gitignore.generator.js')\r\n const { AppVueGenerator } = await import('../generators/vue/app-vue.generator.js')\r\n const { BootstrapGenerator } = await import('../generators/vue/bootstrap-ts.generator.js')\r\n const { IndexVueGenerator } = await import('../generators/vue/index-html.generator.js')\r\n const { MainGenerator } = await import('../generators/vue/main.generator.js')\r\n const { RegistryGenerator } = await import('../generators/vue/registry-ts.generator.js')\r\n const { RouterGenerator } = await import('../generators/vue/router.generator.js')\r\n const { TailwindGenerator } = await import('../generators/vue/tailwind.generator.js')\r\n const { UseAppVueGenerator } = await import('../generators/vue/use-app.generator.js')\r\n\r\n generators.push(new PackageJsonVueGenerator(this._fileService))\r\n generators.push(new ViteconfigGenerator(this._fileService))\r\n generators.push(new EnvVueGenerator(this._fileService))\r\n generators.push(new TsconfigVueGenerator(this._fileService))\r\n generators.push(new AppVueGenerator(this._fileService))\r\n generators.push(new BootstrapGenerator(this._fileService))\r\n generators.push(new IndexVueGenerator(this._fileService))\r\n generators.push(new MainGenerator(this._fileService))\r\n generators.push(new RegistryGenerator(this._fileService))\r\n generators.push(new RouterGenerator(this._fileService))\r\n generators.push(new TailwindGenerator(this._fileService))\r\n generators.push(new ReadmeVueGenerator(this._fileService))\r\n generators.push(new GitIgnoreGenerator(this._fileService))\r\n generators.push(new UseAppVueGenerator(this._fileService))\r\n\r\n return generators\r\n }\r\n}\r\n","import path from 'node:path'\n\nimport type { IFileService, IGenerator } from '../../../domain'\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\n\nexport class PackageJsonCoreGenerator implements IGenerator<CoreOptions> {\n constructor(private readonly _fileService: IFileService) {}\n\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\n const packageJson = {\n name: options.targetDir,\n version: '1.0.0',\n private: true,\n main: './dist/index.js',\n module: './dist/index.js',\n types: './dist/index.d.ts',\n scripts: {\n start: 'tsx src/main.ts',\n build: 'tsc --project tsconfig.json',\n } as Record<string, string>,\n dependencies: {\n '@xeno-js/core': 'latest',\n 'dotenv': '^16.4.5',\n } as Record<string, string>,\n devDependencies: {\n '@types/node': '^20.0.0',\n 'tsx': '^4.7.0',\n 'typescript': '^5.8.0',\n } as Record<string, string>,\n }\n\n // Database & ORM\n if (options.database !== CORE_CONSTANTS.NONE) {\n packageJson.dependencies['drizzle-orm'] = '^0.45.3'\n packageJson.dependencies['pg'] = '^8.23.0'\n packageJson.dependencies['postgres'] = '^3.4.9'\n packageJson.devDependencies['@types/pg'] = '^8.23.1'\n packageJson.devDependencies['drizzle-kit'] = '^0.31.11'\n packageJson.scripts['db:migrate'] = 'drizzle-kit migrate'\n packageJson.dependencies['drizzle-orm'] = '^0.45.3'\n packageJson.devDependencies['drizzle-kit'] = '^0.31.11'\n packageJson.dependencies['@libsql/client'] = '^0.14.0'\n packageJson.scripts['db:generate'] = 'drizzle-kit generate'\n packageJson.scripts['db:push'] = 'drizzle-kit push'\n }\n\n // HTTP / External Calls\n if (options.axios) packageJson.dependencies['axios'] = '^1.20.0'\n if (options.cockatiel) packageJson.dependencies['cockatiel'] = '^4.0.0'\n\n // Logging & Observability\n if (options.pino) {\n packageJson.dependencies['pino'] = '^10.3.1'\n packageJson.devDependencies['pino-pretty'] = '^11.2.2'\n }\n if (options.sentry) packageJson.dependencies['@sentry/node'] = '^11.0.0'\n\n // Services\n if (options.redis) packageJson.dependencies['ioredis'] = '^6.0.0'\n if (options.supabase) {\n packageJson.dependencies['@supabase/supabase-js'] = '^2.117.1'\n packageJson.dependencies['@supabase/ssr'] = '^0.12.7'\n }\n if (options.zod) packageJson.dependencies['zod'] = '^4.6.5'\n\n const filePath = path.join(projectPath, 'package.json')\n await this._fileService.writeFileRecursive(filePath, JSON.stringify(packageJson, null, 2))\n }\n}\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\r\n\r\nexport class BootstrapGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n // Costruisce in modo flessibile i nodi di configurazione\r\n let builderNodes = `\r\n const builder = new AppBuilder<MyRegistry>()\r\n .addContext()\r\n .addMiddlewares((opts) => {\r\n // Add your options here\r\n })\r\n .addPipeline((opts) => {\r\n // Add your options here\r\n })`\r\n\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n builderNodes += `\r\n .addDb((opts, config) => {\r\n opts.enableSqlLite = false\r\n opts.connectionString = config.getOrThrow('DATABASE_URL');\r\n })`\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n builderNodes += `\r\n .addDb((opts, config) => {\r\n opts.enableSqlLite = true;\r\n opts.connectionString = config.getOrThrow('SQLITE_DATABASE_URL');\r\n })`\r\n }\r\n }\r\n\r\n if (options.redis) {\r\n builderNodes += `\r\n .addCache((opts, config) => {\r\n const isDev = config.get('NODE_ENV') === 'development';\r\n opts.inMemory = isDev;\r\n opts.redis = !isDev ? {\r\n host: config.getOrThrow('REDIS_HOST'),\r\n port: config.getNumber('REDIS_PORT') ?? 6379,\r\n username: config.get('REDIS_USERNAME') ?? '',\r\n password: config.get('REDIS_PASSWORD') ?? '',\r\n tls: config.getBoolean('REDIS_TLS') ?? false,\r\n maxRetriesPerRequest: 3\r\n } : undefined\r\n })`\r\n } else {\r\n // Default in-memory cache if no redis selected but CQRS pipeline exists\r\n builderNodes += `\r\n .addCache((opts) => {\r\n opts.inMemory = true;\r\n })`\r\n }\r\n\r\n if (options.supabase) {\r\n builderNodes += `\r\n .addAuth((opts, config) => {\r\n opts.url = config.getOrThrow('SUPABASE_URL');\r\n opts.key = config.getOrThrow('SUPABASE_KEY');\r\n })`\r\n }\r\n\r\n if (options.pino || options.sentry) {\r\n const pinoConfig = options.pino\r\n ? `opts.pino.config = !isDev ? { env: config.getOrThrow('NODE_ENV'), destination: 'stdout', prettyPrint: false } : undefined;`\r\n : ''\r\n const sentryConfig = options.sentry\r\n ? `opts.sentry.config = !isDev ? { dsn: config.getOrThrow('SENTRY_DSN'), environment: config.getOrThrow('NODE_ENV') } : undefined;`\r\n : ''\r\n\r\n builderNodes += `\r\n .addLogger((opts, config) => {\r\n const isDev = config.get('NODE_ENV') === 'development';\r\n opts.level = LOG_LEVEL.INFO;\r\n opts.console = isDev;\r\n ${pinoConfig}\r\n ${sentryConfig}\r\n })`\r\n }\r\n\r\n builderNodes += `\r\n .addServices((opts, config) => {\r\n // Register custom repositories and handlers here\r\n });`\r\n\r\n const content = `import type { IServiceContainer } from '@xeno-js/core';\r\nimport { AppBuilder, LOG_LEVEL, Nullable, TOKENS } from '@xeno-js/core';\r\nimport type { MyRegistry } from './registry';\r\n\r\nlet containerPromise: Nullable<Promise<IServiceContainer<MyRegistry>>> = null;\r\n\r\nexport async function bootstrap() {\r\n if (!containerPromise) {\r\n containerPromise = (async () => {\r\n const builder = getContainer();\r\n return await builder.build();\r\n })().catch((err) => {\r\n containerPromise = null;\r\n throw err;\r\n });\r\n }\r\n return containerPromise;\r\n}\r\n\r\nfunction getContainer() {\r\n${builderNodes}\r\n return builder;\r\n}\r\n`\r\n\r\n const filePath = path.join(projectPath, 'src', 'bootstrap.ts')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport { type IFileService, type IGenerator } from '../../../domain'\r\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\r\n\r\nexport class EnvGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n let content = `# ─────────────────────────────────────────────────────────────────────────────\r\n# Xeno APPLICATION ENVIRONMENT VARIABLES\r\n# ─────────────────────────────────────────────────────────────────────────────\r\nNODE_ENV=development\r\n`\r\n\r\n // Configurazione Database\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n content += `\\n# --- Database (PostgreSQL) ---\r\n DATABASE_URL=postgres://postgres:password@localhost:5432/xeno_db\r\n `\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n content += `\\n# --- Database (SQLite) ---\r\n SQLITE_DATABASE_URL=file:./dev.sqlite\r\n `\r\n }\r\n }\r\n\r\n if (options.axios) {\r\n content += `\\n# --- Axios ---\r\nBASE_URL=\r\n`\r\n }\r\n\r\n // Configurazione Redis (Caching, Idempotenza, Concorrenza)\r\n if (options.redis) {\r\n content += `\\n# --- Cache (Redis) ---\r\nREDIS_HOST=localhost\r\nREDIS_PORT=6379\r\nREDIS_PASSWORD=\r\nREDIS_USERNAME=\r\nREDIS_TLS=false\r\n`\r\n }\r\n\r\n // Configurazione Supabase (Autenticazione)\r\n if (options.supabase) {\r\n content += `\\n# --- Authentication (Supabase) ---\r\nSUPABASE_URL=https://your-project.supabase.co\r\nSUPABASE_KEY=your-anon-key\r\n`\r\n }\r\n\r\n // Configurazione Logging & Observability\r\n if (options.sentry) {\r\n content += `\\n# --- Error Tracking (Sentry) ---\r\nSENTRY_DSN=https://your-sentry-dsn@o0.ingest.sentry.io/0\r\nSENTRY_ENVIRONMENT=development\r\n`\r\n }\r\n\r\n // Creiamo sia il file effettivo che il file di esempio\r\n const envPath = path.join(projectPath, '.env')\r\n const envExamplePath = path.join(projectPath, '.env.example')\r\n\r\n await this._fileService.writeFileRecursive(envPath, content)\r\n await this._fileService.writeFileRecursive(envExamplePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\n\nimport type { IFileService, IGenerator } from '../../../domain'\nimport { type CoreOptions } from '../../../shared'\n\nexport class ReadmeGenerator implements IGenerator<CoreOptions> {\n constructor(private readonly _fileService: IFileService) {}\n\n public async generate(projectPath: string, _options: CoreOptions): Promise<void> {\n const content = `\n<div align=\"center\">\n <img src=\"logo/logo.png\" alt=\"Xeno Logo\" width=\"140\" />\n\n <h1>Xeno.JS</h1>\n <p><strong>The application architecture framework for TypeScript.</strong></p>\n <p>Build long-lived applications with explicit dependency injection, DDD, CQRS, and transport-independent business logic.</p>\n\n <p>\n <a href=\"https://www.npmjs.com/package/@xeno-js/core\"><img src=\"https://img.shields.io/npm/v/@xeno-js/core?style=flat-square\" alt=\"NPM Version\" /></a>\n <a href=\"https://github.com/xeno-js/xeno-js\"><img src=\"https://img.shields.io/badge/Powered%20by-Xeno-blueviolet?style=flat-square\" alt=\"Powered by Xeno\" /></a>\n <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-MIT-blue?style=flat-square\" alt=\"License: MIT\" /></a>\n <a href=\"https://buymeacoffee.com/xenojs\">\n <img src=\"https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-FFdd00?style=flat-square&logo=buy-me-a-coffee&logoColor=black\" alt=\"Buy Me A Coffee\" />\n </a>\n </p>\n</div>\n\n---\n\n## What is Xeno?\n\nXeno is a TypeScript application architecture framework for Node.js.\n\nIt provides explicit building blocks for applications organized around:\n\n- **Dependency Injection** with explicit service registration and lifetimes\n- **Domain-Driven Design (DDD)** and domain/application boundaries\n- **CQRS** with commands, queries, handlers, and composable pipelines\n- **Request context** built around asynchronous execution context\n- **Repositories and data sources** that keep persistence behind application\n boundaries\n- **Infrastructure adapters** for databases, Redis, authentication, logging,\n resilience, and other integrations\n\nThe goal is simple: **make application architecture explicit in code.**\n\nXeno is not tied to a specific HTTP server. Your application layer can remain\nindependent from the transport that delivers a request.\n\n---\n\n## Why Xeno?\n\n### 01 — Explicit Architecture\n\n**Your dependency graph is code.**\n\nXeno does not require decorators, runtime scanning, or implicit dependency\ndiscovery. Services are registered explicitly, and their lifetimes are visible\nat the composition root.\n\n\\`\\`\\`typescript\n services.addScoped('USER_REPOSITORY', (container) => {\n return new UserRepository(\n container.resolve('USER_DATA_SOURCE'),\n container.resolve('USER_MAPPER'),\n )\n })\n \\`\\`\\`\n\nThis makes the composition of the application easier to inspect, test, and\nreason about.\n\n### 02 — Transport Independence\n\nBusiness logic should not belong to your HTTP framework.\n\nXeno keeps application concerns separate from delivery mechanisms, allowing the\nsame application architecture to be hosted behind transports such as Fastify,\nHono, Express, or other adapters.\n\n\\`\\`\\`text\n HTTP / CLI / Worker / Lambda\n |\n v\n Presentation\n |\n v\n Application\n Commands / Queries\n |\n v\n Domain\n |\n v\n Infrastructure\n DB / Redis / APIs\n \\`\\`\\`\n\n### 03 — CQRS as an Application Primitive\n\nCommands and queries are first-class application concepts.\n\nPipelines can compose cross-cutting behavior around execution, such as:\n\n- authorization\n- idempotency\n- concurrency control\n- caching\n- resilience policies\n- request context\n\nThis keeps cross-cutting concerns out of individual handlers.\n\n### 04 — Explicit Lifetimes and Request Boundaries\n\nXeno distinguishes service lifetimes such as singleton, scoped, and transient\nservices.\n\nRequest-scoped dependencies are resolved inside an explicit application scope,\nwhile request metadata can be carried through asynchronous execution using\n\\`AsyncLocalStorage\\`.\n\nDatabase transaction state is scoped to the same application boundary, allowing\n\\`UnitOfWork\\` and \\`DbContext\\` to operate against the transaction associated with\nthe current scope.\n\n### 05 — Infrastructure Stays Outside the Domain\n\nDatabase clients, Redis, HTTP clients, authentication providers, loggers, and\nother infrastructure integrations are composed at the edge of the application.\n\nYour domain and application code can depend on contracts instead of concrete\ninfrastructure.\n\n---\n\n## Architecture\n\nA typical Xeno application can be organized like this:\n\n\\`\\`\\`text\n + ------------------------------------------+\n| Presentation |\n| HTTP / CLI / Workers / Lambda |\n +--------------------- +--------------------+\n |\n v\n + ------------------------------------------+\n| Application |\n| Commands / Queries / Handlers / Pipes |\n +--------------------- +--------------------+\n |\n v\n + ------------------------------------------+\n| Domain |\n| Entities / Policies / Rules |\n +--------------------- +--------------------+\n |\n v\n + ------------------------------------------+\n| Infrastructure |\n| DB / Redis / APIs / Auth / Logs |\n +------------------------------------------+\n \\`\\`\\`\n\nXeno's core is focused on composition and application architecture.\nInfrastructure capabilities can be enabled only when they are needed.\n\n---\n\n## Core Concepts\n\n| Concept | Purpose |\n| ------------------ | --------------------------------------------------------- |\n| \\`AppBuilder\\` | Composition root for assembling an application |\n| \\`ServiceContainer\\` | Explicit dependency injection and service lifetimes |\n| \\`CQRS\\` | Commands, queries, handlers, and mediator-based execution |\n| \\`Pipelines\\` | Cross-cutting behavior around application execution |\n| \\`Request Context\\` | Request metadata across asynchronous execution |\n| \\`Repository\\` | Application-facing persistence abstraction |\n| \\`DataSource\\` | Infrastructure-facing data access implementation |\n| \\`Module\\` | Explicit registration of related capabilities |\n| \\`Result\\` | Typed success/failure flow for application operations |\n\n---\n\n## Installation\n\n\\`\\`\\`bash\nnpm install @xeno-js / core\n \\`\\`\\`\n\nInstall only the integrations your application uses. Xeno exposes optional\ninfrastructure dependencies for capabilities such as databases, Redis, logging,\nresilience, and authentication.\n\nFor example:\n\n\\`\\`\\`bash\nnpm install zod pino cockatiel drizzle - orm\n \\`\\`\\`\n\n---\n\n## A Small Example\n\nThe composition root is explicit:\n\n\\`\\`\\`typescript\n // src/bootstrap.ts\n import { AppBuilder } from '@xeno-js/core'\n\n const app = new AppBuilder()\n .addServices((services) => {\n services.addScoped('USER_REPOSITORY', (container) => {\n return new UserRepository(container.resolve('USER_DATA_SOURCE'))\n })\n\n services.addScoped('FIND_USER_HANDLER', (container) => {\n return new FindUserHandler(container.resolve('USER_REPOSITORY'))\n })\n\n services.addTransient('FIND_USER_CONTROLLER', (c) => {\n return new FindUserController(\n c.resolve(TOKENS.REQUEST_CONTEXT),\n c.resolve(TOKENS.MEDIATOR),\n )\n })\n })\n\n await app.build()\n \\`\\`\\`\n\nThe transport remains outside the application composition:\n\n> ⚠️ **Implementation note: Example using Fastify** The following snippet uses\n> **Fastify** solely for demonstration purposes to illustrate the transport\n> layer. Thanks to the framework's agnostic architecture, the underlying logic\n> (\\`container\\` and \\`handler\\`) remains unchanged regardless of the chosen HTTP\n> system (e.g., Express, Koa) or interface (CLI, gRPC).\n\n\\`\\`\\`typescript\n import Fastify from 'fastify'\n import { app } from './bootstrap'\n\n const fastify = Fastify({ logger: true })\n\n fastify.get('/users/:id', async (req, reply) => {\n const endpoint = req.url\n\n const action = async () => {\n const controller = ContainerUtils.resolveServiceScoped(\n 'FIND_USER_CONTROLLER',\n app,\n )\n return await controller.handle()\n }\n\n const result = await ContainerUtils.runExecute(\n endpoint,\n req.method,\n req.headers,\n { reply, req },\n app,\n action,\n )\n\n return reply.send(result)\n })\n \\`\\`\\`\n\nThe HTTP adapter is responsible for HTTP. The application handler is responsible\nfor the use case.\n\n---\n\n## CQRS & Pipelines\n\nCross-cutting behavior can be composed around commands and queries:\n\n\\`\\`\\`typescript\n .addPipeline((config) => {\n config.authorization.policies = {\n FIND_USER_QUERY_HANDLER: {\n roles: ['admin'],\n permissions: ['read'],\n },\n }\n\n config.commandBus.idempotency = {\n lockTtlSeconds: 30,\n processedTtlSeconds: 60,\n }\n\n config.commandBus.concurrency = {\n delayConfig: {\n baseDelayMs: 100,\n maxJitterMs: 500,\n },\n maxRetries: 3,\n }\n\n config.queryBus.isEnabled = true\n })\n \\`\\`\\`\n\nThe exact pipeline configuration depends on the integrations enabled by your\napplication.\n\n---\n\n## Infrastructure & Integrations\n\nXeno Core can be composed with infrastructure such as:\n\n- **Database:** Drizzle ORM, PostgreSQL, LibSQL\n- **Cache / distributed coordination:** Redis\n- **Authentication:** Supabase integrations and custom strategies\n- **HTTP clients:** Axios\n- **Resilience:** Cockatiel\n- **Logging:** Console, Pino, Sentry, or custom loggers\n- **Validation:** Zod\n\nThese integrations are opt-in rather than mandatory parts of the application\narchitecture.\n\n---\n\n## CLI\n\nUse the official CLI to scaffold a Xeno application:\n\n\\`\\`\\`bash\nnpm install @xeno-js / cli\n xeno - js new my - xeno - app--core\n \\`\\`\\`\n\nSee the [CLI documentation](https://www.xeno-js.it/cli/overview).\n\n---\n\n## Documentation\n\nThe documentation hub contains the architecture and integration guides:\n\n**[xeno-js.it](https://www.xeno-js.it/introduction)**\n\nRecommended starting points:\n\n- [Introduction](https://www.xeno-js.it/introduction)\n- [Fundamentals](https://www.xeno-js.it/docs/core/overview)\n- [Dependency Injection](https://www.xeno-js.it/docs/core/fundamentals/app-builder)\n- [CQRS](https://www.xeno-js.it/docs/core/fundamentals/command-query)\n- [Pipelines](https://www.xeno-js.it/docs/core/cqrs/overview)\n- [Request Lifecycle](https://www.xeno-js.it/docs/core/fundamentals/service-container)\n- [Middleware](https://www.xeno-js.it/docs/core/fundamentals/middleware)\n- [CLI](https://www.xeno-js.it/docs/cli/overview)\n\n---\n\n## Ecosystem\n\nXeno is designed as an ecosystem rather than a single monolithic package:\n\n| Package | Role |\n| ----------------- | ----------------------------------------- |\n| \\`@xeno-js / core\\` | Application architecture and backend core |\n| \\`@xeno-js / shared\\` | Shared contracts and types |\n| \\`@xeno-js / vue\\` | Vue integration |\n| \\`@xeno-js / cli\\` | Project scaffolding and developer tooling |\n\n---\n\n## What Xeno Is Not\n\nXeno is not primarily an HTTP framework.\n\nIf you are looking for a framework centered on routing, controllers, middleware,\nand server lifecycle, there are excellent options already available in the\nNode.js ecosystem.\n\nXeno focuses on the layer above transport:\n\n> **How should a TypeScript application be structured so that its business\n> logic, dependencies, and infrastructure boundaries remain explicit as the\n> application grows?**\n\n---\n\n## Production Considerations\n\nXeno provides architectural primitives, but application correctness still\ndepends on how those primitives are composed.\n\nBefore deploying an application, test the behaviors that matter to your\nworkload, especially:\n\n- request and transaction isolation\n- service lifetime boundaries\n- authorization policies\n- idempotency semantics\n- concurrency behavior\n- cache consistency\n- failure and retry behavior\n- trusted proxy / client IP configuration\n- database transaction boundaries\n\nThe framework is designed to make these boundaries explicit rather than hide\nthem behind conventions.\n\n---\n\n## Contributing\n\nContributions are welcome.\n\nDevelopment happens from feature branches targeting \\`develop\\`.\n\n\\`\\`\\`bash\ngit checkout develop\ngit pull origin develop\ngit checkout - b feat / your - feature\n\nnpm install\nnpm run check\n \\`\\`\\`\n\nWe use Conventional Commits:\n\n\\`\\`\\`bash\n feat(scope): add new feature\n fix(scope): resolve bug\n chore(scope): update dependencies\n \\`\\`\\`\n\nBefore opening a pull request, run:\n\n\\`\\`\\`bash\nnpm run check\n \\`\\`\\`\n\n| Command | Description |\n| ----------------------- | ------------------------ |\n| \\`npm run build\\` | Build the package |\n| \\`npm run typecheck\\` | TypeScript type checking |\n| \\`npm run lint\\` | ESLint |\n| \\`npm run format: check\\` | Prettier validation |\n| \\`npm run test\\` | Vitest test suite |\n| \\`npm run test: coverage\\` | Test suite with coverage |\n\n---\n\n## Support\n\nIf Xeno is useful to you, you can support the project through the community and\nsponsorship channels documented on the website:\n\n**[Support Xeno](https://www.xeno-js.it/docs/support-us)**\n\n---\n\n## License\n\nCopyright (c) 2026 Xeno.\n\nLicensed under the [MIT License](LICENSE).\n`\n\n const filePath = path.join(projectPath, 'readme')\n await this._fileService.writeFileRecursive(filePath, content)\n }\n}\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { CORE_CONSTANTS, type CoreOptions } from '../../../shared'\r\n\r\nexport class RegistryGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n let dbImport = ''\r\n let registryType = ''\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n dbImport = `import type { DbSchema } from './schema';`\r\n registryType = `XenoRegistry<DbSchema>`\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n dbImport = `import type { SqliteSchema } from './schema';`\r\n registryType = `XenoRegistry<SqliteSchema>`\r\n }\r\n } else {\r\n registryType = `XenoRegistry`\r\n }\r\n\r\n const content = `import type { XenoRegistry } from '@xeno-js/core';\r\n${dbImport}\r\n\r\n/**\r\n * @file registry.ts\r\n * @description Centralized Type Contract for Dependency Injection.\r\n */\r\nexport interface MyRegistry extends ${registryType} {\r\n // Add your application injection tokens here\r\n // e.g., USER_REPOSITORY: IUserRepository;\r\n}\r\n`\r\n\r\n const filePath = path.join(projectPath, 'src', 'registry.ts')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport type { CoreOptions } from '../../../shared'\r\n\r\nexport class TsconfigGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, _options: CoreOptions): Promise<void> {\r\n const tsconfig = {\r\n compilerOptions: {\r\n target: 'ES2022',\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n strict: true,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n forceConsistentCasingInFileNames: true,\r\n outDir: './dist',\r\n rootDir: './src',\r\n types: ['node'],\r\n paths: {\r\n '@/*': ['./src/*'],\r\n },\r\n },\r\n include: ['src/**/*.ts'],\r\n }\r\n\r\n const filePath = path.join(projectPath, 'tsconfig.json')\r\n await this._fileService.writeFileRecursive(filePath, JSON.stringify(tsconfig, null, 2))\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { type CoreOptions } from '../../../shared'\r\n\r\n/**\r\n * @class DrizzleGenerator\r\n * @description Generates the Drizzle configuration file (drizzle.config.ts) and a basic schema file (src/schema.ts) for database scaffolding.\r\n * The generator is only invoked if the user has opted to include database support in their project.\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @license ISC\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\nexport class DrizzleGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n async generate(projectPath: string, _options: CoreOptions): Promise<void> {\r\n const configContent = this.composeDrizzleConfig()\r\n const filePath = path.join(projectPath, 'drizzle.config.ts')\r\n await this._fileService.writeFileRecursive(filePath, configContent)\r\n\r\n const schemaContent = this.composeSchema()\r\n await this._fileService.writeFileRecursive(\r\n path.join(projectPath, 'src', 'schema.ts'),\r\n schemaContent,\r\n )\r\n }\r\n\r\n private composeDrizzleConfig(): string {\r\n return `/// <reference types=\"node\" />\r\nimport 'dotenv/config';\r\nimport { defineConfig } from 'drizzle-kit';\r\n\r\n/**\r\n * Drizzle Kit configuration file.\r\n * Defines the schema location, migration output directory, and database connection.\r\n */\r\nexport default defineConfig({\r\n schema: './src/schema.ts',\r\n out: './drizzle',\r\n dialect: 'postgresql',\r\n dbCredentials: {\r\n url: process.env.DATABASE_URL!,\r\n },\r\n verbose: true,\r\n strict: true,\r\n});\r\n`\r\n }\r\n\r\n private composeSchema(): string {\r\n return `import { boolean, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';\r\n\r\n/**\r\n * @description Define your database tables here.\r\n * The 'usersTable' serves as a baseline example. \r\n * You can add more tables, relations, and indexes according to your domain requirements.\r\n */\r\nexport const usersTable = pgTable('users', {\r\n id: serial('id').primaryKey(),\r\n name: text('name').notNull(),\r\n email: text('email').notNull().unique(),\r\n isDeleted: boolean('is_deleted').notNull().default(false),\r\n deletedAt: timestamp('deleted_at'),\r\n createdAt: timestamp('created_at').defaultNow(),\r\n});\r\n\r\n/**\r\n * Types inferred from the schema.\r\n * - UserDto: Represents the shape of the data retrieved from the database ($inferSelect).\r\n * - NewUserDto: Represents the shape of the data required to insert a new record ($inferInsert).\r\n */\r\nexport type UserDto = typeof usersTable.$inferSelect;\r\nexport type NewUserDto = typeof usersTable.$inferInsert;\r\n\r\n/**\r\n * Centralized Database Schema dictionary.\r\n */\r\nexport type DbSchema = {\r\n users: typeof usersTable;\r\n};\r\n`\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { type CoreOptions } from '../../../shared'\r\n\r\n/**\r\n * @class DrizzleSqlLiteGenerator\r\n * @description Generates a Drizzle configuration file (drizzle.config.ts) and a\r\n * SQLite schema example (src/infrastructure/db/sqlite-schema.ts) when the user\r\n * opts to use SQLite/libSQL instead of Postgres.\r\n */\r\nexport class DrizzleSqlLiteGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n async generate(projectPath: string, _options: CoreOptions): Promise<void> {\r\n const configContent = this.composeDrizzleConfig()\r\n const filePath = path.join(projectPath, 'drizzle.config.ts')\r\n await this._fileService.writeFileRecursive(filePath, configContent)\r\n\r\n const schemaPath = path.join(projectPath, 'src', 'schema.ts')\r\n const schemaContent = this.composeSchema()\r\n await this._fileService.writeFileRecursive(schemaPath, schemaContent)\r\n }\r\n\r\n private composeDrizzleConfig(): string {\r\n return `/// <reference types=\"node\" />\r\nimport 'dotenv/config';\r\nimport { defineConfig } from 'drizzle-kit';\r\n\r\n/**\r\n * Drizzle Kit configuration for SQLite / libSQL.\r\n * Uses environment variable SQLITE_DATABASE_URL to locate the database.\r\n */\r\nexport default defineConfig({\r\n schema: './src/schema.ts',\r\n out: './drizzle',\r\n dialect: 'sqlite',\r\n dbCredentials: {\r\n url: process.env.SQLITE_DATABASE_URL!,\r\n },\r\n verbose: true,\r\n strict: true,\r\n});\r\n`\r\n }\r\n\r\n private composeSchema(): string {\r\n return `import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core';\r\n\r\n /**\r\n * Example SQLite schema using Drizzle's libsql primitives.\r\n * Place your application tables here (this file is scaffolded by the CLI when\r\n * the user opts into SQLite support).\r\n */\r\n export const usersTable = sqliteTable('users', {\r\n id: integer('id').primaryKey().notNull(),\r\n name: text('name').notNull(),\r\n description: text('description'),\r\n });\r\n\r\n/**\r\n * Types inferred from the schema.\r\n * - UserDto: Represents the shape of the data retrieved from the database ($inferSelect).\r\n * - NewUserDto: Represents the shape of the data required to insert a new record ($inferInsert).\r\n */\r\nexport type UserDto = typeof usersTable.$inferSelect;\r\nexport type NewUserDto = typeof usersTable.$inferInsert;\r\n\r\n/**\r\n * Centralized Database Schema dictionary.\r\n */\r\nexport type SqliteSchema = {\r\n users: typeof usersTable;\r\n};\r\n`\r\n }\r\n}\r\n","import path from 'node:path'\r\n\r\nimport type { IFileService, IGenerator } from '../../../domain'\r\nimport { type CoreOptions } from '../../../shared'\r\n\r\nexport class MainGenerator implements IGenerator<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n\r\n public async generate(projectPath: string, options: CoreOptions): Promise<void> {\r\n const content = `import 'dotenv/config';\r\nimport { bootstrap } from './bootstrap';\r\nimport { TOKENS } from '@xeno-js/core';\r\n\r\n/**\r\n * Main Application Entry Point\r\n */\r\nasync function main() {\r\n try {\r\n console.info('⏳ Bootstrapping ${options.targetDir} application...');\r\n \r\n // Initialize the dependency injection container and infrastructure modules\r\n const container = await bootstrap();\r\n \r\n const logger = container.resolve(TOKENS.LOGGER)\r\n logger.info('✅ Application started successfully!');\r\n\r\n // TODO: Implement your logic here\r\n \r\n } catch (error) {\r\n console.error('❌ Critical error during startup:', error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nmain();\r\n`\r\n\r\n const filePath = path.join(projectPath, 'src', 'main.ts')\r\n await this._fileService.writeFileRecursive(filePath, content)\r\n }\r\n}\r\n","// src/strategies/core.strategy.ts\r\nimport prompts from 'prompts'\r\n\r\nimport type { IFileService, IGenerator, IScaffoldStrategy } from '../../domain'\r\nimport type { CoreOptions } from '../../shared'\r\nimport { CORE_CONSTANTS, TARGET_ENV_CONSTANTS } from '../../shared'\r\n\r\nexport class CoreScaffoldStrategy implements IScaffoldStrategy<CoreOptions> {\r\n constructor(private readonly _fileService: IFileService) {}\r\n public async promptOptions(targetDir: string): Promise<CoreOptions> {\r\n const response = await prompts([\r\n { type: 'confirm', name: 'axios', message: 'Install Axios?', initial: true },\r\n { type: 'confirm', name: 'cockatiel', message: 'Install Cockatiel?', initial: true },\r\n { type: 'confirm', name: 'supabase', message: 'Install Supabase Auth?', initial: true },\r\n {\r\n type: 'select',\r\n name: 'database',\r\n message: 'Select database type',\r\n choices: [\r\n { title: 'Drizzle PostgreSQL', value: 'drizzle' },\r\n { title: 'SQL Lite', value: 'sqlLite' },\r\n { title: 'None', value: 'none' },\r\n ],\r\n },\r\n { type: 'confirm', name: 'pino', message: 'Install Pino Logger?', initial: true },\r\n { type: 'confirm', name: 'sentry', message: 'Install Sentry Logger?', initial: true },\r\n { type: 'confirm', name: 'redis', message: 'Install Redis?', initial: true },\r\n { type: 'confirm', name: 'zod', message: 'Install Zod?', initial: true },\r\n // {\r\n // type: 'select',\r\n // name: 'targetEnv',\r\n // message: 'Select target environment',\r\n // choices: [\r\n // { title: 'Console', value: 'console' },\r\n // { title: 'Vercel (Serverless)', value: 'vercel' },\r\n // { title: 'Fastify (Standalone)', value: 'fastify' },\r\n // ],\r\n // },\r\n {\r\n type: 'confirm',\r\n name: 'gitInit',\r\n message: 'Initialize a new Git repository?',\r\n initial: true,\r\n },\r\n ])\r\n\r\n return {\r\n targetDir,\r\n projectType: 'core',\r\n targetEnv: 'console',\r\n ...response,\r\n }\r\n }\r\n\r\n public async getGenerators(options: CoreOptions): Promise<IGenerator<CoreOptions>[]> {\r\n // Lazy Loading: Importiamo i moduli solo se servono!\r\n const generators: IGenerator<CoreOptions>[] = []\r\n\r\n const { PackageJsonCoreGenerator } = await import('../generators/core/packagejson.generator.js')\r\n const { BootstrapGenerator } = await import('../generators/core/bootstrap.generator.js')\r\n const { EnvGenerator } = await import('../generators/core/env.generator.js')\r\n const { GitIgnoreGenerator } = await import('../generators/gitignore.generator.js')\r\n const { ReadmeGenerator } = await import('../generators/core/readme.generator.js')\r\n const { RegistryGenerator } = await import('../generators/core/registry.generator.js')\r\n const { TsconfigGenerator } = await import('../generators/core/tsconfig.generator.js')\r\n\r\n generators.push(new PackageJsonCoreGenerator(this._fileService))\r\n generators.push(new BootstrapGenerator(this._fileService))\r\n generators.push(new EnvGenerator(this._fileService))\r\n generators.push(new GitIgnoreGenerator(this._fileService))\r\n generators.push(new ReadmeGenerator(this._fileService))\r\n generators.push(new RegistryGenerator(this._fileService))\r\n generators.push(new TsconfigGenerator(this._fileService))\r\n\r\n if (options.database !== CORE_CONSTANTS.NONE) {\r\n if (options.database === CORE_CONSTANTS.DRIZZLE) {\r\n const { DrizzleGenerator } = await import('../generators/core/drizzle.generator.js')\r\n generators.push(new DrizzleGenerator(this._fileService))\r\n } else if (options.database === CORE_CONSTANTS.SQL_LITE) {\r\n const { DrizzleSqlLiteGenerator } =\r\n await import('../generators/core/drizzle-sql-lite.generator.js')\r\n generators.push(new DrizzleSqlLiteGenerator(this._fileService))\r\n }\r\n }\r\n\r\n if (options.targetEnv === TARGET_ENV_CONSTANTS.CONSOLE) {\r\n const { MainGenerator } = await import('../generators/core/main.generator.js')\r\n generators.push(new MainGenerator(this._fileService))\r\n }\r\n // else if (options.targetEnv === CORE_CONSTANTS.VERCEL) {\r\n // const { VercelJsonGenerator } = await import('../generators');\r\n // generators.push(new VercelJsonGenerator());\r\n // } else if (options.targetEnv === CORE_CONSTANTS.FASTIFY) {\r\n // const { FastifysonGenerator } = await import('../generators');\r\n // generators.push(new FastifysonGenerator());\r\n // }\r\n\r\n return generators\r\n }\r\n}\r\n","#!/usr/bin/env node\r\nimport pc from 'picocolors'\r\n\r\nimport { Builder } from './infrastructure/builder'\r\n\r\n/**\r\n * @function init\r\n * @description Initializes the scaffolding process for a new Xeno project.\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @license ISC\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\nasync function init() {\r\n try {\r\n const dispatcher = Builder.getDispatcher()\r\n\r\n const rawArgs = process.argv.slice(2)\r\n\r\n await dispatcher.dispatch(rawArgs)\r\n } catch (error) {\r\n console.error(pc.red('\\n❌ Execution interrupted:'))\r\n console.error(error instanceof Error ? error.message : error)\r\n process.exit(1)\r\n }\r\n}\r\n\r\ninit().catch(console.error)\r\n","import { spawn } from 'node:child_process'\r\n\r\nimport { type ICommandRunner } from '../../domain'\r\n\r\n/**\r\n * @class CommandUtils\r\n * @description Utility class for executing shell commands in a cross-platform manner.\r\n *\r\n * @author Xeno\r\n * @version 1.0.0\r\n * @license ISC\r\n * @since 2025-09-30\r\n * @link https://github.com/xeno-js/xeno-js\r\n */\r\nexport class CommandRunner implements ICommandRunner {\r\n public async run(command: string, args: string[], cwd: string, isWin = false): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const cmd = isWin ? `${command}.cmd` : command\r\n\r\n const child = spawn(cmd, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: isWin,\r\n })\r\n\r\n child.on('error', (error) => {\r\n reject(new Error(`Error during execution of the command ${command}: ${error.message}`))\r\n })\r\n\r\n child.on('close', (code) => {\r\n if (code === 0) resolve()\r\n else reject(new Error(`Command ${command} failed with code ${code}`))\r\n })\r\n })\r\n }\r\n}\r\n","import pc from 'picocolors'\r\n\r\nimport type { ICliCommand } from '../../domain'\r\nimport { Guards } from '../../shared'\r\nimport { COMMAND_CONSTANTS } from '../../shared/constants/command.constants'\r\nimport { FileUtils } from '../file'\r\n\r\nexport class GenerateCommandQuery implements ICliCommand {\r\n public readonly name: string = 'generate'\r\n public readonly aliases: string[] = ['g']\r\n\r\n public async execute(args: string[]): Promise<void> {\r\n const type = args[0] // \"command\" o \"query\"\r\n const componentName = args[1] // es: \"User\"\r\n const isCore = args.includes('--core')\r\n const isVue = args.includes('--vue')\r\n\r\n if (Guards.isNullOrEmpty(type) || Guards.isNullOrEmpty(componentName)) {\r\n throw new Error(`Invalid syntax. Usage: xeno-js g [command | query] <Name> [--core | --vue]`)\r\n }\r\n\r\n let outputPath: string | undefined = undefined\r\n const outputIndex = args.findIndex((arg) => arg === '--output' || arg === '-o' || arg === '--o')\r\n if (outputIndex !== -1 && args.length > outputIndex + 1) {\r\n outputPath = args[outputIndex + 1]\r\n }\r\n\r\n const targetDir = process.cwd()\r\n const fileService = new FileUtils()\r\n\r\n if (isCore || !isVue) {\r\n const cqrsType =\r\n type === COMMAND_CONSTANTS.COMMAND ? COMMAND_CONSTANTS.COMMAND : COMMAND_CONSTANTS.QUERY\r\n const { CqrsGenerator } = await import('../generators/core/command/cqrs.generator.js')\r\n const generator = new CqrsGenerator(fileService)\r\n\r\n await generator.generate(targetDir, componentName, cqrsType, outputPath)\r\n\r\n console.info(pc.green(`\\n Successfully generated ${type} component '${componentName}'!`))\r\n } else if (isVue) {\r\n const cqrsType =\r\n type === COMMAND_CONSTANTS.COMMAND ? COMMAND_CONSTANTS.COMMAND : COMMAND_CONSTANTS.QUERY\r\n const { CqrsVueGenerator } = await import('../generators/vue/command_query/cqrs.generator.js')\r\n const generator = new CqrsVueGenerator(fileService)\r\n\r\n await generator.generate(targetDir, componentName, cqrsType, outputPath)\r\n\r\n console.info(\r\n pc.green(`\\n✅ Successfully generated Vue ${type} component '${componentName}'!`),\r\n )\r\n } else {\r\n throw new Error(`Unsupported generator type: '${type}'. Use 'command' or 'query'.`)\r\n }\r\n }\r\n}\r\n","import { access, writeFile } from 'fs/promises'\n\nimport { type IFileService } from '../../domain'\n\nexport class FileUtils implements IFileService {\n public async writeFileRecursive(filePath: string, content: string): Promise<void> {\n try {\n await access(filePath)\n throw new Error(`[Xeno CLI Error]: Aborted. File already exists at path: ${filePath}`)\n } catch (error: unknown) {\n if ((error as { code?: string }).code !== 'ENOENT') {\n throw error\n }\n }\n\n await writeFile(filePath, content, 'utf8')\n }\n}\n","import pc from 'picocolors'\r\n\r\nimport type { ICliCommand } from '../../domain'\r\nimport { ARGS_CONSTANTS, COMMAND_CONSTANTS } from '../../shared'\r\n\r\nexport class HelpCommand implements ICliCommand {\r\n public get name(): string {\r\n return COMMAND_CONSTANTS.HELP\r\n }\r\n public get aliases(): string[] {\r\n return [ARGS_CONSTANTS.HELP, '-h']\r\n }\r\n\r\n public async execute(): Promise<void> {\r\n console.info(pc.greenBright('\\n🚀 Xeno CLI - Usage Guide\\n'))\r\n\r\n // --- NEW PROJECT ---\r\n console.info(pc.bold(pc.blue('1. Create a new project:')))\r\n console.info(` xeno-js new ${pc.yellow('<name>')} ${pc.cyan('[--vue | --core]')}`)\r\n console.info(` ${pc.gray('•')} ${pc.yellow('<name>')}: The name of your project directory.`)\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.cyan('[--vue | --core]')}: Project type. ${pc.gray('(Default: --core)')}`,\r\n )\r\n console.info(` - ${pc.cyan('--core')}: Initializes a Backend project (Node.js/TS).`)\r\n console.info(` - ${pc.cyan('--vue')}: Initializes a Frontend project (Vue.js).\\n`)\r\n\r\n // --- GENERATE ---\r\n console.info(pc.bold(pc.blue('2. Generate CQRS components:')))\r\n console.info(\r\n ` xeno-js generate ${pc.magenta('<type>')} ${pc.yellow('<Name>')} ${pc.cyan('[--vue | --core]')} ${pc.green('[--output <path>]')}`,\r\n )\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.magenta('<type>')}: Component type to generate (${pc.magenta('command')} | ${pc.magenta('query')}).`,\r\n )\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.yellow('<Name>')}: The name of the component (e.g., UserCreate).`,\r\n )\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.cyan('[--vue | --core]')}: Target context. ${pc.gray('(Default: --core)')}`,\r\n )\r\n console.info(\r\n ` - ${pc.cyan('--core')}: Generates Controller, Handler, Command/Query, Module, and Zod/DB schemas.`,\r\n )\r\n console.info(\r\n ` - ${pc.cyan('--vue')}: Generates frontend-specific files (Stores, Services, etc.).`,\r\n )\r\n console.info(\r\n ` ${pc.gray('•')} ${pc.green('[--output | -o]')}: Custom destination path inside 'src/'. ${pc.gray('(Default: src/<name-in-lowercase>)')}`,\r\n )\r\n console.info(\r\n ` ${pc.gray('Alias:')} ${pc.gray('xeno-js g <type> <Name> [--vue | --core] [-o | --o <path>]')}\\n`,\r\n )\r\n\r\n // --- HELP ---\r\n console.info(pc.bold(pc.blue('3. Help:')))\r\n console.info(` xeno-js --help ${pc.gray('Displays this guide.')}`)\r\n console.info(` ${pc.gray('Alias:')} ${pc.gray('xeno-js --h | -h')}\\n`)\r\n\r\n // --- DOCS ---\r\n console.info(pc.bold(pc.blue('Documentation:')))\r\n console.info(` ${pc.underline('https://www.xeno-js.it')}\\n`)\r\n }\r\n}\r\n","import pc from 'picocolors'\r\n\r\nimport type { ICliCommand } from '../../domain'\r\nimport type { IScaffoldStrategy } from '../../domain'\r\nimport { type ScaffoldingOptions } from '../../shared'\r\nimport { Bootstrapper } from '../bootstrap'\r\nimport { FileUtils } from '../file'\r\nimport { CommandRunner } from './command-runner.service'\r\n\r\nexport class NewProjectCommand implements ICliCommand {\r\n public readonly name: string = 'new'\r\n public readonly aliases: string[] = []\r\n\r\n public async execute(args: string[]): Promise<void> {\r\n const targetDir = args.find((arg) => !arg.startsWith('--')) ?? 'my-xeno-app'\r\n const isVue = args.includes('--vue')\r\n const fileService = new FileUtils()\r\n\r\n let strategy: IScaffoldStrategy<ScaffoldingOptions>\r\n\r\n if (isVue) {\r\n const { VueScaffoldStrategy } = await import('../strategies/vue-scaffold.strategy.js')\r\n strategy = new VueScaffoldStrategy(fileService)\r\n } else {\r\n const { CoreScaffoldStrategy } = await import('../strategies/core-scaffold.strategy.js')\r\n strategy = new CoreScaffoldStrategy(fileService)\r\n }\r\n\r\n const options = await strategy.promptOptions(targetDir)\r\n\r\n const generators = await strategy.getGenerators(options)\r\n const bootstrapper = new Bootstrapper(generators)\r\n await bootstrapper.run(targetDir, options)\r\n\r\n const commandRunner = new CommandRunner()\r\n if (options.gitInit) {\r\n console.info(pc.greenBright('\\n🗂️ Initializing Git repository...'))\r\n await commandRunner.run('git', ['init'], targetDir)\r\n }\r\n console.info(pc.greenBright('\\n📦 Installing dependencies...'))\r\n const isWin = process.platform === 'win32'\r\n await commandRunner.run('npm', ['install'], targetDir, isWin)\r\n\r\n console.info(pc.green(`\\n✅ Project successfully created in ./${targetDir}`))\r\n console.info(pc.white(`\\nNext steps:\\n cd ${targetDir}\\n npm run start\\n`))\r\n }\r\n}\r\n","// src/core/bootstrapper.ts\r\nimport { mkdir } from 'node:fs/promises'\r\nimport { resolve } from 'node:path'\r\n\r\nimport pc from 'picocolors'\r\n\r\nimport type { IGenerator } from '../../domain'\r\nimport { type BaseOptions, type ScaffoldingOptions } from '../../shared'\r\n\r\nexport class Bootstrapper<T extends BaseOptions = ScaffoldingOptions> {\r\n constructor(private readonly _generators: IGenerator<T>[]) {}\r\n\r\n public async run(projectPath: string, options: T): Promise<void> {\r\n console.info(pc.cyan('\\n🚀 Initializing scaffolding...'))\r\n\r\n const absolutePath = resolve(process.cwd(), projectPath)\r\n await mkdir(absolutePath, { recursive: true })\r\n\r\n for (const generator of this._generators) {\r\n try {\r\n await generator.generate(absolutePath, options)\r\n } catch (error) {\r\n console.error(pc.red(`\\n❌ Error during execution of ${generator.constructor.name}`))\r\n throw error\r\n }\r\n }\r\n\r\n console.info(pc.green('\\n✨ Scaffolding completed succesfully!'))\r\n }\r\n}\r\n","import pc from 'picocolors'\r\n\r\nimport type { ICliCommand, IDispatcher } from '../../domain'\r\nimport { ARGS_CONSTANTS, COMMAND_CONSTANTS, Guards } from '../../shared'\r\n\r\nexport class CliDispatcher implements IDispatcher {\r\n private readonly _commands = new Map<string, ICliCommand>()\r\n\r\n constructor(commands: ICliCommand[]) {\r\n for (const command of commands) {\r\n this._commands.set(command.name, command)\r\n for (const alias of command.aliases) {\r\n this._commands.set(alias, command)\r\n }\r\n }\r\n }\r\n\r\n public async dispatch(rawArgs: string[]): Promise<void> {\r\n const action = rawArgs[0]\r\n\r\n if (\r\n !Guards.isDefined(action) ||\r\n action === ARGS_CONSTANTS.HELP ||\r\n action === '-h' ||\r\n action === '--h'\r\n ) {\r\n const helpCommand = this._commands.get(COMMAND_CONSTANTS.HELP)\r\n await helpCommand?.execute([])\r\n return\r\n }\r\n\r\n const command = this._commands.get(action)\r\n\r\n if (!Guards.isDefined(command)) {\r\n console.error(pc.red(`\\n❌ '${action}' is not a command`))\r\n console.info(\r\n pc.yellow(`See 'xeno-js --help' for cli usage guide or https://www.xeno-js.it for docs.\\n`),\r\n )\r\n process.exit(1)\r\n }\r\n\r\n const commandArgs = rawArgs.slice(1)\r\n await command.execute(commandArgs)\r\n }\r\n}\r\n","import { type IDispatcher } from '../../domain'\r\nimport { GenerateCommandQuery, HelpCommand, NewProjectCommand } from '../commands'\r\nimport { CliDispatcher } from '../dispatcher'\r\n\r\nexport class Builder {\r\n public static getDispatcher(): IDispatcher {\r\n const dispatcher = new CliDispatcher([\r\n new NewProjectCommand(),\r\n new GenerateCommandQuery(),\r\n new HelpCommand(),\r\n ])\r\n\r\n return dispatcher\r\n }\r\n}\r\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmmBhB,cAAM,KAAK,aAAa,mBAAmB,mBAAAC,QAAK,KAAK,aAAa,WAAW,GAAG,OAAO;AAAA,MACzF;AAAA,IACF;AAAA;AAAA;;;AC/mBA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAMa;AANb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAIjB;AAEO,IAAM,qBAAN,MAAmE;AAAA,MACxE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAA4C;AACrF,YAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+Bd,YAAK,QAAwB,aAAa,eAAe,UAAU;AACjE,qBAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKb;AAGA,YAAK,QAAwB,cAAc,eAAe,QAAQ;AAChE,qBAAW;AAAA;AAAA;AAAA;AAAA,QAGb;AAEA,cAAM,WAAW,mBAAAC,QAAK,KAAK,aAAa,YAAY;AACpD,cAAM,KAAK,aAAa,mBAAmB,UAAU,OAAO;AAAA,MAC9D;AAAA,IACF;AAAA;AAAA;;;AC3DA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAKV,IAAM,kBAAN,MAAwD;AAAA,MAC7D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAE7E,cAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKb,QAAQ,SAAS,oBAAoB,kCAAkC;AAAA;AAAA;AAGzE,cAAM,KAAK,aAAa,mBAAmB,mBAAAC,QAAK,KAAK,aAAa,OAAO,SAAS,GAAG,MAAM;AAAA,MAC7F;AAAA,IACF;AAAA;AAAA;;;ACpBA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAKV,IAAM,qBAAN,MAA2D;AAAA,MAChE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAE7E,YAAI,eAAe;AAAA;AAEnB,YAAI,QAAQ,UAAU;AACpB,0BAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,QAIlB;AAEA,YAAI,QAAQ,QAAQ;AAClB,0BAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAelB,OAAO;AACL,0BAAgB;AAAA;AAAA;AAAA;AAAA,QAGlB;AAEA,wBAAgB;AAAA;AAAA;AAAA;AAIhB,cAAM,cAAc;AAAA;AAAA;AAAA;AAAA,EAItB,YAAY;AAAA;AAAA;AAAA;AAAA;AAKV,cAAM,KAAK,aAAa;AAAA,UACtB,mBAAAC,QAAK,KAAK,aAAa,OAAO,cAAc;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC3DA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAKV,IAAM,oBAAN,MAA0D;AAAA,MAC/D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAC7E,cAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,aAKT,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO1B,cAAM,KAAK,aAAa,mBAAmB,mBAAAC,QAAK,KAAK,aAAa,YAAY,GAAG,SAAS;AAAA,MAC5F;AAAA,IACF;AAAA;AAAA;;;ACvBA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAKV,IAAM,gBAAN,MAAsD;AAAA,MAC3D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAE7E,cAAM,eAAe,QAAQ,SAAS;AAAA,kCAAqC;AAC3E,cAAM,cAAc,QAAQ,QAAQ;AAAA,wCAA2C;AAC/E,cAAM,iBAAiB,QAAQ,WAAW;AAAA,gCAAmC;AAE7E,cAAM,SAAS;AAAA;AAAA;AAAA,mDAGgC,YAAY,GAAG,WAAW,GAAG,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxF,QAAQ,QAAQ,kCAAkC,EAAE;AAAA;AAAA,MAEpD,QAAQ,SAAS,2BAA2B,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAchD,cAAM,KAAK,aAAa,mBAAmB,mBAAAC,QAAK,KAAK,aAAa,OAAO,SAAS,GAAG,MAAM;AAAA,MAC7F;AAAA,IACF;AAAA;AAAA;;;ACxCA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAKV,IAAM,oBAAN,MAA0D;AAAA,MAC/D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,UAAqC;AAC9E,cAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWnB,cAAM,KAAK,aAAa;AAAA,UACtB,mBAAAC,QAAK,KAAK,aAAa,OAAO,aAAa;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACzBA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAKV,IAAM,kBAAN,MAAwD;AAAA,MAC7D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAE7E,YAAI,QAAQ,QAAQ;AAClB,gBAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYjB,gBAAM,KAAK,aAAa;AAAA,YACtB,mBAAAC,QAAK,KAAK,aAAa,OAAO,UAAU,UAAU;AAAA,YAClD;AAAA,UACF;AAEA,gBAAM,KAAK,aAAa;AAAA,YACtB,mBAAAA,QAAK,KAAK,aAAa,OAAO,SAAS,cAAc;AAAA,YACrD;AAAA;AAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AClCA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAKV,IAAM,oBAAN,MAA0D;AAAA,MAC/D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAoC;AAC7E,YAAI,QAAQ,UAAU;AACpB,gBAAM,KAAK,aAAa;AAAA,YACtB,mBAAAC,QAAK,KAAK,aAAa,OAAO,UAAU,WAAW;AAAA,YACnD;AAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChBA;AAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAKV,IAAM,qBAAN,MAA2D;AAAA,MAChE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,UAAqC;AAC9E,cAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BhB,cAAM,KAAK,aAAa,mBAAmB,mBAAAC,QAAK,KAAK,aAAa,OAAO,YAAY,GAAG,OAAO;AAAA,MACjG;AAAA,IACF;AAAA;AAAA;;;ACrCA;AAAA;AAAA;AAAA;AAAA,oBAKa;AALb;AAAA;AAAA;AAAA,qBAAoB;AAKb,IAAM,sBAAN,MAAmE;AAAA,MACxE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,cAAc,WAAwC;AACjE,cAAM,WAAW,UAAM,eAAAC,SAAQ;AAAA,UAC7B,EAAE,MAAM,WAAW,MAAM,SAAS,SAAS,kBAAkB,SAAS,KAAK;AAAA,UAC3E;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,UACA,EAAE,MAAM,WAAW,MAAM,YAAY,SAAS,0BAA0B,SAAS,KAAK;AAAA,UACtF,EAAE,MAAM,WAAW,MAAM,UAAU,SAAS,0BAA0B,SAAS,KAAK;AAAA,UACpF;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,UACA,EAAE,MAAM,WAAW,MAAM,UAAU,SAAS,uBAAuB,SAAS,KAAK;AAAA,UACjF,EAAE,MAAM,WAAW,MAAM,YAAY,SAAS,yBAAyB,SAAS,KAAK;AAAA,UACrF,EAAE,MAAM,WAAW,MAAM,OAAO,SAAS,0BAA0B,SAAS,KAAK;AAAA,UACjF;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL;AAAA,UACA,aAAa;AAAA,UACb,GAAG;AAAA,QACL;AAAA,MACF;AAAA,MAEA,MAAa,cAAc,UAAyD;AAClF,cAAM,aAAuC,CAAC;AAE9C,cAAM,EAAE,yBAAAC,yBAAwB,IAAI,MAAM;AAC1C,cAAM,EAAE,qBAAAC,qBAAoB,IAAI,MAAM;AACtC,cAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,cAAM,EAAE,sBAAAC,sBAAqB,IAAI,MAAM;AACvC,cAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,cAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,cAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,cAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,cAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM;AACpC,cAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,cAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM;AACpC,cAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,cAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM;AACpC,cAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AAErC,mBAAW,KAAK,IAAIb,yBAAwB,KAAK,YAAY,CAAC;AAC9D,mBAAW,KAAK,IAAIC,qBAAoB,KAAK,YAAY,CAAC;AAC1D,mBAAW,KAAK,IAAIC,iBAAgB,KAAK,YAAY,CAAC;AACtD,mBAAW,KAAK,IAAIC,sBAAqB,KAAK,YAAY,CAAC;AAC3D,mBAAW,KAAK,IAAIG,iBAAgB,KAAK,YAAY,CAAC;AACtD,mBAAW,KAAK,IAAIC,oBAAmB,KAAK,YAAY,CAAC;AACzD,mBAAW,KAAK,IAAIC,mBAAkB,KAAK,YAAY,CAAC;AACxD,mBAAW,KAAK,IAAIC,eAAc,KAAK,YAAY,CAAC;AACpD,mBAAW,KAAK,IAAIC,mBAAkB,KAAK,YAAY,CAAC;AACxD,mBAAW,KAAK,IAAIC,iBAAgB,KAAK,YAAY,CAAC;AACtD,mBAAW,KAAK,IAAIC,mBAAkB,KAAK,YAAY,CAAC;AACxD,mBAAW,KAAK,IAAIR,oBAAmB,KAAK,YAAY,CAAC;AACzD,mBAAW,KAAK,IAAIC,oBAAmB,KAAK,YAAY,CAAC;AACzD,mBAAW,KAAK,IAAIQ,oBAAmB,KAAK,YAAY,CAAC;AAEzD,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AC9EA,IAAAC,iCAAA;AAAA,SAAAA,gCAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb,IAAAC,8BAAA;AAAA;AAAA;AAAA,IAAAD,qBAAiB;AAGjB;AAEO,IAAM,2BAAN,MAAkE;AAAA,MACvE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAqC;AAC9E,cAAM,cAAc;AAAA,UAClB,MAAM,QAAQ;AAAA,UACd,SAAS;AAAA,UACT,SAAS;AAAA,UACT,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,SAAS;AAAA,YACP,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA,cAAc;AAAA,YACZ,iBAAiB;AAAA,YACjB,UAAU;AAAA,UACZ;AAAA,UACA,iBAAiB;AAAA,YACf,eAAe;AAAA,YACf,OAAO;AAAA,YACP,cAAc;AAAA,UAChB;AAAA,QACF;AAGA,YAAI,QAAQ,aAAa,eAAe,MAAM;AAC5C,sBAAY,aAAa,aAAa,IAAI;AAC1C,sBAAY,aAAa,IAAI,IAAI;AACjC,sBAAY,aAAa,UAAU,IAAI;AACvC,sBAAY,gBAAgB,WAAW,IAAI;AAC3C,sBAAY,gBAAgB,aAAa,IAAI;AAC7C,sBAAY,QAAQ,YAAY,IAAI;AACpC,sBAAY,aAAa,aAAa,IAAI;AAC1C,sBAAY,gBAAgB,aAAa,IAAI;AAC7C,sBAAY,aAAa,gBAAgB,IAAI;AAC7C,sBAAY,QAAQ,aAAa,IAAI;AACrC,sBAAY,QAAQ,SAAS,IAAI;AAAA,QACnC;AAGA,YAAI,QAAQ,MAAO,aAAY,aAAa,OAAO,IAAI;AACvD,YAAI,QAAQ,UAAW,aAAY,aAAa,WAAW,IAAI;AAG/D,YAAI,QAAQ,MAAM;AAChB,sBAAY,aAAa,MAAM,IAAI;AACnC,sBAAY,gBAAgB,aAAa,IAAI;AAAA,QAC/C;AACA,YAAI,QAAQ,OAAQ,aAAY,aAAa,cAAc,IAAI;AAG/D,YAAI,QAAQ,MAAO,aAAY,aAAa,SAAS,IAAI;AACzD,YAAI,QAAQ,UAAU;AACpB,sBAAY,aAAa,uBAAuB,IAAI;AACpD,sBAAY,aAAa,eAAe,IAAI;AAAA,QAC9C;AACA,YAAI,QAAQ,IAAK,aAAY,aAAa,KAAK,IAAI;AAEnD,cAAM,WAAW,mBAAAE,QAAK,KAAK,aAAa,cAAc;AACtD,cAAM,KAAK,aAAa,mBAAmB,UAAU,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,MAC3F;AAAA,IACF;AAAA;AAAA;;;ACpEA;AAAA;AAAA,4BAAAC;AAAA;AAAA,IAAAC,oBAKaD;AALb;AAAA;AAAA;AAAA,IAAAC,qBAAiB;AAGjB;AAEO,IAAMD,sBAAN,MAA4D;AAAA,MACjE,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAqC;AAE9E,YAAI,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUnB,YAAI,QAAQ,aAAa,eAAe,MAAM;AAC5C,cAAI,QAAQ,aAAa,eAAe,SAAS;AAC/C,4BAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,UAKlB,WAAW,QAAQ,aAAa,eAAe,UAAU;AACvD,4BAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,UAKlB;AAAA,QACF;AAEA,YAAI,QAAQ,OAAO;AACjB,0BAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAalB,OAAO;AAEL,0BAAgB;AAAA;AAAA;AAAA;AAAA,QAIlB;AAEA,YAAI,QAAQ,UAAU;AACpB,0BAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,QAKlB;AAEA,YAAI,QAAQ,QAAQ,QAAQ,QAAQ;AAClC,gBAAM,aAAa,QAAQ,OACvB,+HACA;AACJ,gBAAM,eAAe,QAAQ,SACzB,oIACA;AAEJ,0BAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,QAKd,UAAU;AAAA,QACV,YAAY;AAAA;AAAA,QAEhB;AAEA,wBAAgB;AAAA;AAAA;AAAA;AAKhB,cAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBlB,YAAY;AAAA;AAAA;AAAA;AAKV,cAAM,WAAW,mBAAAE,QAAK,KAAK,aAAa,OAAO,cAAc;AAC7D,cAAM,KAAK,aAAa,mBAAmB,UAAU,OAAO;AAAA,MAC9D;AAAA,IACF;AAAA;AAAA;;;ACrHA,IAAAC,yBAAA;AAAA,SAAAA,wBAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb,IAAAC,sBAAA;AAAA;AAAA;AAAA,IAAAD,qBAAiB;AAGjB;AAEO,IAAM,eAAN,MAAsD;AAAA,MAC3D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,SAAqC;AAC9E,YAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAOd,YAAI,QAAQ,aAAa,eAAe,MAAM;AAC5C,cAAI,QAAQ,aAAa,eAAe,SAAS;AAC/C,uBAAW;AAAA;AAAA;AAAA;AAAA,UAGb,WAAW,QAAQ,aAAa,eAAe,UAAU;AACvD,uBAAW;AAAA;AAAA;AAAA;AAAA,UAGb;AAAA,QACF;AAEA,YAAI,QAAQ,OAAO;AACjB,qBAAW;AAAA;AAAA;AAAA;AAAA,QAGb;AAGA,YAAI,QAAQ,OAAO;AACjB,qBAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOb;AAGA,YAAI,QAAQ,UAAU;AACpB,qBAAW;AAAA;AAAA;AAAA;AAAA;AAAA,QAIb;AAGA,YAAI,QAAQ,QAAQ;AAClB,qBAAW;AAAA;AAAA;AAAA;AAAA;AAAA,QAIb;AAGA,cAAM,UAAU,mBAAAE,QAAK,KAAK,aAAa,MAAM;AAC7C,cAAM,iBAAiB,mBAAAA,QAAK,KAAK,aAAa,cAAc;AAE5D,cAAM,KAAK,aAAa,mBAAmB,SAAS,OAAO;AAC3D,cAAM,KAAK,aAAa,mBAAmB,gBAAgB,OAAO;AAAA,MACpE;AAAA,IACF;AAAA;AAAA;;;ACpEA,IAAAC,4BAAA;AAAA,SAAAA,2BAAA;AAAA;AAAA;AAAA,IAAAC,oBAKa;AALb,IAAAC,yBAAA;AAAA;AAAA;AAAA,IAAAD,qBAAiB;AAKV,IAAM,kBAAN,MAAyD;AAAA,MAC9D,YAA6B,cAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAE7B,MAAa,SAAS,aAAqB,UAAsC;AAC/E,cAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["path","import_node_path","path","import_promises","import_node_path","path","fs","GenerateCommandCoreGenerator","GenerateQueryCoreGenerator","import_node_path","path","import_node_path","path","cqrs_generator_exports","import_node_path","init_cqrs_generator","path","GenerateCommandVueGenerator","GenerateQueryVueGenerator","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","import_node_path","path","prompts","PackageJsonVueGenerator","ViteconfigGenerator","EnvVueGenerator","TsconfigVueGenerator","ReadmeVueGenerator","GitIgnoreGenerator","AppVueGenerator","BootstrapGenerator","IndexVueGenerator","MainGenerator","RegistryGenerator","RouterGenerator","TailwindGenerator","UseAppVueGenerator","packagejson_generator_exports","import_node_path","init_packagejson_generator","path","BootstrapGenerator","import_node_path","path","env_generator_exports","import_node_path","init_env_generator","path","readme_generator_exports","import_node_path","init_readme_generator","path","RegistryGenerator","import_node_path","path","tsconfig_generator_exports","import_node_path","init_tsconfig_generator","path","import_node_path","path","import_node_path","path","main_generator_exports","MainGenerator","import_node_path","init_main_generator","path","import_prompts","prompts","PackageJsonCoreGenerator","BootstrapGenerator","EnvGenerator","GitIgnoreGenerator","ReadmeGenerator","RegistryGenerator","TsconfigGenerator","DrizzleGenerator","DrizzleSqlLiteGenerator","MainGenerator","import_picocolors","resolve","CqrsGenerator","pc","CqrsVueGenerator","import_picocolors","pc","import_picocolors","import_promises","import_node_path","import_picocolors","pc","VueScaffoldStrategy","CoreScaffoldStrategy","pc","import_picocolors","pc","pc"]}
|