@friggframework/devtools 2.0.0-next.7 → 2.0.0-next.70

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.
Files changed (240) hide show
  1. package/frigg-cli/README.md +1289 -0
  2. package/frigg-cli/__tests__/unit/commands/build.test.js +279 -0
  3. package/frigg-cli/__tests__/unit/commands/db-setup.test.js +649 -0
  4. package/frigg-cli/__tests__/unit/commands/deploy.test.js +320 -0
  5. package/frigg-cli/__tests__/unit/commands/doctor.test.js +309 -0
  6. package/frigg-cli/__tests__/unit/commands/install.test.js +400 -0
  7. package/frigg-cli/__tests__/unit/commands/ui.test.js +346 -0
  8. package/frigg-cli/__tests__/unit/dependencies.test.js +74 -0
  9. package/frigg-cli/__tests__/unit/utils/database-validator.test.js +397 -0
  10. package/frigg-cli/__tests__/unit/utils/error-messages.test.js +345 -0
  11. package/frigg-cli/__tests__/unit/version-detection.test.js +171 -0
  12. package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
  13. package/frigg-cli/__tests__/utils/prisma-mock.js +194 -0
  14. package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
  15. package/frigg-cli/__tests__/utils/test-setup.js +287 -0
  16. package/frigg-cli/auth-command/CLAUDE.md +293 -0
  17. package/frigg-cli/auth-command/README.md +450 -0
  18. package/frigg-cli/auth-command/api-key-flow.js +153 -0
  19. package/frigg-cli/auth-command/auth-tester.js +344 -0
  20. package/frigg-cli/auth-command/credential-storage.js +182 -0
  21. package/frigg-cli/auth-command/index.js +256 -0
  22. package/frigg-cli/auth-command/json-schema-form.js +67 -0
  23. package/frigg-cli/auth-command/module-loader.js +172 -0
  24. package/frigg-cli/auth-command/oauth-callback-server.js +431 -0
  25. package/frigg-cli/auth-command/oauth-flow.js +195 -0
  26. package/frigg-cli/auth-command/utils/browser.js +30 -0
  27. package/frigg-cli/build-command/index.js +45 -12
  28. package/frigg-cli/db-setup-command/index.js +246 -0
  29. package/frigg-cli/deploy-command/SPEC-DEPLOY-DRY-RUN.md +981 -0
  30. package/frigg-cli/deploy-command/index.js +295 -23
  31. package/frigg-cli/doctor-command/index.js +335 -0
  32. package/frigg-cli/generate-command/__tests__/generate-command.test.js +301 -0
  33. package/frigg-cli/generate-command/azure-generator.js +43 -0
  34. package/frigg-cli/generate-command/gcp-generator.js +47 -0
  35. package/frigg-cli/generate-command/index.js +332 -0
  36. package/frigg-cli/generate-command/terraform-generator.js +555 -0
  37. package/frigg-cli/generate-iam-command.js +118 -0
  38. package/frigg-cli/index.js +174 -1
  39. package/frigg-cli/index.test.js +1 -4
  40. package/frigg-cli/init-command/backend-first-handler.js +756 -0
  41. package/frigg-cli/init-command/index.js +93 -0
  42. package/frigg-cli/init-command/template-handler.js +143 -0
  43. package/frigg-cli/install-command/index.js +1 -4
  44. package/frigg-cli/jest.config.js +124 -0
  45. package/frigg-cli/package.json +63 -0
  46. package/frigg-cli/repair-command/index.js +564 -0
  47. package/frigg-cli/start-command/index.js +118 -5
  48. package/frigg-cli/start-command/start-command.test.js +297 -0
  49. package/frigg-cli/test/init-command.test.js +180 -0
  50. package/frigg-cli/test/npm-registry.test.js +319 -0
  51. package/frigg-cli/ui-command/index.js +154 -0
  52. package/frigg-cli/utils/app-resolver.js +319 -0
  53. package/frigg-cli/utils/backend-path.js +16 -17
  54. package/frigg-cli/utils/database-validator.js +167 -0
  55. package/frigg-cli/utils/error-messages.js +329 -0
  56. package/frigg-cli/utils/npm-registry.js +167 -0
  57. package/frigg-cli/utils/process-manager.js +199 -0
  58. package/frigg-cli/utils/repo-detection.js +405 -0
  59. package/infrastructure/ARCHITECTURE.md +487 -0
  60. package/infrastructure/CLAUDE.md +481 -0
  61. package/infrastructure/HEALTH.md +468 -0
  62. package/infrastructure/README.md +522 -0
  63. package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
  64. package/infrastructure/__tests__/helpers/test-utils.js +277 -0
  65. package/infrastructure/__tests__/postgres-config.test.js +914 -0
  66. package/infrastructure/__tests__/template-generation.test.js +687 -0
  67. package/infrastructure/create-frigg-infrastructure.js +129 -20
  68. package/infrastructure/docs/POSTGRES-CONFIGURATION.md +630 -0
  69. package/infrastructure/docs/PRE-DEPLOYMENT-HEALTH-CHECK-SPEC.md +1317 -0
  70. package/infrastructure/docs/WEBSOCKET-CONFIGURATION.md +105 -0
  71. package/infrastructure/docs/deployment-instructions.md +268 -0
  72. package/infrastructure/docs/generate-iam-command.md +278 -0
  73. package/infrastructure/docs/iam-policy-templates.md +193 -0
  74. package/infrastructure/domains/database/aurora-builder.js +809 -0
  75. package/infrastructure/domains/database/aurora-builder.test.js +950 -0
  76. package/infrastructure/domains/database/aurora-discovery.js +87 -0
  77. package/infrastructure/domains/database/aurora-discovery.test.js +188 -0
  78. package/infrastructure/domains/database/aurora-resolver.js +210 -0
  79. package/infrastructure/domains/database/aurora-resolver.test.js +347 -0
  80. package/infrastructure/domains/database/migration-builder.js +701 -0
  81. package/infrastructure/domains/database/migration-builder.test.js +321 -0
  82. package/infrastructure/domains/database/migration-resolver.js +163 -0
  83. package/infrastructure/domains/database/migration-resolver.test.js +337 -0
  84. package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +164 -0
  85. package/infrastructure/domains/health/application/ports/IResourceDetector.js +129 -0
  86. package/infrastructure/domains/health/application/ports/IResourceImporter.js +142 -0
  87. package/infrastructure/domains/health/application/ports/IStackRepository.js +131 -0
  88. package/infrastructure/domains/health/application/ports/index.js +26 -0
  89. package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +679 -0
  90. package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +167 -0
  91. package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +1130 -0
  92. package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +221 -0
  93. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +152 -0
  94. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +343 -0
  95. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +535 -0
  96. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +376 -0
  97. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +213 -0
  98. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +441 -0
  99. package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +267 -0
  100. package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +324 -0
  101. package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +386 -0
  102. package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +1419 -0
  103. package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +391 -0
  104. package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +551 -0
  105. package/infrastructure/domains/health/domain/entities/issue.js +299 -0
  106. package/infrastructure/domains/health/domain/entities/issue.test.js +528 -0
  107. package/infrastructure/domains/health/domain/entities/property-mismatch.js +108 -0
  108. package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +275 -0
  109. package/infrastructure/domains/health/domain/entities/resource.js +159 -0
  110. package/infrastructure/domains/health/domain/entities/resource.test.js +432 -0
  111. package/infrastructure/domains/health/domain/entities/stack-health-report.js +306 -0
  112. package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +601 -0
  113. package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +380 -0
  114. package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +971 -0
  115. package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +1150 -0
  116. package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +672 -0
  117. package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +496 -0
  118. package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +419 -0
  119. package/infrastructure/domains/health/domain/services/health-score-calculator.js +248 -0
  120. package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +504 -0
  121. package/infrastructure/domains/health/domain/services/import-progress-monitor.js +195 -0
  122. package/infrastructure/domains/health/domain/services/import-template-generator.js +435 -0
  123. package/infrastructure/domains/health/domain/services/logical-id-mapper.js +345 -0
  124. package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +234 -0
  125. package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +431 -0
  126. package/infrastructure/domains/health/domain/services/property-mutability-config.js +382 -0
  127. package/infrastructure/domains/health/domain/services/template-parser.js +245 -0
  128. package/infrastructure/domains/health/domain/services/update-progress-monitor.js +192 -0
  129. package/infrastructure/domains/health/domain/value-objects/health-score.js +138 -0
  130. package/infrastructure/domains/health/domain/value-objects/health-score.test.js +267 -0
  131. package/infrastructure/domains/health/domain/value-objects/property-mutability.js +161 -0
  132. package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +198 -0
  133. package/infrastructure/domains/health/domain/value-objects/resource-state.js +167 -0
  134. package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +196 -0
  135. package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +192 -0
  136. package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +262 -0
  137. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +312 -0
  138. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +367 -0
  139. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +432 -0
  140. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +784 -0
  141. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +1133 -0
  142. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +565 -0
  143. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +554 -0
  144. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +318 -0
  145. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +398 -0
  146. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +777 -0
  147. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +580 -0
  148. package/infrastructure/domains/integration/integration-builder.js +404 -0
  149. package/infrastructure/domains/integration/integration-builder.test.js +690 -0
  150. package/infrastructure/domains/integration/integration-resolver.js +170 -0
  151. package/infrastructure/domains/integration/integration-resolver.test.js +369 -0
  152. package/infrastructure/domains/integration/websocket-builder.js +69 -0
  153. package/infrastructure/domains/integration/websocket-builder.test.js +195 -0
  154. package/infrastructure/domains/networking/vpc-builder.js +2051 -0
  155. package/infrastructure/domains/networking/vpc-builder.test.js +1960 -0
  156. package/infrastructure/domains/networking/vpc-discovery.js +177 -0
  157. package/infrastructure/domains/networking/vpc-discovery.test.js +350 -0
  158. package/infrastructure/domains/networking/vpc-resolver.js +505 -0
  159. package/infrastructure/domains/networking/vpc-resolver.test.js +801 -0
  160. package/infrastructure/domains/parameters/ssm-builder.js +79 -0
  161. package/infrastructure/domains/parameters/ssm-builder.test.js +189 -0
  162. package/infrastructure/domains/parameters/ssm-discovery.js +84 -0
  163. package/infrastructure/domains/parameters/ssm-discovery.test.js +210 -0
  164. package/infrastructure/domains/scheduler/scheduler-builder.js +211 -0
  165. package/infrastructure/domains/security/iam-generator.js +816 -0
  166. package/infrastructure/domains/security/iam-generator.test.js +204 -0
  167. package/infrastructure/domains/security/kms-builder.js +415 -0
  168. package/infrastructure/domains/security/kms-builder.test.js +392 -0
  169. package/infrastructure/domains/security/kms-discovery.js +80 -0
  170. package/infrastructure/domains/security/kms-discovery.test.js +177 -0
  171. package/infrastructure/domains/security/kms-resolver.js +96 -0
  172. package/infrastructure/domains/security/kms-resolver.test.js +216 -0
  173. package/infrastructure/domains/security/templates/frigg-deployment-iam-stack.yaml +401 -0
  174. package/infrastructure/domains/security/templates/iam-policy-basic.json +218 -0
  175. package/infrastructure/domains/security/templates/iam-policy-full.json +288 -0
  176. package/infrastructure/domains/shared/base-builder.js +112 -0
  177. package/infrastructure/domains/shared/base-resolver.js +186 -0
  178. package/infrastructure/domains/shared/base-resolver.test.js +305 -0
  179. package/infrastructure/domains/shared/builder-orchestrator.js +212 -0
  180. package/infrastructure/domains/shared/builder-orchestrator.test.js +213 -0
  181. package/infrastructure/domains/shared/cloudformation-discovery-v2.js +334 -0
  182. package/infrastructure/domains/shared/cloudformation-discovery.js +672 -0
  183. package/infrastructure/domains/shared/cloudformation-discovery.test.js +985 -0
  184. package/infrastructure/domains/shared/environment-builder.js +119 -0
  185. package/infrastructure/domains/shared/environment-builder.test.js +247 -0
  186. package/infrastructure/domains/shared/providers/aws-provider-adapter.js +579 -0
  187. package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +416 -0
  188. package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +93 -0
  189. package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +136 -0
  190. package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +82 -0
  191. package/infrastructure/domains/shared/providers/provider-factory.js +108 -0
  192. package/infrastructure/domains/shared/providers/provider-factory.test.js +170 -0
  193. package/infrastructure/domains/shared/resource-discovery.enhanced.test.js +306 -0
  194. package/infrastructure/domains/shared/resource-discovery.js +233 -0
  195. package/infrastructure/domains/shared/resource-discovery.test.js +588 -0
  196. package/infrastructure/domains/shared/types/app-definition.js +205 -0
  197. package/infrastructure/domains/shared/types/discovery-result.js +106 -0
  198. package/infrastructure/domains/shared/types/discovery-result.test.js +258 -0
  199. package/infrastructure/domains/shared/types/index.js +46 -0
  200. package/infrastructure/domains/shared/types/resource-ownership.js +108 -0
  201. package/infrastructure/domains/shared/types/resource-ownership.test.js +101 -0
  202. package/infrastructure/domains/shared/utilities/base-definition-factory.js +408 -0
  203. package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +338 -0
  204. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +291 -0
  205. package/infrastructure/domains/shared/utilities/handler-path-resolver.js +134 -0
  206. package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +268 -0
  207. package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +159 -0
  208. package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +444 -0
  209. package/infrastructure/domains/shared/validation/env-validator.js +78 -0
  210. package/infrastructure/domains/shared/validation/env-validator.test.js +173 -0
  211. package/infrastructure/domains/shared/validation/plugin-validator.js +187 -0
  212. package/infrastructure/domains/shared/validation/plugin-validator.test.js +323 -0
  213. package/infrastructure/esbuild.config.js +53 -0
  214. package/infrastructure/infrastructure-composer.js +119 -0
  215. package/infrastructure/infrastructure-composer.test.js +1895 -0
  216. package/infrastructure/integration.test.js +383 -0
  217. package/infrastructure/scripts/build-prisma-layer.js +701 -0
  218. package/infrastructure/scripts/build-prisma-layer.test.js +170 -0
  219. package/infrastructure/scripts/build-time-discovery.js +238 -0
  220. package/infrastructure/scripts/build-time-discovery.test.js +379 -0
  221. package/infrastructure/scripts/run-discovery.js +110 -0
  222. package/infrastructure/scripts/verify-prisma-layer.js +72 -0
  223. package/management-ui/README.md +203 -0
  224. package/package.json +44 -14
  225. package/test/index.js +2 -4
  226. package/test/mock-api.js +1 -3
  227. package/test/mock-integration.js +4 -14
  228. package/.eslintrc.json +0 -3
  229. package/CHANGELOG.md +0 -132
  230. package/infrastructure/app-handler-helpers.js +0 -57
  231. package/infrastructure/backend-utils.js +0 -87
  232. package/infrastructure/routers/auth.js +0 -26
  233. package/infrastructure/routers/integration-defined-routers.js +0 -42
  234. package/infrastructure/routers/middleware/loadUser.js +0 -15
  235. package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
  236. package/infrastructure/routers/user.js +0 -41
  237. package/infrastructure/routers/websocket.js +0 -55
  238. package/infrastructure/serverless-template.js +0 -291
  239. package/infrastructure/workers/integration-defined-workers.js +0 -24
  240. package/test/auther-definition-tester.js +0 -125
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Copyright (c) 2024 Frigg Integration Framework
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ const path = require('path');
11
+ const chalk = require('chalk');
12
+ const validateProjectName = require('validate-npm-package-name');
13
+ const semver = require('semver');
14
+ const BackendFirstHandler = require('./backend-first-handler');
15
+
16
+ function checkAppName(appName) {
17
+ const validationResult = validateProjectName(appName);
18
+ if (!validationResult.validForNewPackages) {
19
+ console.error(
20
+ chalk.red(
21
+ `Cannot create a project named ${chalk.green(
22
+ `"${appName}"`
23
+ )} because of npm naming restrictions:\n`
24
+ )
25
+ );
26
+ [
27
+ ...(validationResult.errors || []),
28
+ ...(validationResult.warnings || []),
29
+ ].forEach(error => {
30
+ console.error(chalk.red(` * ${error}`));
31
+ });
32
+ console.error(chalk.red('\nPlease choose a different project name.'));
33
+ process.exit(1);
34
+ }
35
+ }
36
+
37
+ function checkNodeVersion() {
38
+ const unsupportedNodeVersion = !semver.satisfies(
39
+ semver.coerce(process.version),
40
+ '>=14'
41
+ );
42
+
43
+ if (unsupportedNodeVersion) {
44
+ console.log(
45
+ chalk.yellow(
46
+ `You are using Node ${process.version} so the project will be bootstrapped with an old unsupported version of tools.\n\n` +
47
+ `Please update to Node 14 or higher for a better, fully supported experience.\n`
48
+ )
49
+ );
50
+ }
51
+ }
52
+
53
+ async function initCommand(projectName, options) {
54
+ const verbose = options.verbose || false;
55
+ const force = options.force || false;
56
+
57
+ checkNodeVersion();
58
+
59
+ const root = path.resolve(projectName);
60
+ const appName = path.basename(root);
61
+
62
+ checkAppName(appName);
63
+
64
+ // Use backend-first handler by default
65
+ if (!options.template && !options.legacyFrontend) {
66
+ try {
67
+ const handler = new BackendFirstHandler(root, {
68
+ force,
69
+ verbose,
70
+ mode: options.mode,
71
+ frontend: options.frontend
72
+ });
73
+
74
+ await handler.initialize();
75
+ return;
76
+ } catch (error) {
77
+ console.log();
78
+ console.log(chalk.red('Aborting installation.'));
79
+ console.log(chalk.red('Error:'), error.message);
80
+ console.log();
81
+ process.exit(1);
82
+ }
83
+ }
84
+
85
+ // If we get here, show an error for legacy options
86
+ console.log();
87
+ console.log(chalk.red('Legacy template system is no longer supported.'));
88
+ console.log(chalk.yellow('Please use the new backend-first approach.'));
89
+ console.log();
90
+ process.exit(1);
91
+ }
92
+
93
+ module.exports = { initCommand };
@@ -0,0 +1,143 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('path');
3
+ const { execSync } = require('child_process');
4
+
5
+ /**
6
+ * Handles template initialization for the frigg init command
7
+ */
8
+ class TemplateHandler {
9
+ constructor(targetPath, options = {}) {
10
+ this.targetPath = targetPath;
11
+ this.options = options;
12
+ this.templatesDir = path.join(__dirname, '..', 'templates');
13
+ }
14
+
15
+ /**
16
+ * Initialize a new Frigg backend project from template
17
+ */
18
+ async initializeBackendTemplate() {
19
+ const templatePath = path.join(this.templatesDir, 'backend');
20
+
21
+ if (!fs.existsSync(templatePath)) {
22
+ throw new Error('Backend template not found. Please ensure the CLI is properly installed.');
23
+ }
24
+
25
+ // Create target directory if it doesn't exist
26
+ await fs.ensureDir(this.targetPath);
27
+
28
+ // Check if directory is empty
29
+ const files = await fs.readdir(this.targetPath);
30
+ if (files.length > 0 && !this.options.force) {
31
+ throw new Error('Target directory is not empty. Use --force to override.');
32
+ }
33
+
34
+ console.log('🚀 Initializing new Frigg backend project...');
35
+
36
+ // Copy template files
37
+ await this.copyTemplateFiles(templatePath, this.targetPath);
38
+
39
+ // Update package.json with project name
40
+ await this.updatePackageJson();
41
+
42
+ // Update serverless.yml with project name
43
+ await this.updateServerlessConfig();
44
+
45
+ // Initialize git if requested
46
+ if (this.options.git !== false) {
47
+ await this.initializeGit();
48
+ }
49
+
50
+ // Install dependencies if requested
51
+ if (this.options.install !== false) {
52
+ await this.installDependencies();
53
+ }
54
+
55
+ console.log('✅ Frigg backend project initialized successfully!');
56
+ console.log('\nNext steps:');
57
+ console.log(` cd ${path.basename(this.targetPath)}`);
58
+ if (this.options.install === false) {
59
+ console.log(' npm install');
60
+ }
61
+ console.log(' npm run docker:start');
62
+ console.log(' npm run backend-start');
63
+ console.log('\nFor more information, check the README.md file.');
64
+ }
65
+
66
+ /**
67
+ * Copy template files to target directory
68
+ */
69
+ async copyTemplateFiles(source, target) {
70
+ await fs.copy(source, target, {
71
+ overwrite: this.options.force || false,
72
+ filter: (src) => {
73
+ // Skip node_modules and other build artifacts
74
+ const basename = path.basename(src);
75
+ return !['node_modules', '.serverless', 'dist', 'build'].includes(basename);
76
+ }
77
+ });
78
+ }
79
+
80
+ /**
81
+ * Update package.json with project-specific details
82
+ */
83
+ async updatePackageJson() {
84
+ const packageJsonPath = path.join(this.targetPath, 'package.json');
85
+ const packageJson = await fs.readJson(packageJsonPath);
86
+
87
+ // Update package name based on directory name
88
+ const projectName = path.basename(this.targetPath);
89
+ packageJson.name = projectName;
90
+
91
+ // Remove private flag for new projects
92
+ delete packageJson.private;
93
+
94
+ await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
95
+ }
96
+
97
+ /**
98
+ * Update serverless.yml with project-specific details
99
+ */
100
+ async updateServerlessConfig() {
101
+ const serverlessPath = path.join(this.targetPath, 'serverless.yml');
102
+ let serverlessContent = await fs.readFile(serverlessPath, 'utf8');
103
+
104
+ // Update service name based on directory name
105
+ const projectName = path.basename(this.targetPath);
106
+ serverlessContent = serverlessContent.replace(
107
+ /^service: create-frigg-app$/m,
108
+ `service: ${projectName}`
109
+ );
110
+
111
+ await fs.writeFile(serverlessPath, serverlessContent);
112
+ }
113
+
114
+ /**
115
+ * Initialize git repository
116
+ */
117
+ async initializeGit() {
118
+ try {
119
+ console.log('📦 Initializing git repository...');
120
+ execSync('git init', { cwd: this.targetPath, stdio: 'ignore' });
121
+ execSync('git add .', { cwd: this.targetPath, stdio: 'ignore' });
122
+ execSync('git commit -m "Initial commit from Frigg CLI"', {
123
+ cwd: this.targetPath,
124
+ stdio: 'ignore'
125
+ });
126
+ } catch (error) {
127
+ console.warn('⚠️ Git initialization failed. You can initialize git manually later.');
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Install npm dependencies
133
+ */
134
+ async installDependencies() {
135
+ console.log('📦 Installing dependencies...');
136
+ execSync('npm install', {
137
+ cwd: this.targetPath,
138
+ stdio: 'inherit'
139
+ });
140
+ }
141
+ }
142
+
143
+ module.exports = TemplateHandler;
@@ -4,15 +4,12 @@ const { resolve } = require('node:path');
4
4
  const { updateBackendJsFile } = require('./backend-js');
5
5
  const { logInfo, logError } = require('./logger');
6
6
  const { commitChanges } = require('./commit-changes');
7
- const {
8
- findNearestBackendPackageJson,
9
- validateBackendPath,
10
- } = require('../utils/backend-path');
11
7
  const { handleEnvVariables } = require('./environment-variables');
12
8
  const {
13
9
  validatePackageExists,
14
10
  searchAndSelectPackage,
15
11
  } = require('./validate-package');
12
+ const { findNearestBackendPackageJson, validateBackendPath } = require('@friggframework/core/utils');
16
13
 
17
14
  const installCommand = async (apiModuleName) => {
18
15
  try {
@@ -0,0 +1,124 @@
1
+ module.exports = {
2
+ displayName: 'Frigg CLI Tests',
3
+ testMatch: [
4
+ '<rootDir>/__tests__/**/*.test.js',
5
+ '<rootDir>/__tests__/**/*.spec.js',
6
+ '<rootDir>/**/start-command.test.js',
7
+ '<rootDir>/**/__tests__/**/*.test.js'
8
+ ],
9
+ // Exclude utility files and config from being treated as tests
10
+ testPathIgnorePatterns: [
11
+ '/node_modules/',
12
+ '/__tests__/utils/',
13
+ '/__tests__/jest.config.js',
14
+ '/test-setup.js'
15
+ ],
16
+ testEnvironment: 'node',
17
+ collectCoverageFrom: [
18
+ '**/*.js',
19
+ '!**/*.test.js',
20
+ '!**/*.spec.js',
21
+ '!**/node_modules/**',
22
+ '!**/__tests__/**',
23
+ '!**/coverage/**'
24
+ ],
25
+ coverageDirectory: 'coverage',
26
+ coverageReporters: [
27
+ 'text',
28
+ 'text-summary',
29
+ 'html',
30
+ 'lcov',
31
+ 'json'
32
+ ],
33
+ coverageThreshold: {
34
+ global: {
35
+ branches: 85,
36
+ functions: 85,
37
+ lines: 85,
38
+ statements: 85
39
+ },
40
+ './install-command/index.js': {
41
+ branches: 90,
42
+ functions: 90,
43
+ lines: 90,
44
+ statements: 90
45
+ },
46
+ './build-command/index.js': {
47
+ branches: 90,
48
+ functions: 90,
49
+ lines: 90,
50
+ statements: 90
51
+ },
52
+ './deploy-command/index.js': {
53
+ branches: 90,
54
+ functions: 90,
55
+ lines: 90,
56
+ statements: 90
57
+ },
58
+ './ui-command/index.js': {
59
+ branches: 90,
60
+ functions: 90,
61
+ lines: 90,
62
+ statements: 90
63
+ },
64
+ './generate-command/index.js': {
65
+ branches: 90,
66
+ functions: 90,
67
+ lines: 90,
68
+ statements: 90
69
+ },
70
+ './db-setup-command/index.js': {
71
+ branches: 90,
72
+ functions: 90,
73
+ lines: 90,
74
+ statements: 90
75
+ },
76
+ './utils/database-validator.js': {
77
+ branches: 85,
78
+ functions: 85,
79
+ lines: 85,
80
+ statements: 85
81
+ },
82
+ './utils/prisma-runner.js': {
83
+ branches: 85,
84
+ functions: 85,
85
+ lines: 85,
86
+ statements: 85
87
+ },
88
+ './utils/error-messages.js': {
89
+ branches: 85,
90
+ functions: 85,
91
+ lines: 85,
92
+ statements: 85
93
+ }
94
+ },
95
+ setupFilesAfterEnv: [
96
+ '<rootDir>/__tests__/utils/test-setup.js'
97
+ ],
98
+ testTimeout: 10000,
99
+ maxWorkers: '50%',
100
+ verbose: true,
101
+ collectCoverage: true,
102
+ coveragePathIgnorePatterns: [
103
+ '/node_modules/',
104
+ '/__tests__/',
105
+ '/coverage/',
106
+ '.test.js',
107
+ '.spec.js'
108
+ ],
109
+ moduleFileExtensions: [
110
+ 'js',
111
+ 'json',
112
+ 'node'
113
+ ],
114
+ transform: {},
115
+ // testResultsProcessor: 'jest-sonar-reporter', // Optional dependency
116
+ reporters: [
117
+ 'default'
118
+ // jest-junit reporter removed - optional dependency
119
+ ],
120
+ watchman: false,
121
+ forceExit: true,
122
+ detectOpenHandles: true,
123
+ errorOnDeprecated: true
124
+ };
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@friggframework/frigg-cli",
3
+ "version": "2.0.0-next.0",
4
+ "description": "Frigg Framework CLI tool",
5
+ "main": "index.js",
6
+ "bin": {
7
+ "frigg": "./index.js"
8
+ },
9
+ "scripts": {
10
+ "test": "jest"
11
+ },
12
+ "dependencies": {
13
+ "@aws-sdk/client-cloudformation": "^3.705.0",
14
+ "@babel/parser": "^7.25.3",
15
+ "@babel/traverse": "^7.25.3",
16
+ "@friggframework/core": "^2.0.0-next.0",
17
+ "@friggframework/schemas": "^2.0.0-next.0",
18
+ "@inquirer/prompts": "^5.3.8",
19
+ "axios": "^1.7.2",
20
+ "chalk": "^4.1.2",
21
+ "commander": "^12.1.0",
22
+ "cross-spawn": "^7.0.3",
23
+ "dotenv": "^16.4.5",
24
+ "fs-extra": "^11.2.0",
25
+ "js-yaml": "^4.1.0",
26
+ "lodash": "4.17.21",
27
+ "node-cache": "^5.1.2",
28
+ "open": "^8.4.2",
29
+ "osls": "^3.40.1",
30
+ "semver": "^7.6.0",
31
+ "validate-npm-package-name": "^5.0.0"
32
+ },
33
+ "peerDependencies": {
34
+ "@friggframework/devtools": "*"
35
+ },
36
+ "devDependencies": {
37
+ "@friggframework/devtools": "^2.0.0-next.0",
38
+ "jest": "^29.7.0",
39
+ "jest-mock-extended": "^3.0.5"
40
+ },
41
+ "keywords": [
42
+ "frigg",
43
+ "cli",
44
+ "integration",
45
+ "framework"
46
+ ],
47
+ "author": "Frigg Framework Team",
48
+ "license": "MIT",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/friggframework/frigg.git"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/friggframework/frigg/issues"
55
+ },
56
+ "homepage": "https://github.com/friggframework/frigg#readme",
57
+ "engines": {
58
+ "node": ">=18"
59
+ },
60
+ "publishConfig": {
61
+ "access": "public"
62
+ }
63
+ }