zudojs-cli 0.1.2 → 1.1.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 +26 -3
- 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/frontendAdapter.type.d.ts +6 -0
- 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 +23 -11
- 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 +22 -7
- package/dist/src/cliApplication/cliApplication.logger.d.ts +28 -0
- package/dist/src/cliApplication/cliApplication.logger.js +68 -0
- package/dist/src/cliApplication/index.d.ts +1 -3
- package/dist/src/cliApplication/index.js +1 -3
- 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/cliVersion/cliVersion.update.d.ts +38 -0
- package/dist/src/cliVersion/cliVersion.update.js +63 -0
- package/dist/src/cliVersion/index.d.ts +2 -1
- package/dist/src/cliVersion/index.js +2 -1
- package/dist/src/commands/add.command.d.ts +29 -0
- package/dist/src/commands/add.command.js +95 -107
- package/dist/src/commands/build.command.d.ts +8 -0
- package/dist/src/commands/build.command.js +24 -24
- package/dist/src/commands/create.command.js +176 -55
- package/dist/src/commands/dev.command.d.ts +30 -2
- package/dist/src/commands/dev.command.js +106 -150
- package/dist/src/commands/doctor.command.d.ts +18 -0
- package/dist/src/commands/doctor.command.js +160 -110
- package/dist/src/commands/generate.command.d.ts +2 -1
- package/dist/src/commands/generate.command.js +91 -41
- package/dist/src/commands/info.command.js +61 -30
- package/dist/src/constants/index.d.ts +19 -1
- package/dist/src/constants/index.js +32 -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.d.ts +2 -0
- package/dist/src/generators/frontend/frontendGenerator.core.js +14 -27
- package/dist/src/generators/frontend/frontendPipeline.d.ts +26 -0
- package/dist/src/generators/frontend/frontendPipeline.js +136 -0
- package/dist/src/generators/fullstack/fullstackComposer.core.d.ts +3 -2
- package/dist/src/generators/fullstack/fullstackComposer.core.js +58 -43
- 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/index.d.ts +3 -2
- package/dist/src/index.js +3 -2
- package/dist/src/installers/dependency.installer.d.ts +9 -0
- package/dist/src/installers/dependency.installer.js +27 -2
- package/dist/src/installers/index.d.ts +1 -3
- package/dist/src/installers/index.js +1 -3
- 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/resolvers/architecture.resolver.d.ts +11 -1
- package/dist/src/resolvers/architecture.resolver.js +12 -13
- package/dist/src/resolvers/configuration/configurationResolver.core.d.ts +10 -1
- package/dist/src/resolvers/configuration/configurationResolver.core.js +68 -29
- package/dist/src/resolvers/index.d.ts +1 -0
- package/dist/src/resolvers/index.js +1 -0
- package/dist/src/resolvers/layout/index.d.ts +5 -0
- package/dist/src/resolvers/layout/index.js +5 -0
- package/dist/src/resolvers/layout/projectLayout.core.d.ts +60 -0
- package/dist/src/resolvers/layout/projectLayout.core.js +236 -0
- package/dist/src/resolvers/project.resolver.d.ts +5 -0
- package/dist/src/resolvers/project.resolver.js +10 -6
- 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/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 +14 -0
- package/dist/src/templates/microservice/microservice.template.js +140 -162
- package/dist/src/templates/modular-monolith/modularMonolith.template.d.ts +0 -1
- package/dist/src/templates/modular-monolith/modularMonolith.template.js +43 -77
- package/dist/src/templates/monolith/monolith.template.d.ts +1 -1
- package/dist/src/templates/monolith/monolith.template.js +46 -69
- package/dist/src/templates/shared/appRuntime.template.d.ts +60 -0
- package/dist/src/templates/shared/appRuntime.template.js +189 -0
- package/dist/src/templates/shared/index.d.ts +6 -0
- package/dist/src/templates/shared/index.js +6 -0
- package/dist/src/templates/shared/pnpm.template.d.ts +27 -0
- package/dist/src/templates/shared/pnpm.template.js +57 -0
- package/dist/src/utils/index.d.ts +3 -3
- package/dist/src/utils/index.js +3 -3
- package/dist/src/utils/utils.detect.d.ts +9 -0
- package/dist/src/utils/utils.detect.js +11 -11
- package/dist/src/utils/utils.exec.d.ts +35 -1
- package/dist/src/utils/utils.exec.js +99 -4
- 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 +32 -23
- 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 -150
- 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/scripts/postinstall.cjs +0 -56
- 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
- package/src/scripts/postinstall.cjs +0 -56
|
@@ -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,136 @@
|
|
|
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 { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { writeFileTree } from "../../utils/utils.fileSystem.js";
|
|
16
|
+
/**
|
|
17
|
+
* Rejects package names a package manager would read as a flag.
|
|
18
|
+
*
|
|
19
|
+
* Adapter dependency lists are static today, but they are part of the public
|
|
20
|
+
* `FrontendAdapter` contract and a third-party adapter could return
|
|
21
|
+
* `--registry=...`. Package names go into an argv array (never a shell), so
|
|
22
|
+
* this closes argument injection rather than command injection.
|
|
23
|
+
*/
|
|
24
|
+
function assertSafePackageNames(names) {
|
|
25
|
+
for (const name of names) {
|
|
26
|
+
if (name.startsWith("-") || name.trim() === "" || /\s/.test(name)) {
|
|
27
|
+
throw new Error(`Refusing to install unsafe package name: "${name}"`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Runs the full adapter sequence: availability check, scaffold, structure,
|
|
33
|
+
* integration, dependency resolution, dependency installation, validation.
|
|
34
|
+
*/
|
|
35
|
+
export async function runFrontendPipeline(adapter, context, packageManagerRegistry, dependencyResolver) {
|
|
36
|
+
const files = [];
|
|
37
|
+
const errors = [];
|
|
38
|
+
// 0. Fail fast with a readable message when the framework's own toolchain
|
|
39
|
+
// is missing. Adapters such as Flutter shell out with no fallback, so
|
|
40
|
+
// without this the user sees a bare ENOENT after the project directory
|
|
41
|
+
// has already been created and rolled back.
|
|
42
|
+
const available = await adapter.isAvailable();
|
|
43
|
+
if (!available) {
|
|
44
|
+
return {
|
|
45
|
+
files,
|
|
46
|
+
errors: [
|
|
47
|
+
`The toolchain required by the "${adapter.name}" frontend is not available on this machine. Install it and re-run, or choose another frontend.`,
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// 1. Scaffold using the official tool (adapters fall back to built-in
|
|
52
|
+
// templates where one exists).
|
|
53
|
+
await adapter.scaffold(context);
|
|
54
|
+
files.push("scaffold");
|
|
55
|
+
// 2. Apply the Zudojs structure over the scaffolded project.
|
|
56
|
+
await adapter.applyZudojsStructure(context);
|
|
57
|
+
files.push("structure");
|
|
58
|
+
// 3. Generate the adapter's integration files (API client, env helpers).
|
|
59
|
+
await adapter.generateIntegration(context);
|
|
60
|
+
files.push("integration");
|
|
61
|
+
// 4. Resolve dependencies and stop on conflicts.
|
|
62
|
+
const resolution = dependencyResolver.resolve(adapter.getDependencies(context));
|
|
63
|
+
if (resolution.conflicts.length > 0) {
|
|
64
|
+
for (const conflict of resolution.conflicts) {
|
|
65
|
+
errors.push(`Conflict: ${conflict.reason}`);
|
|
66
|
+
}
|
|
67
|
+
return { files, errors };
|
|
68
|
+
}
|
|
69
|
+
// 5. Install BOTH runtime and dev dependencies. Only devDependencies used
|
|
70
|
+
// to be installed, so every runtime package an adapter declared was
|
|
71
|
+
// resolved and then dropped on the floor. With `--no-install` the
|
|
72
|
+
// dependencies are written to package.json for a later install.
|
|
73
|
+
const packageManager = packageManagerRegistry.get(context.packageManager);
|
|
74
|
+
if (context.skipInstall === true) {
|
|
75
|
+
await recordDependencies(context.projectPath, resolution.dependencies, resolution.devDependencies);
|
|
76
|
+
files.push("dependencies");
|
|
77
|
+
}
|
|
78
|
+
else if (packageManager) {
|
|
79
|
+
const deps = resolution.dependencies.map((d) => d.name);
|
|
80
|
+
const devDeps = resolution.devDependencies.map((d) => d.name);
|
|
81
|
+
assertSafePackageNames(deps);
|
|
82
|
+
assertSafePackageNames(devDeps);
|
|
83
|
+
if (deps.length > 0) {
|
|
84
|
+
await packageManager.add(context.projectPath, deps);
|
|
85
|
+
}
|
|
86
|
+
if (devDeps.length > 0) {
|
|
87
|
+
await packageManager.addDev(context.projectPath, devDeps);
|
|
88
|
+
}
|
|
89
|
+
files.push("dependencies");
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
errors.push(`Unknown package manager: ${context.packageManager}`);
|
|
93
|
+
}
|
|
94
|
+
// 6. Validate the generated project and surface the adapter's own findings.
|
|
95
|
+
const validation = await adapter.validate(context);
|
|
96
|
+
if (!validation.valid) {
|
|
97
|
+
errors.push(...validation.errors);
|
|
98
|
+
}
|
|
99
|
+
return { files, errors };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Adds the resolved dependencies to the project's package.json without
|
|
103
|
+
* running a package manager. Existing entries win: the adapter's own
|
|
104
|
+
* template may already pin a version.
|
|
105
|
+
*/
|
|
106
|
+
async function recordDependencies(projectPath, dependencies, devDependencies) {
|
|
107
|
+
const pkgPath = join(projectPath, "package.json");
|
|
108
|
+
let pkg = {};
|
|
109
|
+
if (existsSync(pkgPath)) {
|
|
110
|
+
try {
|
|
111
|
+
pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
pkg = {};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const merge = (target, entries) => {
|
|
118
|
+
const merged = { ...(target ?? {}) };
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
if (!(entry.name in merged)) {
|
|
121
|
+
merged[entry.name] = entry.version || "latest";
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return merged;
|
|
125
|
+
};
|
|
126
|
+
if (dependencies.length > 0) {
|
|
127
|
+
pkg.dependencies = merge(pkg.dependencies, dependencies);
|
|
128
|
+
}
|
|
129
|
+
if (devDependencies.length > 0) {
|
|
130
|
+
pkg.devDependencies = merge(pkg.devDependencies, devDependencies);
|
|
131
|
+
}
|
|
132
|
+
await writeFileTree(projectPath, {
|
|
133
|
+
"package.json": JSON.stringify(pkg, null, 2) + "\n",
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=frontendPipeline.js.map
|
|
@@ -12,6 +12,8 @@ import type { ProjectConfiguration } from "../../types/projectConfiguration.type
|
|
|
12
12
|
export interface FullstackGenerationContext {
|
|
13
13
|
readonly project: ProjectConfiguration;
|
|
14
14
|
readonly projectPath: string;
|
|
15
|
+
/** `false` records frontend dependencies instead of installing them. */
|
|
16
|
+
readonly installDeps?: boolean;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* Fullstack generation result.
|
|
@@ -28,15 +30,14 @@ export declare class FullstackComposer {
|
|
|
28
30
|
private readonly frontendRegistry;
|
|
29
31
|
private readonly packageManagerRegistry;
|
|
30
32
|
private readonly dependencyResolver;
|
|
31
|
-
private readonly integrationGenerator;
|
|
32
33
|
constructor();
|
|
33
34
|
/**
|
|
34
35
|
* Generates a fullstack project.
|
|
35
36
|
*/
|
|
36
37
|
generate(context: FullstackGenerationContext): Promise<FullstackGenerationResult>;
|
|
38
|
+
private getPackageManager;
|
|
37
39
|
private createWorkspace;
|
|
38
40
|
private generateSharedPackages;
|
|
39
41
|
private generateFrontend;
|
|
40
|
-
private installDependencies;
|
|
41
42
|
}
|
|
42
43
|
//# sourceMappingURL=fullstackComposer.core.d.ts.map
|
|
@@ -5,12 +5,14 @@
|
|
|
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 {
|
|
15
|
+
import { renderPnpmWorkspaceFile } from "../../templates/shared/pnpm.template.js";
|
|
14
16
|
/**
|
|
15
17
|
* Composes fullstack projects by orchestrating multiple generators.
|
|
16
18
|
*/
|
|
@@ -18,12 +20,10 @@ export class FullstackComposer {
|
|
|
18
20
|
frontendRegistry;
|
|
19
21
|
packageManagerRegistry;
|
|
20
22
|
dependencyResolver;
|
|
21
|
-
integrationGenerator;
|
|
22
23
|
constructor() {
|
|
23
24
|
this.frontendRegistry = new FrontendAdapterRegistry();
|
|
24
25
|
this.packageManagerRegistry = new PackageManagerRegistry();
|
|
25
26
|
this.dependencyResolver = new DependencyResolver();
|
|
26
|
-
this.integrationGenerator = new IntegrationGenerator();
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* Generates a fullstack project.
|
|
@@ -34,7 +34,10 @@ export class FullstackComposer {
|
|
|
34
34
|
try {
|
|
35
35
|
// 1. Create workspace structure
|
|
36
36
|
await this.createWorkspace(context);
|
|
37
|
-
files.push("package.json"
|
|
37
|
+
files.push("package.json");
|
|
38
|
+
if (this.getPackageManager(context) === "pnpm") {
|
|
39
|
+
files.push("pnpm-workspace.yaml");
|
|
40
|
+
}
|
|
38
41
|
// 2. Generate shared packages
|
|
39
42
|
await this.generateSharedPackages(context);
|
|
40
43
|
files.push("packages/contracts/", "packages/shared-types/");
|
|
@@ -43,19 +46,8 @@ export class FullstackComposer {
|
|
|
43
46
|
const frontendFiles = await this.generateFrontend(context);
|
|
44
47
|
files.push(...frontendFiles);
|
|
45
48
|
}
|
|
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);
|
|
49
|
+
// Note: integration files and dependency installation are orchestrated
|
|
50
|
+
// by the create command to avoid running them twice.
|
|
59
51
|
}
|
|
60
52
|
catch (error) {
|
|
61
53
|
errors.push(error instanceof Error ? error.message : String(error));
|
|
@@ -66,29 +58,50 @@ export class FullstackComposer {
|
|
|
66
58
|
errors,
|
|
67
59
|
};
|
|
68
60
|
}
|
|
61
|
+
getPackageManager(context) {
|
|
62
|
+
return context.project.workspace?.packageManager ?? "pnpm";
|
|
63
|
+
}
|
|
69
64
|
async createWorkspace(context) {
|
|
65
|
+
const packageManager = this.getPackageManager(context);
|
|
66
|
+
const workspaceGlobs = ["apps/*", "packages/*"];
|
|
67
|
+
const scriptFor = (script) => {
|
|
68
|
+
switch (packageManager) {
|
|
69
|
+
case "npm":
|
|
70
|
+
return `npm run ${script} --workspaces --if-present`;
|
|
71
|
+
case "yarn":
|
|
72
|
+
return `yarn workspaces run ${script}`;
|
|
73
|
+
case "bun":
|
|
74
|
+
return `bun run --filter '*' ${script}`;
|
|
75
|
+
default:
|
|
76
|
+
return `pnpm -r --parallel run ${script}`;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
70
79
|
const rootPackageJson = {
|
|
71
80
|
name: context.project.name,
|
|
72
81
|
private: true,
|
|
82
|
+
...(packageManager === "pnpm" ? {} : { workspaces: workspaceGlobs }),
|
|
73
83
|
scripts: {
|
|
74
|
-
dev: "
|
|
75
|
-
build: "
|
|
76
|
-
test: "
|
|
77
|
-
lint: "
|
|
78
|
-
typecheck: "
|
|
84
|
+
dev: scriptFor("dev"),
|
|
85
|
+
build: scriptFor("build"),
|
|
86
|
+
test: scriptFor("test"),
|
|
87
|
+
lint: scriptFor("lint"),
|
|
88
|
+
typecheck: scriptFor("typecheck"),
|
|
79
89
|
},
|
|
80
90
|
devDependencies: {
|
|
81
91
|
typescript: "^5.0.0",
|
|
82
92
|
},
|
|
83
93
|
};
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
"package.json": JSON.stringify(rootPackageJson, null, 2),
|
|
90
|
-
|
|
91
|
-
|
|
94
|
+
// The project's type, architecture and frontend are recorded in
|
|
95
|
+
// .zudojs/manifest.json by the create command; no zudojs.config.ts is
|
|
96
|
+
// written. The name reaches package.json through JSON.stringify, so a
|
|
97
|
+
// quote or newline in it stays data.
|
|
98
|
+
const files = {
|
|
99
|
+
"package.json": JSON.stringify(rootPackageJson, null, 2) + "\n",
|
|
100
|
+
};
|
|
101
|
+
if (packageManager === "pnpm") {
|
|
102
|
+
files["pnpm-workspace.yaml"] = renderPnpmWorkspaceFile(workspaceGlobs);
|
|
103
|
+
}
|
|
104
|
+
await writeFileTree(context.projectPath, files);
|
|
92
105
|
}
|
|
93
106
|
async generateSharedPackages(context) {
|
|
94
107
|
const contractsIndex = `/**
|
|
@@ -127,32 +140,34 @@ export type Timestamp = string;
|
|
|
127
140
|
if (!adapter) {
|
|
128
141
|
throw new Error(`Unknown frontend framework: ${context.project.frontend.framework}`);
|
|
129
142
|
}
|
|
130
|
-
const frontendPath =
|
|
143
|
+
const frontendPath = join(context.projectPath, "apps", "web");
|
|
144
|
+
// Scaffolders spawn with cwd=frontendPath; the directory must exist
|
|
145
|
+
// before the child process starts or spawn fails with ENOENT.
|
|
146
|
+
await mkdir(frontendPath, { recursive: true });
|
|
131
147
|
const frontendContext = {
|
|
132
148
|
project: context.project,
|
|
133
149
|
projectPath: frontendPath,
|
|
134
150
|
framework: adapter.framework,
|
|
135
151
|
language: context.project.frontend.language ?? "typescript",
|
|
136
152
|
architecture: context.project.frontend.architecture,
|
|
137
|
-
packageManager: context
|
|
153
|
+
packageManager: this.getPackageManager(context),
|
|
138
154
|
features: {
|
|
139
155
|
testing: true,
|
|
140
156
|
linting: true,
|
|
141
157
|
formatting: true,
|
|
142
158
|
envValidation: true,
|
|
143
159
|
},
|
|
160
|
+
...(context.installDeps === false ? { skipInstall: true } : {}),
|
|
144
161
|
};
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const packageManager = this.packageManagerRegistry.get(pmName);
|
|
153
|
-
if (packageManager) {
|
|
154
|
-
await packageManager.install(context.projectPath);
|
|
162
|
+
// The same pipeline the frontend-only path uses: availability check,
|
|
163
|
+
// scaffold, structure, integration, dependency resolution + install, and
|
|
164
|
+
// adapter validation. Skipping any of it here is what let fullstack
|
|
165
|
+
// projects ship an unvalidated, dependency-less apps/web.
|
|
166
|
+
const outcome = await runFrontendPipeline(adapter, frontendContext, this.packageManagerRegistry, this.dependencyResolver);
|
|
167
|
+
if (outcome.errors.length > 0) {
|
|
168
|
+
throw new Error(`Frontend generation failed: ${outcome.errors.join("; ")}`);
|
|
155
169
|
}
|
|
170
|
+
return ["apps/web/"];
|
|
156
171
|
}
|
|
157
172
|
}
|
|
158
173
|
//# 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;
|
|
@@ -4,8 +4,15 @@
|
|
|
4
4
|
* Generates Docker, docker-compose, and database infrastructure files.
|
|
5
5
|
*/
|
|
6
6
|
import { writeFileTree } from "../../utils/utils.fileSystem.js";
|
|
7
|
+
import { CLIValidationError } from "../../errors/index.js";
|
|
8
|
+
const SERVICE_NAME_PATTERN = /^[a-zA-Z0-9_-]+$/;
|
|
7
9
|
export class InfrastructureGenerator {
|
|
8
10
|
async generate(options, basePath) {
|
|
11
|
+
for (const service of options.services ?? []) {
|
|
12
|
+
if (!SERVICE_NAME_PATTERN.test(service)) {
|
|
13
|
+
throw new CLIValidationError(`Invalid service name: "${service}". Service names must match ${SERVICE_NAME_PATTERN}.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
9
16
|
const files = this.getFiles(options);
|
|
10
17
|
await writeFileTree(basePath, files);
|
|
11
18
|
}
|
|
@@ -16,7 +23,7 @@ export class InfrastructureGenerator {
|
|
|
16
23
|
files[".dockerignore"] = "node_modules\ndist\n.git\n.env\n";
|
|
17
24
|
const services = options.services ?? ["gateway"];
|
|
18
25
|
for (const service of services) {
|
|
19
|
-
files[`apps/${service}/Dockerfile`] =
|
|
26
|
+
files[`apps/services/${service}/Dockerfile`] =
|
|
20
27
|
this.getServiceDockerfile(options);
|
|
21
28
|
}
|
|
22
29
|
}
|
|
@@ -28,13 +35,83 @@ export class InfrastructureGenerator {
|
|
|
28
35
|
files["migrations/.gitkeep"] = "";
|
|
29
36
|
return files;
|
|
30
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Install and build commands for Dockerfiles.
|
|
40
|
+
*
|
|
41
|
+
* Generated projects have no lockfile yet, so never use `npm ci` or
|
|
42
|
+
* `--frozen-lockfile`. pnpm and yarn need `corepack enable` on the bare
|
|
43
|
+
* node:24-alpine image; bun is not available there so it falls back to npm.
|
|
44
|
+
*/
|
|
45
|
+
getDockerCommands(options) {
|
|
46
|
+
switch (options.packageManager) {
|
|
47
|
+
case "pnpm":
|
|
48
|
+
return {
|
|
49
|
+
install: "corepack enable && pnpm install",
|
|
50
|
+
build: "pnpm run build",
|
|
51
|
+
};
|
|
52
|
+
case "yarn":
|
|
53
|
+
return {
|
|
54
|
+
install: "corepack enable && yarn install",
|
|
55
|
+
build: "yarn run build",
|
|
56
|
+
};
|
|
57
|
+
default:
|
|
58
|
+
return { install: "npm install", build: "npm run build" };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
getDatabaseCompose(options) {
|
|
62
|
+
if (options.database === "mysql") {
|
|
63
|
+
return {
|
|
64
|
+
image: "mysql:8",
|
|
65
|
+
port: 3306,
|
|
66
|
+
environment: [
|
|
67
|
+
"MYSQL_ROOT_PASSWORD=mysql",
|
|
68
|
+
`MYSQL_DATABASE=${options.projectName}`,
|
|
69
|
+
],
|
|
70
|
+
url: `mysql://root:mysql@db:3306/${options.projectName}`,
|
|
71
|
+
dataPath: "/var/lib/mysql",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (options.database === "sqlite") {
|
|
75
|
+
// SQLite is file-based: no database service at all.
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
image: "postgres:16-alpine",
|
|
80
|
+
port: 5432,
|
|
81
|
+
environment: [
|
|
82
|
+
"POSTGRES_USER=postgres",
|
|
83
|
+
"POSTGRES_PASSWORD=postgres",
|
|
84
|
+
`POSTGRES_DB=${options.projectName}`,
|
|
85
|
+
],
|
|
86
|
+
url: `postgresql://postgres:postgres@db:5432/${options.projectName}`,
|
|
87
|
+
dataPath: "/var/lib/postgresql/data",
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
getDatabaseUrl(options) {
|
|
91
|
+
const db = this.getDatabaseCompose(options);
|
|
92
|
+
return db ? db.url : "sqlite:./.data/app.db";
|
|
93
|
+
}
|
|
94
|
+
getDbServiceBlock(db) {
|
|
95
|
+
return ` db:
|
|
96
|
+
image: ${db.image}
|
|
97
|
+
ports:
|
|
98
|
+
- "${db.port}:${db.port}"
|
|
99
|
+
environment:
|
|
100
|
+
${db.environment.map((e) => ` - ${e}`).join("\n")}
|
|
101
|
+
volumes:
|
|
102
|
+
- db-data:${db.dataPath}
|
|
103
|
+
|
|
104
|
+
volumes:
|
|
105
|
+
db-data:
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
31
108
|
getAppDockerfile(options) {
|
|
109
|
+
const { install, build } = this.getDockerCommands(options);
|
|
32
110
|
return `FROM node:24-alpine AS builder
|
|
33
111
|
WORKDIR /app
|
|
34
|
-
COPY package.json pnpm-lock.yaml ./
|
|
35
|
-
RUN ${options.packageManager === "pnpm" ? "pnpm" : options.packageManager === "yarn" ? "yarn" : "npm"} install --frozen-lockfile
|
|
36
112
|
COPY . .
|
|
37
|
-
RUN ${
|
|
113
|
+
RUN ${install}
|
|
114
|
+
RUN ${build}
|
|
38
115
|
|
|
39
116
|
FROM node:24-alpine
|
|
40
117
|
WORKDIR /app
|
|
@@ -46,12 +123,12 @@ CMD ["node", "dist/server.js"]
|
|
|
46
123
|
`;
|
|
47
124
|
}
|
|
48
125
|
getServiceDockerfile(options) {
|
|
126
|
+
const { install, build } = this.getDockerCommands(options);
|
|
49
127
|
return `FROM node:24-alpine AS builder
|
|
50
128
|
WORKDIR /app
|
|
51
|
-
COPY package.json pnpm-lock.yaml ./
|
|
52
|
-
RUN ${options.packageManager === "pnpm" ? "pnpm" : options.packageManager === "yarn" ? "yarn" : "npm"} install --frozen-lockfile
|
|
53
129
|
COPY . .
|
|
54
|
-
RUN ${
|
|
130
|
+
RUN ${install}
|
|
131
|
+
RUN ${build}
|
|
55
132
|
|
|
56
133
|
FROM node:24-alpine
|
|
57
134
|
WORKDIR /app
|
|
@@ -63,79 +140,42 @@ CMD ["node", "dist/server.js"]
|
|
|
63
140
|
`;
|
|
64
141
|
}
|
|
65
142
|
getSimpleDockerCompose(options) {
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
? "mysql:8"
|
|
70
|
-
: "alpine:latest";
|
|
71
|
-
return `version: "3.8"
|
|
72
|
-
services:
|
|
143
|
+
const db = this.getDatabaseCompose(options);
|
|
144
|
+
const databaseUrl = this.getDatabaseUrl(options);
|
|
145
|
+
return `services:
|
|
73
146
|
app:
|
|
74
147
|
build: .
|
|
75
148
|
ports:
|
|
76
149
|
- "3000:3000"
|
|
77
150
|
environment:
|
|
78
|
-
- DATABASE_URL
|
|
79
|
-
depends_on:
|
|
80
|
-
- db
|
|
81
|
-
develop:
|
|
151
|
+
- DATABASE_URL=${databaseUrl}
|
|
152
|
+
${db ? " depends_on:\n - db\n" : ""} develop:
|
|
82
153
|
watch:
|
|
83
154
|
- path: src/
|
|
84
155
|
action: sync
|
|
85
156
|
target: /app/src
|
|
86
|
-
|
|
87
|
-
db:
|
|
88
|
-
image: ${dbImage}
|
|
89
|
-
ports:
|
|
90
|
-
- "5432:5432"
|
|
91
|
-
environment:
|
|
92
|
-
- POSTGRES_USER=postgres
|
|
93
|
-
- POSTGRES_PASSWORD=postgres
|
|
94
|
-
- POSTGRES_DB=${options.projectName}
|
|
95
|
-
volumes:
|
|
96
|
-
- db-data:/var/lib/postgresql/data
|
|
97
|
-
|
|
98
|
-
volumes:
|
|
99
|
-
db-data:
|
|
100
|
-
`;
|
|
157
|
+
${db ? `\n${this.getDbServiceBlock(db)}` : ""}`;
|
|
101
158
|
}
|
|
102
159
|
getDockerCompose(options) {
|
|
103
160
|
const services = options.services ?? ["gateway"];
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
: options.database === "mysql"
|
|
107
|
-
? "mysql:8"
|
|
108
|
-
: "alpine:latest";
|
|
161
|
+
const db = this.getDatabaseCompose(options);
|
|
162
|
+
const databaseUrl = this.getDatabaseUrl(options);
|
|
109
163
|
let serviceDefs = "";
|
|
110
|
-
for (
|
|
164
|
+
for (let i = 0; i < services.length; i++) {
|
|
165
|
+
const service = services[i];
|
|
166
|
+
const port = 3001 + i;
|
|
111
167
|
serviceDefs += `
|
|
112
168
|
${service}:
|
|
113
169
|
build:
|
|
114
|
-
context: apps/${service}
|
|
170
|
+
context: apps/services/${service}
|
|
115
171
|
ports:
|
|
116
|
-
- "
|
|
172
|
+
- "${port}:${port}"
|
|
117
173
|
environment:
|
|
118
|
-
-
|
|
119
|
-
|
|
120
|
-
- db
|
|
121
|
-
`;
|
|
174
|
+
- PORT=${port}
|
|
175
|
+
- DATABASE_URL=${databaseUrl}
|
|
176
|
+
${db ? " depends_on:\n - db\n" : ""}`;
|
|
122
177
|
}
|
|
123
|
-
return `
|
|
124
|
-
services:${serviceDefs}
|
|
125
|
-
db:
|
|
126
|
-
image: ${dbImage}
|
|
127
|
-
ports:
|
|
128
|
-
- "5432:5432"
|
|
129
|
-
environment:
|
|
130
|
-
- POSTGRES_USER=postgres
|
|
131
|
-
- POSTGRES_PASSWORD=postgres
|
|
132
|
-
- POSTGRES_DB=${options.projectName}
|
|
133
|
-
volumes:
|
|
134
|
-
- db-data:/var/lib/postgresql/data
|
|
135
|
-
|
|
136
|
-
volumes:
|
|
137
|
-
db-data:
|
|
138
|
-
`;
|
|
178
|
+
return `services:${serviceDefs}${db ? `\n${this.getDbServiceBlock(db)}` : ""}`;
|
|
139
179
|
}
|
|
140
180
|
}
|
|
141
181
|
//# sourceMappingURL=infrastructure.generator.js.map
|
|
@@ -22,6 +22,12 @@ export declare class IntegrationGenerator {
|
|
|
22
22
|
*/
|
|
23
23
|
generate(context: IntegrationContext): Promise<void>;
|
|
24
24
|
private generateEnvFile;
|
|
25
|
+
/**
|
|
26
|
+
* Path prefix (relative to projectPath) of the backend application.
|
|
27
|
+
*
|
|
28
|
+
* Ends with a "/" when non-empty so it can be prefixed directly.
|
|
29
|
+
*/
|
|
30
|
+
private getBackendPath;
|
|
25
31
|
private generateApiClient;
|
|
26
32
|
private getApiClientPath;
|
|
27
33
|
private generateCorsConfig;
|