zudojs-cli 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +14 -1
- package/dist/src/adapters/databases/postgres.adapter.d.ts +0 -14
- package/dist/src/adapters/databases/postgres.adapter.js +0 -30
- package/dist/src/adapters/frontend/angular.adapter.js +6 -0
- package/dist/src/adapters/frontend/astro.adapter.js +2 -2
- package/dist/src/adapters/frontend/react.adapter.js +26 -17
- package/dist/src/adapters/frontend/svelte.adapter.js +1 -0
- package/dist/src/adapters/frontend/sveltekit.adapter.js +7 -8
- package/dist/src/adapters/frontend/vanilla.adapter.js +1 -1
- package/dist/src/adapters/frontend/vue.adapter.js +1 -0
- package/dist/src/adapters/package-managers/bun.adapter.js +5 -5
- package/dist/src/adapters/package-managers/npm.adapter.js +5 -5
- package/dist/src/adapters/package-managers/pnpm.adapter.js +5 -5
- package/dist/src/adapters/package-managers/yarn.adapter.js +5 -5
- package/dist/src/bin/zudojs.js +42 -6
- package/dist/src/cliApplication/cliApplication.builtins.d.ts +11 -2
- package/dist/src/cliApplication/cliApplication.builtins.js +15 -4
- package/dist/src/cliApplication/cliApplication.core.js +20 -5
- package/dist/src/cliConstant/cliConstant.value.d.ts +1 -1
- package/dist/src/cliConstant/cliConstant.value.js +2 -1
- package/dist/src/cliConstant/cliVersion.d.ts +16 -0
- package/dist/src/cliConstant/cliVersion.js +57 -0
- package/dist/src/cliParser/cliParser.core.js +7 -0
- package/dist/src/cliParser/cliParser.shortOption.js +1 -1
- package/dist/src/commands/add.command.js +27 -24
- package/dist/src/commands/build.command.js +13 -7
- package/dist/src/commands/create.command.js +177 -84
- package/dist/src/commands/dev.command.js +62 -27
- package/dist/src/commands/doctor.command.js +45 -23
- package/dist/src/commands/generate.command.js +103 -34
- package/dist/src/constants/index.d.ts +3 -1
- package/dist/src/constants/index.js +3 -1
- package/dist/src/generators/command/command.generator.d.ts +1 -0
- package/dist/src/generators/command/command.generator.js +10 -4
- package/dist/src/generators/controller/controller.generator.d.ts +1 -0
- package/dist/src/generators/controller/controller.generator.js +12 -9
- package/dist/src/generators/dto/dto.generator.d.ts +1 -0
- package/dist/src/generators/dto/dto.generator.js +9 -3
- package/dist/src/generators/event/event.generator.d.ts +1 -0
- package/dist/src/generators/event/event.generator.js +10 -4
- package/dist/src/generators/frontend/frontendGenerator.core.js +4 -28
- package/dist/src/generators/frontend/frontendPipeline.d.ts +26 -0
- package/dist/src/generators/frontend/frontendPipeline.js +93 -0
- package/dist/src/generators/fullstack/fullstackComposer.core.d.ts +1 -2
- package/dist/src/generators/fullstack/fullstackComposer.core.js +68 -62
- package/dist/src/generators/infrastructure/infrastructure.generator.d.ts +11 -0
- package/dist/src/generators/infrastructure/infrastructure.generator.js +101 -61
- package/dist/src/generators/integration/integrationGenerator.core.d.ts +6 -0
- package/dist/src/generators/integration/integrationGenerator.core.js +35 -6
- package/dist/src/generators/job/job.generator.d.ts +1 -0
- package/dist/src/generators/job/job.generator.js +9 -3
- package/dist/src/generators/middleware/middleware.generator.d.ts +1 -0
- package/dist/src/generators/middleware/middleware.generator.js +10 -4
- package/dist/src/generators/model/model.generator.d.ts +1 -0
- package/dist/src/generators/model/model.generator.js +9 -3
- package/dist/src/generators/module/module.generator.d.ts +1 -0
- package/dist/src/generators/module/module.generator.js +11 -24
- package/dist/src/generators/project/project.generator.js +2 -23
- package/dist/src/generators/query/query.generator.d.ts +1 -0
- package/dist/src/generators/query/query.generator.js +10 -4
- package/dist/src/generators/repository/repository.generator.d.ts +1 -0
- package/dist/src/generators/repository/repository.generator.js +12 -9
- package/dist/src/generators/route/route.generator.d.ts +1 -0
- package/dist/src/generators/route/route.generator.js +11 -5
- package/dist/src/generators/service/service.generator.d.ts +1 -0
- package/dist/src/generators/service/service.generator.js +12 -9
- package/dist/src/generators/validator/validator.generator.d.ts +1 -0
- package/dist/src/generators/validator/validator.generator.js +9 -3
- package/dist/src/installers/dependency.installer.js +6 -2
- package/dist/src/manifest/manifestManager.core.d.ts +3 -0
- package/dist/src/prompts/backend/index.d.ts +1 -0
- package/dist/src/prompts/backend/index.js +1 -0
- package/dist/src/prompts/backend/services.prompt.d.ts +7 -0
- package/dist/src/prompts/backend/services.prompt.js +39 -0
- package/dist/src/prompts/index.d.ts +0 -1
- package/dist/src/prompts/index.js +0 -1
- package/dist/src/rollback/rollbackManager.core.js +0 -1
- package/dist/src/runners/process/processRunner.core.d.ts +4 -0
- package/dist/src/runners/process/processRunner.core.js +17 -3
- package/dist/src/scaffolders/framework.scaffolder.js +9 -6
- package/dist/src/scaffolders/scaffolder.helper.js +7 -2
- package/dist/src/scripts/postinstall.cjs +24 -3
- package/dist/src/templates/microservice/index.d.ts +1 -1
- package/dist/src/templates/microservice/index.js +1 -1
- package/dist/src/templates/microservice/microservice.template.d.ts +15 -1
- package/dist/src/templates/microservice/microservice.template.js +165 -183
- package/dist/src/templates/modular-monolith/modularMonolith.template.js +54 -106
- package/dist/src/templates/monolith/monolith.template.d.ts +1 -0
- package/dist/src/templates/monolith/monolith.template.js +50 -94
- package/dist/src/templates/shared/appRuntime.template.d.ts +71 -0
- package/dist/src/templates/shared/appRuntime.template.js +209 -0
- package/dist/src/templates/shared/index.d.ts +5 -0
- package/dist/src/templates/shared/index.js +5 -0
- package/dist/src/utils/index.d.ts +3 -3
- package/dist/src/utils/index.js +3 -3
- package/dist/src/utils/utils.exec.d.ts +19 -1
- package/dist/src/utils/utils.exec.js +37 -3
- package/dist/src/utils/utils.fileSystem.d.ts +6 -0
- package/dist/src/utils/utils.fileSystem.js +19 -0
- package/dist/src/utils/utils.name.d.ts +26 -0
- package/dist/src/utils/utils.name.js +51 -1
- package/package.json +29 -22
- package/src/scripts/postinstall.cjs +24 -3
- package/dist/.tsbuildinfo +0 -1
- package/dist/src/adapters/databases/index.d.ts.map +0 -1
- package/dist/src/adapters/databases/index.js.map +0 -1
- package/dist/src/adapters/databases/mysql.adapter.d.ts.map +0 -1
- package/dist/src/adapters/databases/mysql.adapter.js.map +0 -1
- package/dist/src/adapters/databases/postgres.adapter.d.ts.map +0 -1
- package/dist/src/adapters/databases/postgres.adapter.js.map +0 -1
- package/dist/src/adapters/databases/sqlite.adapter.d.ts.map +0 -1
- package/dist/src/adapters/databases/sqlite.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/angular.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/angular.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/astro.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/astro.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/flutter.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/flutter.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/frontendAdapter.type.d.ts.map +0 -1
- package/dist/src/adapters/frontend/frontendAdapter.type.js.map +0 -1
- package/dist/src/adapters/frontend/index.d.ts.map +0 -1
- package/dist/src/adapters/frontend/index.js.map +0 -1
- package/dist/src/adapters/frontend/next.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/next.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/nuxt.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/nuxt.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/react-native.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/react-native.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/react.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/react.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/svelte.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/svelte.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/sveltekit.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/sveltekit.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/vanilla.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/vanilla.adapter.js.map +0 -1
- package/dist/src/adapters/frontend/vue.adapter.d.ts.map +0 -1
- package/dist/src/adapters/frontend/vue.adapter.js.map +0 -1
- package/dist/src/adapters/package-managers/bun.adapter.d.ts.map +0 -1
- package/dist/src/adapters/package-managers/bun.adapter.js.map +0 -1
- package/dist/src/adapters/package-managers/index.d.ts.map +0 -1
- package/dist/src/adapters/package-managers/index.js.map +0 -1
- package/dist/src/adapters/package-managers/npm.adapter.d.ts.map +0 -1
- package/dist/src/adapters/package-managers/npm.adapter.js.map +0 -1
- package/dist/src/adapters/package-managers/packageManager.type.d.ts.map +0 -1
- package/dist/src/adapters/package-managers/packageManager.type.js.map +0 -1
- package/dist/src/adapters/package-managers/pnpm.adapter.d.ts.map +0 -1
- package/dist/src/adapters/package-managers/pnpm.adapter.js.map +0 -1
- package/dist/src/adapters/package-managers/yarn.adapter.d.ts.map +0 -1
- package/dist/src/adapters/package-managers/yarn.adapter.js.map +0 -1
- package/dist/src/bin/zudojs.d.ts.map +0 -1
- package/dist/src/bin/zudojs.js.map +0 -1
- package/dist/src/cliApplication/cliApplication.builtins.d.ts.map +0 -1
- package/dist/src/cliApplication/cliApplication.builtins.js.map +0 -1
- package/dist/src/cliApplication/cliApplication.core.d.ts.map +0 -1
- package/dist/src/cliApplication/cliApplication.core.js.map +0 -1
- package/dist/src/cliApplication/cliApplication.writer.d.ts.map +0 -1
- package/dist/src/cliApplication/cliApplication.writer.js.map +0 -1
- package/dist/src/cliApplication/index.d.ts.map +0 -1
- package/dist/src/cliApplication/index.js.map +0 -1
- package/dist/src/cliCommand/cliCommand.builder.d.ts.map +0 -1
- package/dist/src/cliCommand/cliCommand.builder.js.map +0 -1
- package/dist/src/cliCommand/cliCommand.factory.d.ts.map +0 -1
- package/dist/src/cliCommand/cliCommand.factory.js.map +0 -1
- package/dist/src/cliCommand/cliCommand.registry.d.ts.map +0 -1
- package/dist/src/cliCommand/cliCommand.registry.js.map +0 -1
- package/dist/src/cliCommand/cliCommand.validator.d.ts.map +0 -1
- package/dist/src/cliCommand/cliCommand.validator.js.map +0 -1
- package/dist/src/cliCommand/index.d.ts.map +0 -1
- package/dist/src/cliCommand/index.js.map +0 -1
- package/dist/src/cliConstant/cliConstant.value.d.ts.map +0 -1
- package/dist/src/cliConstant/cliConstant.value.js.map +0 -1
- package/dist/src/cliConstant/index.d.ts.map +0 -1
- package/dist/src/cliConstant/index.js.map +0 -1
- package/dist/src/cliError/cliError.argument.d.ts.map +0 -1
- package/dist/src/cliError/cliError.argument.js.map +0 -1
- package/dist/src/cliError/cliError.base.d.ts.map +0 -1
- package/dist/src/cliError/cliError.base.js.map +0 -1
- package/dist/src/cliError/cliError.command.d.ts.map +0 -1
- package/dist/src/cliError/cliError.command.js.map +0 -1
- package/dist/src/cliError/cliError.execution.d.ts.map +0 -1
- package/dist/src/cliError/cliError.execution.js.map +0 -1
- package/dist/src/cliError/cliError.option.d.ts.map +0 -1
- package/dist/src/cliError/cliError.option.js.map +0 -1
- package/dist/src/cliError/index.d.ts.map +0 -1
- package/dist/src/cliError/index.js.map +0 -1
- package/dist/src/cliParser/cliParser.core.d.ts.map +0 -1
- package/dist/src/cliParser/cliParser.core.js.map +0 -1
- package/dist/src/cliParser/cliParser.helper.d.ts.map +0 -1
- package/dist/src/cliParser/cliParser.helper.js.map +0 -1
- package/dist/src/cliParser/cliParser.longOption.d.ts.map +0 -1
- package/dist/src/cliParser/cliParser.longOption.js.map +0 -1
- package/dist/src/cliParser/cliParser.shortOption.d.ts.map +0 -1
- package/dist/src/cliParser/cliParser.shortOption.js.map +0 -1
- package/dist/src/cliParser/index.d.ts.map +0 -1
- package/dist/src/cliParser/index.js.map +0 -1
- package/dist/src/cliType/cliType.type.d.ts.map +0 -1
- package/dist/src/cliType/cliType.type.js.map +0 -1
- package/dist/src/cliType/index.d.ts.map +0 -1
- package/dist/src/cliType/index.js.map +0 -1
- package/dist/src/cliVersion/cliVersion.core.d.ts.map +0 -1
- package/dist/src/cliVersion/cliVersion.core.js.map +0 -1
- package/dist/src/cliVersion/index.d.ts.map +0 -1
- package/dist/src/cliVersion/index.js.map +0 -1
- package/dist/src/commands/add.command.d.ts.map +0 -1
- package/dist/src/commands/add.command.js.map +0 -1
- package/dist/src/commands/build.command.d.ts.map +0 -1
- package/dist/src/commands/build.command.js.map +0 -1
- package/dist/src/commands/create.command.d.ts.map +0 -1
- package/dist/src/commands/create.command.js.map +0 -1
- package/dist/src/commands/dev.command.d.ts.map +0 -1
- package/dist/src/commands/dev.command.js.map +0 -1
- package/dist/src/commands/doctor.command.d.ts.map +0 -1
- package/dist/src/commands/doctor.command.js.map +0 -1
- package/dist/src/commands/generate.command.d.ts.map +0 -1
- package/dist/src/commands/generate.command.js.map +0 -1
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/commands/index.js.map +0 -1
- package/dist/src/commands/info.command.d.ts.map +0 -1
- package/dist/src/commands/info.command.js.map +0 -1
- package/dist/src/constants/index.d.ts.map +0 -1
- package/dist/src/constants/index.js.map +0 -1
- package/dist/src/errors/index.d.ts.map +0 -1
- package/dist/src/errors/index.js.map +0 -1
- package/dist/src/generators/backend/backend.generator.d.ts.map +0 -1
- package/dist/src/generators/backend/backend.generator.js.map +0 -1
- package/dist/src/generators/backend/index.d.ts.map +0 -1
- package/dist/src/generators/backend/index.js.map +0 -1
- package/dist/src/generators/command/command.generator.d.ts.map +0 -1
- package/dist/src/generators/command/command.generator.js.map +0 -1
- package/dist/src/generators/controller/controller.generator.d.ts.map +0 -1
- package/dist/src/generators/controller/controller.generator.js.map +0 -1
- package/dist/src/generators/dto/dto.generator.d.ts.map +0 -1
- package/dist/src/generators/dto/dto.generator.js.map +0 -1
- package/dist/src/generators/dto/index.d.ts.map +0 -1
- package/dist/src/generators/dto/index.js.map +0 -1
- package/dist/src/generators/event/event.generator.d.ts.map +0 -1
- package/dist/src/generators/event/event.generator.js.map +0 -1
- package/dist/src/generators/event/index.d.ts.map +0 -1
- package/dist/src/generators/event/index.js.map +0 -1
- package/dist/src/generators/frontend/frontendGenerator.core.d.ts.map +0 -1
- package/dist/src/generators/frontend/frontendGenerator.core.js.map +0 -1
- package/dist/src/generators/frontend/index.d.ts.map +0 -1
- package/dist/src/generators/frontend/index.js.map +0 -1
- package/dist/src/generators/fullstack/fullstackComposer.core.d.ts.map +0 -1
- package/dist/src/generators/fullstack/fullstackComposer.core.js.map +0 -1
- package/dist/src/generators/fullstack/index.d.ts.map +0 -1
- package/dist/src/generators/fullstack/index.js.map +0 -1
- package/dist/src/generators/index.d.ts.map +0 -1
- package/dist/src/generators/index.js.map +0 -1
- package/dist/src/generators/infrastructure/index.d.ts.map +0 -1
- package/dist/src/generators/infrastructure/index.js.map +0 -1
- package/dist/src/generators/infrastructure/infrastructure.generator.d.ts.map +0 -1
- package/dist/src/generators/infrastructure/infrastructure.generator.js.map +0 -1
- package/dist/src/generators/integration/index.d.ts.map +0 -1
- package/dist/src/generators/integration/index.js.map +0 -1
- package/dist/src/generators/integration/integrationGenerator.core.d.ts.map +0 -1
- package/dist/src/generators/integration/integrationGenerator.core.js.map +0 -1
- package/dist/src/generators/job/index.d.ts.map +0 -1
- package/dist/src/generators/job/index.js.map +0 -1
- package/dist/src/generators/job/job.generator.d.ts.map +0 -1
- package/dist/src/generators/job/job.generator.js.map +0 -1
- package/dist/src/generators/middleware/index.d.ts.map +0 -1
- package/dist/src/generators/middleware/index.js.map +0 -1
- package/dist/src/generators/middleware/middleware.generator.d.ts.map +0 -1
- package/dist/src/generators/middleware/middleware.generator.js.map +0 -1
- package/dist/src/generators/model/index.d.ts.map +0 -1
- package/dist/src/generators/model/index.js.map +0 -1
- package/dist/src/generators/model/model.generator.d.ts.map +0 -1
- package/dist/src/generators/model/model.generator.js.map +0 -1
- package/dist/src/generators/module/module.generator.d.ts.map +0 -1
- package/dist/src/generators/module/module.generator.js.map +0 -1
- package/dist/src/generators/project/project.generator.d.ts.map +0 -1
- package/dist/src/generators/project/project.generator.js.map +0 -1
- package/dist/src/generators/query/query.generator.d.ts.map +0 -1
- package/dist/src/generators/query/query.generator.js.map +0 -1
- package/dist/src/generators/repository/repository.generator.d.ts.map +0 -1
- package/dist/src/generators/repository/repository.generator.js.map +0 -1
- package/dist/src/generators/route/index.d.ts.map +0 -1
- package/dist/src/generators/route/index.js.map +0 -1
- package/dist/src/generators/route/route.generator.d.ts.map +0 -1
- package/dist/src/generators/route/route.generator.js.map +0 -1
- package/dist/src/generators/service/service.generator.d.ts.map +0 -1
- package/dist/src/generators/service/service.generator.js.map +0 -1
- package/dist/src/generators/validator/index.d.ts.map +0 -1
- package/dist/src/generators/validator/index.js.map +0 -1
- package/dist/src/generators/validator/validator.generator.d.ts.map +0 -1
- package/dist/src/generators/validator/validator.generator.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/installers/dependency.installer.d.ts.map +0 -1
- package/dist/src/installers/dependency.installer.js.map +0 -1
- package/dist/src/installers/index.d.ts.map +0 -1
- package/dist/src/installers/index.js.map +0 -1
- package/dist/src/manifest/index.d.ts.map +0 -1
- package/dist/src/manifest/index.js.map +0 -1
- package/dist/src/manifest/manifestManager.core.d.ts.map +0 -1
- package/dist/src/manifest/manifestManager.core.js.map +0 -1
- package/dist/src/prompts/backend/api-style.prompt.d.ts.map +0 -1
- package/dist/src/prompts/backend/api-style.prompt.js.map +0 -1
- package/dist/src/prompts/backend/backend-architecture.prompt.d.ts.map +0 -1
- package/dist/src/prompts/backend/backend-architecture.prompt.js.map +0 -1
- package/dist/src/prompts/backend/database.prompt.d.ts.map +0 -1
- package/dist/src/prompts/backend/database.prompt.js.map +0 -1
- package/dist/src/prompts/backend/index.d.ts.map +0 -1
- package/dist/src/prompts/backend/index.js.map +0 -1
- package/dist/src/prompts/capabilities/capabilities.prompt.d.ts.map +0 -1
- package/dist/src/prompts/capabilities/capabilities.prompt.js.map +0 -1
- package/dist/src/prompts/capabilities/index.d.ts.map +0 -1
- package/dist/src/prompts/capabilities/index.js.map +0 -1
- package/dist/src/prompts/frontend/framework.prompt.d.ts.map +0 -1
- package/dist/src/prompts/frontend/framework.prompt.js.map +0 -1
- package/dist/src/prompts/frontend/frontend-architecture.prompt.d.ts.map +0 -1
- package/dist/src/prompts/frontend/frontend-architecture.prompt.js.map +0 -1
- package/dist/src/prompts/frontend/index.d.ts.map +0 -1
- package/dist/src/prompts/frontend/index.js.map +0 -1
- package/dist/src/prompts/index.d.ts.map +0 -1
- package/dist/src/prompts/index.js.map +0 -1
- package/dist/src/prompts/project/confirmation.prompt.d.ts.map +0 -1
- package/dist/src/prompts/project/confirmation.prompt.js.map +0 -1
- package/dist/src/prompts/project/index.d.ts.map +0 -1
- package/dist/src/prompts/project/index.js.map +0 -1
- package/dist/src/prompts/project/project-name.prompt.d.ts.map +0 -1
- package/dist/src/prompts/project/project-name.prompt.js.map +0 -1
- package/dist/src/prompts/project/project-type.prompt.d.ts.map +0 -1
- package/dist/src/prompts/project/project-type.prompt.js.map +0 -1
- package/dist/src/prompts/prompts.createProject.d.ts +0 -33
- package/dist/src/prompts/prompts.createProject.d.ts.map +0 -1
- package/dist/src/prompts/prompts.createProject.js +0 -143
- package/dist/src/prompts/prompts.createProject.js.map +0 -1
- package/dist/src/prompts/workspace/index.d.ts.map +0 -1
- package/dist/src/prompts/workspace/index.js.map +0 -1
- package/dist/src/prompts/workspace/package-manager.prompt.d.ts.map +0 -1
- package/dist/src/prompts/workspace/package-manager.prompt.js.map +0 -1
- package/dist/src/registries/adapter/frontendAdapterRegistry.core.d.ts.map +0 -1
- package/dist/src/registries/adapter/frontendAdapterRegistry.core.js.map +0 -1
- package/dist/src/registries/adapter/packageManagerRegistry.core.d.ts.map +0 -1
- package/dist/src/registries/adapter/packageManagerRegistry.core.js.map +0 -1
- package/dist/src/registries/dependency/dependencyRegistry.core.d.ts.map +0 -1
- package/dist/src/registries/dependency/dependencyRegistry.core.js.map +0 -1
- package/dist/src/registries/dependency/index.d.ts.map +0 -1
- package/dist/src/registries/dependency/index.js.map +0 -1
- package/dist/src/registries/generator/generatorRegistry.core.d.ts.map +0 -1
- package/dist/src/registries/generator/generatorRegistry.core.js.map +0 -1
- package/dist/src/registries/generator/index.d.ts.map +0 -1
- package/dist/src/registries/generator/index.js.map +0 -1
- package/dist/src/registries/index.d.ts.map +0 -1
- package/dist/src/registries/index.js.map +0 -1
- package/dist/src/resolvers/architecture.resolver.d.ts.map +0 -1
- package/dist/src/resolvers/architecture.resolver.js.map +0 -1
- package/dist/src/resolvers/capability/capabilityResolver.core.d.ts.map +0 -1
- package/dist/src/resolvers/capability/capabilityResolver.core.js.map +0 -1
- package/dist/src/resolvers/capability/index.d.ts.map +0 -1
- package/dist/src/resolvers/capability/index.js.map +0 -1
- package/dist/src/resolvers/configuration/configurationResolver.core.d.ts.map +0 -1
- package/dist/src/resolvers/configuration/configurationResolver.core.js.map +0 -1
- package/dist/src/resolvers/configuration/index.d.ts.map +0 -1
- package/dist/src/resolvers/configuration/index.js.map +0 -1
- package/dist/src/resolvers/dependency/dependencyResolver.core.d.ts.map +0 -1
- package/dist/src/resolvers/dependency/dependencyResolver.core.js.map +0 -1
- package/dist/src/resolvers/dependency/index.d.ts.map +0 -1
- package/dist/src/resolvers/dependency/index.js.map +0 -1
- package/dist/src/resolvers/index.d.ts.map +0 -1
- package/dist/src/resolvers/index.js.map +0 -1
- package/dist/src/resolvers/project.resolver.d.ts.map +0 -1
- package/dist/src/resolvers/project.resolver.js.map +0 -1
- package/dist/src/rollback/index.d.ts.map +0 -1
- package/dist/src/rollback/index.js.map +0 -1
- package/dist/src/rollback/rollbackManager.core.d.ts.map +0 -1
- package/dist/src/rollback/rollbackManager.core.js.map +0 -1
- package/dist/src/runners/package-manager/index.d.ts.map +0 -1
- package/dist/src/runners/package-manager/index.js.map +0 -1
- package/dist/src/runners/package-manager/packageManagerRunner.core.d.ts.map +0 -1
- package/dist/src/runners/package-manager/packageManagerRunner.core.js.map +0 -1
- package/dist/src/runners/process/index.d.ts.map +0 -1
- package/dist/src/runners/process/index.js.map +0 -1
- package/dist/src/runners/process/processRunner.core.d.ts.map +0 -1
- package/dist/src/runners/process/processRunner.core.js.map +0 -1
- package/dist/src/runners/task/index.d.ts.map +0 -1
- package/dist/src/runners/task/index.js.map +0 -1
- package/dist/src/runners/task/taskRunner.core.d.ts.map +0 -1
- package/dist/src/runners/task/taskRunner.core.js.map +0 -1
- package/dist/src/scaffolders/framework.scaffolder.d.ts.map +0 -1
- package/dist/src/scaffolders/framework.scaffolder.js.map +0 -1
- package/dist/src/scaffolders/index.d.ts.map +0 -1
- package/dist/src/scaffolders/index.js.map +0 -1
- package/dist/src/scaffolders/scaffolder.helper.d.ts.map +0 -1
- package/dist/src/scaffolders/scaffolder.helper.js.map +0 -1
- package/dist/src/templates/microservice/index.d.ts.map +0 -1
- package/dist/src/templates/microservice/index.js.map +0 -1
- package/dist/src/templates/microservice/microservice.template.d.ts.map +0 -1
- package/dist/src/templates/microservice/microservice.template.js.map +0 -1
- package/dist/src/templates/modular-monolith/index.d.ts.map +0 -1
- package/dist/src/templates/modular-monolith/index.js.map +0 -1
- package/dist/src/templates/modular-monolith/modularMonolith.template.d.ts.map +0 -1
- package/dist/src/templates/modular-monolith/modularMonolith.template.js.map +0 -1
- package/dist/src/templates/monolith/index.d.ts.map +0 -1
- package/dist/src/templates/monolith/index.js.map +0 -1
- package/dist/src/templates/monolith/monolith.template.d.ts.map +0 -1
- package/dist/src/templates/monolith/monolith.template.js.map +0 -1
- package/dist/src/types/index.d.ts.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/projectConfiguration.type.d.ts.map +0 -1
- package/dist/src/types/projectConfiguration.type.js.map +0 -1
- package/dist/src/types/scaffold.type.d.ts.map +0 -1
- package/dist/src/types/scaffold.type.js.map +0 -1
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/utils.detect.d.ts.map +0 -1
- package/dist/src/utils/utils.detect.js.map +0 -1
- package/dist/src/utils/utils.exec.d.ts.map +0 -1
- package/dist/src/utils/utils.exec.js.map +0 -1
- package/dist/src/utils/utils.fileSystem.d.ts.map +0 -1
- package/dist/src/utils/utils.fileSystem.js.map +0 -1
- package/dist/src/utils/utils.name.d.ts.map +0 -1
- package/dist/src/utils/utils.name.js.map +0 -1
- package/dist/src/validators/compatibility/compatibilityValidator.core.d.ts.map +0 -1
- package/dist/src/validators/compatibility/compatibilityValidator.core.js.map +0 -1
- package/dist/src/validators/compatibility/index.d.ts.map +0 -1
- package/dist/src/validators/compatibility/index.js.map +0 -1
- package/dist/src/validators/environment/environmentValidator.core.d.ts.map +0 -1
- package/dist/src/validators/environment/environmentValidator.core.js.map +0 -1
- package/dist/src/validators/environment/index.d.ts.map +0 -1
- package/dist/src/validators/environment/index.js.map +0 -1
- package/dist/src/validators/index.d.ts.map +0 -1
- package/dist/src/validators/index.js.map +0 -1
- package/dist/src/validators/project/index.d.ts.map +0 -1
- package/dist/src/validators/project/index.js.map +0 -1
- package/dist/src/validators/project/projectValidator.core.d.ts.map +0 -1
- package/dist/src/validators/project/projectValidator.core.js.map +0 -1
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* zudojs-cli — Controller Generator
|
|
3
3
|
*/
|
|
4
|
-
import { writeFileTree } from "../../utils/utils.fileSystem.js";
|
|
5
|
-
import { CLIGenerationError
|
|
6
|
-
import { normalizeName } from "../../utils/utils.name.js";
|
|
4
|
+
import { writeFileTree, mergeBarrelExport, } from "../../utils/utils.fileSystem.js";
|
|
5
|
+
import { CLIGenerationError } from "../../errors/index.js";
|
|
6
|
+
import { normalizeName, toPascalCase } from "../../utils/utils.name.js";
|
|
7
7
|
export async function generateController(options, cwd) {
|
|
8
8
|
const name = normalizeName(options.name);
|
|
9
|
-
const nameCamel = name
|
|
10
|
-
.replace(/-([a-z])/g, (_m, c) => c.toUpperCase())
|
|
11
|
-
.replace(/^./, (c) => c.toUpperCase());
|
|
9
|
+
const nameCamel = toPascalCase(options.name);
|
|
12
10
|
const basePath = options.basePath ?? "";
|
|
11
|
+
const prefix = basePath ? `${basePath}/` : "";
|
|
12
|
+
const indexPath = `${prefix}controllers/index.ts`;
|
|
13
13
|
const files = {
|
|
14
|
-
[`${
|
|
14
|
+
[`${prefix}controllers/${name}.controller.ts`]: `import { createLogger } from "@zudojs/logger";
|
|
15
15
|
|
|
16
16
|
export class ${nameCamel}Controller {
|
|
17
17
|
private readonly logger = createLogger({ name: "${name}-controller" });
|
|
@@ -30,9 +30,12 @@ export class ${nameCamel}Controller {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
`,
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
// Merge with any existing barrel content instead of overwriting it.
|
|
34
|
+
[indexPath]: mergeBarrelExport(cwd, indexPath, `export { ${nameCamel}Controller } from "./${name}.controller.js";`),
|
|
35
35
|
};
|
|
36
|
+
if (options.dryRun) {
|
|
37
|
+
return Object.keys(files);
|
|
38
|
+
}
|
|
36
39
|
try {
|
|
37
40
|
await writeFileTree(cwd, files);
|
|
38
41
|
return Object.keys(files);
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
export interface GenerateDtoOptions {
|
|
7
7
|
readonly name: string;
|
|
8
8
|
readonly basePath: string;
|
|
9
|
+
readonly dryRun?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export declare function generateDto(options: GenerateDtoOptions, cwd: string): Promise<string[]>;
|
|
11
12
|
//# sourceMappingURL=dto.generator.d.ts.map
|
|
@@ -4,17 +4,23 @@
|
|
|
4
4
|
* Generates DTO files.
|
|
5
5
|
*/
|
|
6
6
|
import { writeFileTree } from "../../utils/utils.fileSystem.js";
|
|
7
|
+
import { normalizeName, toPascalCase } from "../../utils/utils.name.js";
|
|
7
8
|
export async function generateDto(options, cwd) {
|
|
9
|
+
const name = normalizeName(options.name);
|
|
10
|
+
const namePascal = toPascalCase(options.name);
|
|
8
11
|
const files = {
|
|
9
|
-
[`${options.basePath}/dtos/${
|
|
10
|
-
* ${
|
|
12
|
+
[`${options.basePath}/dtos/${name}.dto.ts`]: `/**
|
|
13
|
+
* ${name} DTO.
|
|
11
14
|
*/
|
|
12
15
|
|
|
13
|
-
export interface Create${
|
|
16
|
+
export interface Create${namePascal}Dto {
|
|
14
17
|
readonly name: string;
|
|
15
18
|
}
|
|
16
19
|
`,
|
|
17
20
|
};
|
|
21
|
+
if (options.dryRun) {
|
|
22
|
+
return Object.keys(files);
|
|
23
|
+
}
|
|
18
24
|
await writeFileTree(cwd, files);
|
|
19
25
|
return Object.keys(files);
|
|
20
26
|
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
export interface GenerateEventOptions {
|
|
7
7
|
readonly name: string;
|
|
8
8
|
readonly basePath: string;
|
|
9
|
+
readonly dryRun?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export declare function generateEvent(options: GenerateEventOptions, cwd: string): Promise<string[]>;
|
|
11
12
|
//# sourceMappingURL=event.generator.d.ts.map
|
|
@@ -4,18 +4,24 @@
|
|
|
4
4
|
* Generates event files.
|
|
5
5
|
*/
|
|
6
6
|
import { writeFileTree } from "../../utils/utils.fileSystem.js";
|
|
7
|
+
import { normalizeName, toPascalCase } from "../../utils/utils.name.js";
|
|
7
8
|
export async function generateEvent(options, cwd) {
|
|
9
|
+
const name = normalizeName(options.name);
|
|
10
|
+
const namePascal = toPascalCase(options.name);
|
|
8
11
|
const files = {
|
|
9
|
-
[`${options.basePath}/events/${
|
|
10
|
-
* ${
|
|
12
|
+
[`${options.basePath}/events/${name}.event.ts`]: `/**
|
|
13
|
+
* ${name} event.
|
|
11
14
|
*/
|
|
12
15
|
|
|
13
|
-
export interface ${
|
|
14
|
-
readonly type: "${
|
|
16
|
+
export interface ${namePascal}Event {
|
|
17
|
+
readonly type: "${name}";
|
|
15
18
|
readonly timestamp: Date;
|
|
16
19
|
}
|
|
17
20
|
`,
|
|
18
21
|
};
|
|
22
|
+
if (options.dryRun) {
|
|
23
|
+
return Object.keys(files);
|
|
24
|
+
}
|
|
19
25
|
await writeFileTree(cwd, files);
|
|
20
26
|
return Object.keys(files);
|
|
21
27
|
}
|
|
@@ -7,6 +7,7 @@ import { FrontendAdapterRegistry } from "../../registries/adapter/frontendAdapte
|
|
|
7
7
|
import { PackageManagerRegistry } from "../../registries/adapter/packageManagerRegistry.core.js";
|
|
8
8
|
import { DependencyResolver } from "../../resolvers/dependency/dependencyResolver.core.js";
|
|
9
9
|
import { CLIGenerationError } from "../../errors/index.js";
|
|
10
|
+
import { runFrontendPipeline } from "./frontendPipeline.js";
|
|
10
11
|
/**
|
|
11
12
|
* Generates frontend projects using framework adapters.
|
|
12
13
|
*/
|
|
@@ -43,34 +44,9 @@ export class FrontendGenerator {
|
|
|
43
44
|
const files = [];
|
|
44
45
|
const errors = [];
|
|
45
46
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
// 2. Apply Zudojs structure
|
|
50
|
-
await adapter.applyZudojsStructure(context);
|
|
51
|
-
files.push("structure");
|
|
52
|
-
// 3. Resolve and install dependencies
|
|
53
|
-
const deps = adapter.getDependencies(context);
|
|
54
|
-
const resolution = this.dependencyResolver.resolve(deps);
|
|
55
|
-
if (resolution.conflicts.length > 0) {
|
|
56
|
-
for (const conflict of resolution.conflicts) {
|
|
57
|
-
errors.push(`Conflict: ${conflict.reason}`);
|
|
58
|
-
}
|
|
59
|
-
return { success: false, framework: options.framework, files, errors };
|
|
60
|
-
}
|
|
61
|
-
// 4. Install dependencies
|
|
62
|
-
const pmName = options.packageManager ?? "pnpm";
|
|
63
|
-
const packageManager = this.packageManagerRegistry.get(pmName);
|
|
64
|
-
if (packageManager) {
|
|
65
|
-
const devDeps = resolution.devDependencies.map((d) => d.name);
|
|
66
|
-
await packageManager.addDev(options.projectPath, devDeps);
|
|
67
|
-
files.push("dependencies");
|
|
68
|
-
}
|
|
69
|
-
// 5. Validate
|
|
70
|
-
const validation = await adapter.validate(context);
|
|
71
|
-
if (!validation.valid) {
|
|
72
|
-
errors.push(...validation.errors);
|
|
73
|
-
}
|
|
47
|
+
const outcome = await runFrontendPipeline(adapter, context, this.packageManagerRegistry, this.dependencyResolver);
|
|
48
|
+
files.push(...outcome.files);
|
|
49
|
+
errors.push(...outcome.errors);
|
|
74
50
|
}
|
|
75
51
|
catch (error) {
|
|
76
52
|
errors.push(error instanceof Error ? error.message : String(error));
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared frontend generation pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Both `FrontendGenerator` (frontend-only projects) and `FullstackComposer`
|
|
5
|
+
* (the `apps/web` half of a fullstack project) drive frontend adapters. They
|
|
6
|
+
* used to do it with two different sequences: the fullstack path skipped
|
|
7
|
+
* availability checks, dependency resolution, dependency installation and
|
|
8
|
+
* adapter validation entirely. This module is the single sequence both use so
|
|
9
|
+
* the two paths cannot drift again.
|
|
10
|
+
*
|
|
11
|
+
* @module generators/frontend/pipeline
|
|
12
|
+
*/
|
|
13
|
+
import type { FrontendAdapter, FrontendGenerationContext } from "../../adapters/frontend/frontendAdapter.type.js";
|
|
14
|
+
import type { PackageManagerRegistry } from "../../registries/adapter/packageManagerRegistry.core.js";
|
|
15
|
+
import type { DependencyResolver } from "../../resolvers/dependency/dependencyResolver.core.js";
|
|
16
|
+
/** Outcome of running the frontend pipeline for a single adapter. */
|
|
17
|
+
export interface FrontendPipelineResult {
|
|
18
|
+
readonly files: readonly string[];
|
|
19
|
+
readonly errors: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Runs the full adapter sequence: availability check, scaffold, structure,
|
|
23
|
+
* integration, dependency resolution, dependency installation, validation.
|
|
24
|
+
*/
|
|
25
|
+
export declare function runFrontendPipeline(adapter: FrontendAdapter, context: FrontendGenerationContext, packageManagerRegistry: PackageManagerRegistry, dependencyResolver: DependencyResolver): Promise<FrontendPipelineResult>;
|
|
26
|
+
//# sourceMappingURL=frontendPipeline.d.ts.map
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared frontend generation pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Both `FrontendGenerator` (frontend-only projects) and `FullstackComposer`
|
|
5
|
+
* (the `apps/web` half of a fullstack project) drive frontend adapters. They
|
|
6
|
+
* used to do it with two different sequences: the fullstack path skipped
|
|
7
|
+
* availability checks, dependency resolution, dependency installation and
|
|
8
|
+
* adapter validation entirely. This module is the single sequence both use so
|
|
9
|
+
* the two paths cannot drift again.
|
|
10
|
+
*
|
|
11
|
+
* @module generators/frontend/pipeline
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Rejects package names a package manager would read as a flag.
|
|
15
|
+
*
|
|
16
|
+
* Adapter dependency lists are static today, but they are part of the public
|
|
17
|
+
* `FrontendAdapter` contract and a third-party adapter could return
|
|
18
|
+
* `--registry=...`. Package names go into an argv array (never a shell), so
|
|
19
|
+
* this closes argument injection rather than command injection.
|
|
20
|
+
*/
|
|
21
|
+
function assertSafePackageNames(names) {
|
|
22
|
+
for (const name of names) {
|
|
23
|
+
if (name.startsWith("-") || name.trim() === "" || /\s/.test(name)) {
|
|
24
|
+
throw new Error(`Refusing to install unsafe package name: "${name}"`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Runs the full adapter sequence: availability check, scaffold, structure,
|
|
30
|
+
* integration, dependency resolution, dependency installation, validation.
|
|
31
|
+
*/
|
|
32
|
+
export async function runFrontendPipeline(adapter, context, packageManagerRegistry, dependencyResolver) {
|
|
33
|
+
const files = [];
|
|
34
|
+
const errors = [];
|
|
35
|
+
// 0. Fail fast with a readable message when the framework's own toolchain
|
|
36
|
+
// is missing. Adapters such as Flutter shell out with no fallback, so
|
|
37
|
+
// without this the user sees a bare ENOENT after the project directory
|
|
38
|
+
// has already been created and rolled back.
|
|
39
|
+
const available = await adapter.isAvailable();
|
|
40
|
+
if (!available) {
|
|
41
|
+
return {
|
|
42
|
+
files,
|
|
43
|
+
errors: [
|
|
44
|
+
`The toolchain required by the "${adapter.name}" frontend is not available on this machine. Install it and re-run, or choose another frontend.`,
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// 1. Scaffold using the official tool (adapters fall back to built-in
|
|
49
|
+
// templates where one exists).
|
|
50
|
+
await adapter.scaffold(context);
|
|
51
|
+
files.push("scaffold");
|
|
52
|
+
// 2. Apply the Zudojs structure over the scaffolded project.
|
|
53
|
+
await adapter.applyZudojsStructure(context);
|
|
54
|
+
files.push("structure");
|
|
55
|
+
// 3. Generate the adapter's integration files (API client, env helpers).
|
|
56
|
+
await adapter.generateIntegration(context);
|
|
57
|
+
files.push("integration");
|
|
58
|
+
// 4. Resolve dependencies and stop on conflicts.
|
|
59
|
+
const resolution = dependencyResolver.resolve(adapter.getDependencies(context));
|
|
60
|
+
if (resolution.conflicts.length > 0) {
|
|
61
|
+
for (const conflict of resolution.conflicts) {
|
|
62
|
+
errors.push(`Conflict: ${conflict.reason}`);
|
|
63
|
+
}
|
|
64
|
+
return { files, errors };
|
|
65
|
+
}
|
|
66
|
+
// 5. Install BOTH runtime and dev dependencies. Only devDependencies used
|
|
67
|
+
// to be installed, so every runtime package an adapter declared was
|
|
68
|
+
// resolved and then dropped on the floor.
|
|
69
|
+
const packageManager = packageManagerRegistry.get(context.packageManager);
|
|
70
|
+
if (packageManager) {
|
|
71
|
+
const deps = resolution.dependencies.map((d) => d.name);
|
|
72
|
+
const devDeps = resolution.devDependencies.map((d) => d.name);
|
|
73
|
+
assertSafePackageNames(deps);
|
|
74
|
+
assertSafePackageNames(devDeps);
|
|
75
|
+
if (deps.length > 0) {
|
|
76
|
+
await packageManager.add(context.projectPath, deps);
|
|
77
|
+
}
|
|
78
|
+
if (devDeps.length > 0) {
|
|
79
|
+
await packageManager.addDev(context.projectPath, devDeps);
|
|
80
|
+
}
|
|
81
|
+
files.push("dependencies");
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
errors.push(`Unknown package manager: ${context.packageManager}`);
|
|
85
|
+
}
|
|
86
|
+
// 6. Validate the generated project and surface the adapter's own findings.
|
|
87
|
+
const validation = await adapter.validate(context);
|
|
88
|
+
if (!validation.valid) {
|
|
89
|
+
errors.push(...validation.errors);
|
|
90
|
+
}
|
|
91
|
+
return { files, errors };
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=frontendPipeline.js.map
|
|
@@ -28,15 +28,14 @@ export declare class FullstackComposer {
|
|
|
28
28
|
private readonly frontendRegistry;
|
|
29
29
|
private readonly packageManagerRegistry;
|
|
30
30
|
private readonly dependencyResolver;
|
|
31
|
-
private readonly integrationGenerator;
|
|
32
31
|
constructor();
|
|
33
32
|
/**
|
|
34
33
|
* Generates a fullstack project.
|
|
35
34
|
*/
|
|
36
35
|
generate(context: FullstackGenerationContext): Promise<FullstackGenerationResult>;
|
|
36
|
+
private getPackageManager;
|
|
37
37
|
private createWorkspace;
|
|
38
38
|
private generateSharedPackages;
|
|
39
39
|
private generateFrontend;
|
|
40
|
-
private installDependencies;
|
|
41
40
|
}
|
|
42
41
|
//# sourceMappingURL=fullstackComposer.core.d.ts.map
|
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module generators/fullstack
|
|
7
7
|
*/
|
|
8
|
+
import { mkdir } from "node:fs/promises";
|
|
9
|
+
import { join } from "node:path";
|
|
8
10
|
import { FrontendAdapterRegistry } from "../../registries/adapter/frontendAdapterRegistry.core.js";
|
|
9
11
|
import { PackageManagerRegistry } from "../../registries/adapter/packageManagerRegistry.core.js";
|
|
10
12
|
import { DependencyResolver } from "../../resolvers/dependency/dependencyResolver.core.js";
|
|
11
|
-
import {
|
|
13
|
+
import { runFrontendPipeline } from "../frontend/frontendPipeline.js";
|
|
12
14
|
import { writeFileTree } from "../../utils/utils.fileSystem.js";
|
|
13
|
-
import { execCommand } from "../../utils/utils.exec.js";
|
|
14
15
|
/**
|
|
15
16
|
* Composes fullstack projects by orchestrating multiple generators.
|
|
16
17
|
*/
|
|
@@ -18,12 +19,10 @@ export class FullstackComposer {
|
|
|
18
19
|
frontendRegistry;
|
|
19
20
|
packageManagerRegistry;
|
|
20
21
|
dependencyResolver;
|
|
21
|
-
integrationGenerator;
|
|
22
22
|
constructor() {
|
|
23
23
|
this.frontendRegistry = new FrontendAdapterRegistry();
|
|
24
24
|
this.packageManagerRegistry = new PackageManagerRegistry();
|
|
25
25
|
this.dependencyResolver = new DependencyResolver();
|
|
26
|
-
this.integrationGenerator = new IntegrationGenerator();
|
|
27
26
|
}
|
|
28
27
|
/**
|
|
29
28
|
* Generates a fullstack project.
|
|
@@ -34,7 +33,10 @@ export class FullstackComposer {
|
|
|
34
33
|
try {
|
|
35
34
|
// 1. Create workspace structure
|
|
36
35
|
await this.createWorkspace(context);
|
|
37
|
-
files.push("package.json", "
|
|
36
|
+
files.push("package.json", "zudojs.config.ts");
|
|
37
|
+
if (this.getPackageManager(context) === "pnpm") {
|
|
38
|
+
files.push("pnpm-workspace.yaml");
|
|
39
|
+
}
|
|
38
40
|
// 2. Generate shared packages
|
|
39
41
|
await this.generateSharedPackages(context);
|
|
40
42
|
files.push("packages/contracts/", "packages/shared-types/");
|
|
@@ -43,19 +45,8 @@ export class FullstackComposer {
|
|
|
43
45
|
const frontendFiles = await this.generateFrontend(context);
|
|
44
46
|
files.push(...frontendFiles);
|
|
45
47
|
}
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
project: context.project,
|
|
49
|
-
projectPath: context.projectPath,
|
|
50
|
-
backendPort: 3000,
|
|
51
|
-
frontendPort: context.project.frontend?.framework === "next" ? 3000 : 5173,
|
|
52
|
-
});
|
|
53
|
-
files.push(".env.example", "config/cors.ts", ...(context.project.frontend?.framework === "react" ||
|
|
54
|
-
context.project.frontend?.framework === "vue"
|
|
55
|
-
? ["vite.config.ts"]
|
|
56
|
-
: []));
|
|
57
|
-
// 5. Install dependencies
|
|
58
|
-
await this.installDependencies(context);
|
|
48
|
+
// Note: integration files and dependency installation are orchestrated
|
|
49
|
+
// by the create command to avoid running them twice.
|
|
59
50
|
}
|
|
60
51
|
catch (error) {
|
|
61
52
|
errors.push(error instanceof Error ? error.message : String(error));
|
|
@@ -66,52 +57,66 @@ export class FullstackComposer {
|
|
|
66
57
|
errors,
|
|
67
58
|
};
|
|
68
59
|
}
|
|
60
|
+
getPackageManager(context) {
|
|
61
|
+
return context.project.workspace?.packageManager ?? "pnpm";
|
|
62
|
+
}
|
|
69
63
|
async createWorkspace(context) {
|
|
64
|
+
const packageManager = this.getPackageManager(context);
|
|
65
|
+
const workspaceGlobs = ["apps/*", "packages/*"];
|
|
66
|
+
const scriptFor = (script) => {
|
|
67
|
+
switch (packageManager) {
|
|
68
|
+
case "npm":
|
|
69
|
+
return `npm run ${script} --workspaces --if-present`;
|
|
70
|
+
case "yarn":
|
|
71
|
+
return `yarn workspaces run ${script}`;
|
|
72
|
+
case "bun":
|
|
73
|
+
return `bun run --filter '*' ${script}`;
|
|
74
|
+
default:
|
|
75
|
+
return `pnpm -r --parallel run ${script}`;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
70
78
|
const rootPackageJson = {
|
|
71
79
|
name: context.project.name,
|
|
72
80
|
private: true,
|
|
81
|
+
...(packageManager === "pnpm" ? {} : { workspaces: workspaceGlobs }),
|
|
73
82
|
scripts: {
|
|
74
|
-
dev: "
|
|
75
|
-
build: "
|
|
76
|
-
test: "
|
|
77
|
-
lint: "
|
|
78
|
-
typecheck: "
|
|
83
|
+
dev: scriptFor("dev"),
|
|
84
|
+
build: scriptFor("build"),
|
|
85
|
+
test: scriptFor("test"),
|
|
86
|
+
lint: scriptFor("lint"),
|
|
87
|
+
typecheck: scriptFor("typecheck"),
|
|
79
88
|
},
|
|
80
89
|
devDependencies: {
|
|
81
90
|
typescript: "^5.0.0",
|
|
82
91
|
},
|
|
83
92
|
};
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
name: "${context.project.name}",
|
|
92
|
-
type: "fullstack",
|
|
93
|
-
},
|
|
94
|
-
backend: {
|
|
95
|
-
architecture: "${context.project.backend?.architecture ?? "monolith"}",
|
|
96
|
-
api: "${context.project.backend?.api ?? "rest"}",
|
|
97
|
-
},
|
|
93
|
+
// Project and framework names reach this template from user input. They
|
|
94
|
+
// are emitted as JSON string literals (valid JS) so a quote, backslash,
|
|
95
|
+
// newline or `";` sequence cannot break out of the literal and inject
|
|
96
|
+
// code into the generated zudojs.config.ts.
|
|
97
|
+
const literal = (value) => JSON.stringify(value);
|
|
98
|
+
const frontendBlock = context.project.frontend
|
|
99
|
+
? `
|
|
98
100
|
frontend: {
|
|
99
|
-
framework:
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
packageManager: "${context.project.workspace?.packageManager ?? "pnpm"}",
|
|
107
|
-
},
|
|
101
|
+
framework: ${literal(context.project.frontend.framework)},
|
|
102
|
+
},`
|
|
103
|
+
: "";
|
|
104
|
+
const zudojsConfig = `export default {
|
|
105
|
+
name: ${literal(context.project.name)},
|
|
106
|
+
projectType: "fullstack",
|
|
107
|
+
architecture: ${literal(context.project.backend?.architecture ?? "monolith")},${frontendBlock}
|
|
108
108
|
};
|
|
109
109
|
`;
|
|
110
|
-
|
|
111
|
-
"package.json": JSON.stringify(rootPackageJson, null, 2),
|
|
112
|
-
"pnpm-workspace.yaml": workspaceYaml,
|
|
110
|
+
const files = {
|
|
111
|
+
"package.json": JSON.stringify(rootPackageJson, null, 2) + "\n",
|
|
113
112
|
"zudojs.config.ts": zudojsConfig,
|
|
114
|
-
}
|
|
113
|
+
};
|
|
114
|
+
if (packageManager === "pnpm") {
|
|
115
|
+
files["pnpm-workspace.yaml"] = `packages:
|
|
116
|
+
${workspaceGlobs.map((g) => ` - "${g}"`).join("\n")}
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
await writeFileTree(context.projectPath, files);
|
|
115
120
|
}
|
|
116
121
|
async generateSharedPackages(context) {
|
|
117
122
|
const contractsIndex = `/**
|
|
@@ -150,14 +155,17 @@ export type Timestamp = string;
|
|
|
150
155
|
if (!adapter) {
|
|
151
156
|
throw new Error(`Unknown frontend framework: ${context.project.frontend.framework}`);
|
|
152
157
|
}
|
|
153
|
-
const frontendPath =
|
|
158
|
+
const frontendPath = join(context.projectPath, "apps", "web");
|
|
159
|
+
// Scaffolders spawn with cwd=frontendPath; the directory must exist
|
|
160
|
+
// before the child process starts or spawn fails with ENOENT.
|
|
161
|
+
await mkdir(frontendPath, { recursive: true });
|
|
154
162
|
const frontendContext = {
|
|
155
163
|
project: context.project,
|
|
156
164
|
projectPath: frontendPath,
|
|
157
165
|
framework: adapter.framework,
|
|
158
166
|
language: context.project.frontend.language ?? "typescript",
|
|
159
167
|
architecture: context.project.frontend.architecture,
|
|
160
|
-
packageManager: context
|
|
168
|
+
packageManager: this.getPackageManager(context),
|
|
161
169
|
features: {
|
|
162
170
|
testing: true,
|
|
163
171
|
linting: true,
|
|
@@ -165,17 +173,15 @@ export type Timestamp = string;
|
|
|
165
173
|
envValidation: true,
|
|
166
174
|
},
|
|
167
175
|
};
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const packageManager = this.packageManagerRegistry.get(pmName);
|
|
176
|
-
if (packageManager) {
|
|
177
|
-
await packageManager.install(context.projectPath);
|
|
176
|
+
// The same pipeline the frontend-only path uses: availability check,
|
|
177
|
+
// scaffold, structure, integration, dependency resolution + install, and
|
|
178
|
+
// adapter validation. Skipping any of it here is what let fullstack
|
|
179
|
+
// projects ship an unvalidated, dependency-less apps/web.
|
|
180
|
+
const outcome = await runFrontendPipeline(adapter, frontendContext, this.packageManagerRegistry, this.dependencyResolver);
|
|
181
|
+
if (outcome.errors.length > 0) {
|
|
182
|
+
throw new Error(`Frontend generation failed: ${outcome.errors.join("; ")}`);
|
|
178
183
|
}
|
|
184
|
+
return ["apps/web/"];
|
|
179
185
|
}
|
|
180
186
|
}
|
|
181
187
|
//# sourceMappingURL=fullstackComposer.core.js.map
|
|
@@ -13,6 +13,17 @@ export interface InfrastructureOptions {
|
|
|
13
13
|
export declare class InfrastructureGenerator {
|
|
14
14
|
generate(options: InfrastructureOptions, basePath: string): Promise<void>;
|
|
15
15
|
private getFiles;
|
|
16
|
+
/**
|
|
17
|
+
* Install and build commands for Dockerfiles.
|
|
18
|
+
*
|
|
19
|
+
* Generated projects have no lockfile yet, so never use `npm ci` or
|
|
20
|
+
* `--frozen-lockfile`. pnpm and yarn need `corepack enable` on the bare
|
|
21
|
+
* node:24-alpine image; bun is not available there so it falls back to npm.
|
|
22
|
+
*/
|
|
23
|
+
private getDockerCommands;
|
|
24
|
+
private getDatabaseCompose;
|
|
25
|
+
private getDatabaseUrl;
|
|
26
|
+
private getDbServiceBlock;
|
|
16
27
|
private getAppDockerfile;
|
|
17
28
|
private getServiceDockerfile;
|
|
18
29
|
private getSimpleDockerCompose;
|