vonosan-cli 0.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.
Files changed (121) hide show
  1. package/dist/__tests__/env-parity.pbt.test.d.ts +15 -0
  2. package/dist/__tests__/env-parity.pbt.test.d.ts.map +1 -0
  3. package/dist/__tests__/env-parity.pbt.test.js +125 -0
  4. package/dist/__tests__/env-parity.pbt.test.js.map +1 -0
  5. package/dist/__tests__/module-generator.pbt.test.d.ts +15 -0
  6. package/dist/__tests__/module-generator.pbt.test.d.ts.map +1 -0
  7. package/dist/__tests__/module-generator.pbt.test.js +130 -0
  8. package/dist/__tests__/module-generator.pbt.test.js.map +1 -0
  9. package/dist/commands/add.d.ts +21 -0
  10. package/dist/commands/add.d.ts.map +1 -0
  11. package/dist/commands/add.js +128 -0
  12. package/dist/commands/add.js.map +1 -0
  13. package/dist/commands/audit.d.ts +18 -0
  14. package/dist/commands/audit.d.ts.map +1 -0
  15. package/dist/commands/audit.js +73 -0
  16. package/dist/commands/audit.js.map +1 -0
  17. package/dist/commands/branch-finish.d.ts +19 -0
  18. package/dist/commands/branch-finish.d.ts.map +1 -0
  19. package/dist/commands/branch-finish.js +80 -0
  20. package/dist/commands/branch-finish.js.map +1 -0
  21. package/dist/commands/branch-new.d.ts +17 -0
  22. package/dist/commands/branch-new.d.ts.map +1 -0
  23. package/dist/commands/branch-new.js +70 -0
  24. package/dist/commands/branch-new.js.map +1 -0
  25. package/dist/commands/commit.d.ts +21 -0
  26. package/dist/commands/commit.d.ts.map +1 -0
  27. package/dist/commands/commit.js +79 -0
  28. package/dist/commands/commit.js.map +1 -0
  29. package/dist/commands/db.d.ts +28 -0
  30. package/dist/commands/db.d.ts.map +1 -0
  31. package/dist/commands/db.js +83 -0
  32. package/dist/commands/db.js.map +1 -0
  33. package/dist/commands/env-add.d.ts +17 -0
  34. package/dist/commands/env-add.d.ts.map +1 -0
  35. package/dist/commands/env-add.js +73 -0
  36. package/dist/commands/env-add.js.map +1 -0
  37. package/dist/commands/fix-headers.d.ts +15 -0
  38. package/dist/commands/fix-headers.d.ts.map +1 -0
  39. package/dist/commands/fix-headers.js +37 -0
  40. package/dist/commands/fix-headers.js.map +1 -0
  41. package/dist/commands/fix-logs.d.ts +15 -0
  42. package/dist/commands/fix-logs.d.ts.map +1 -0
  43. package/dist/commands/fix-logs.js +87 -0
  44. package/dist/commands/fix-logs.js.map +1 -0
  45. package/dist/commands/jobs.d.ts +17 -0
  46. package/dist/commands/jobs.d.ts.map +1 -0
  47. package/dist/commands/jobs.js +107 -0
  48. package/dist/commands/jobs.js.map +1 -0
  49. package/dist/commands/lint.d.ts +15 -0
  50. package/dist/commands/lint.d.ts.map +1 -0
  51. package/dist/commands/lint.js +49 -0
  52. package/dist/commands/lint.js.map +1 -0
  53. package/dist/commands/make.d.ts +31 -0
  54. package/dist/commands/make.d.ts.map +1 -0
  55. package/dist/commands/make.js +176 -0
  56. package/dist/commands/make.js.map +1 -0
  57. package/dist/commands/migrate.d.ts +43 -0
  58. package/dist/commands/migrate.d.ts.map +1 -0
  59. package/dist/commands/migrate.js +120 -0
  60. package/dist/commands/migrate.js.map +1 -0
  61. package/dist/commands/schema-sync.d.ts +17 -0
  62. package/dist/commands/schema-sync.d.ts.map +1 -0
  63. package/dist/commands/schema-sync.js +48 -0
  64. package/dist/commands/schema-sync.js.map +1 -0
  65. package/dist/commands/test.d.ts +19 -0
  66. package/dist/commands/test.d.ts.map +1 -0
  67. package/dist/commands/test.js +113 -0
  68. package/dist/commands/test.js.map +1 -0
  69. package/dist/commands/upgrade.d.ts +24 -0
  70. package/dist/commands/upgrade.d.ts.map +1 -0
  71. package/dist/commands/upgrade.js +177 -0
  72. package/dist/commands/upgrade.js.map +1 -0
  73. package/dist/generators/deployment/docker-compose.d.ts +20 -0
  74. package/dist/generators/deployment/docker-compose.d.ts.map +1 -0
  75. package/dist/generators/deployment/docker-compose.js +95 -0
  76. package/dist/generators/deployment/docker-compose.js.map +1 -0
  77. package/dist/generators/deployment/dockerfile.d.ts +18 -0
  78. package/dist/generators/deployment/dockerfile.d.ts.map +1 -0
  79. package/dist/generators/deployment/dockerfile.js +99 -0
  80. package/dist/generators/deployment/dockerfile.js.map +1 -0
  81. package/dist/generators/deployment/pm2.d.ts +17 -0
  82. package/dist/generators/deployment/pm2.d.ts.map +1 -0
  83. package/dist/generators/deployment/pm2.js +59 -0
  84. package/dist/generators/deployment/pm2.js.map +1 -0
  85. package/dist/generators/deployment/secrets.d.ts +19 -0
  86. package/dist/generators/deployment/secrets.d.ts.map +1 -0
  87. package/dist/generators/deployment/secrets.js +41 -0
  88. package/dist/generators/deployment/secrets.js.map +1 -0
  89. package/dist/generators/deployment/shutdown.d.ts +17 -0
  90. package/dist/generators/deployment/shutdown.d.ts.map +1 -0
  91. package/dist/generators/deployment/shutdown.js +61 -0
  92. package/dist/generators/deployment/shutdown.js.map +1 -0
  93. package/dist/generators/deployment/wrangler.d.ts +25 -0
  94. package/dist/generators/deployment/wrangler.d.ts.map +1 -0
  95. package/dist/generators/deployment/wrangler.js +93 -0
  96. package/dist/generators/deployment/wrangler.js.map +1 -0
  97. package/dist/generators/file-generators.d.ts +38 -0
  98. package/dist/generators/file-generators.d.ts.map +1 -0
  99. package/dist/generators/file-generators.js +546 -0
  100. package/dist/generators/file-generators.js.map +1 -0
  101. package/dist/generators/module-generator.d.ts +33 -0
  102. package/dist/generators/module-generator.d.ts.map +1 -0
  103. package/dist/generators/module-generator.js +61 -0
  104. package/dist/generators/module-generator.js.map +1 -0
  105. package/dist/header-generator.d.ts +34 -0
  106. package/dist/header-generator.d.ts.map +1 -0
  107. package/dist/header-generator.js +77 -0
  108. package/dist/header-generator.js.map +1 -0
  109. package/dist/index.d.ts +12 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +177 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/linter/env-parity.d.ts +28 -0
  114. package/dist/linter/env-parity.d.ts.map +1 -0
  115. package/dist/linter/env-parity.js +59 -0
  116. package/dist/linter/env-parity.js.map +1 -0
  117. package/dist/linter.d.ts +23 -0
  118. package/dist/linter.d.ts.map +1 -0
  119. package/dist/linter.js +207 -0
  120. package/dist/linter.js.map +1 -0
  121. package/package.json +32 -0
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ *
10
+ * Property-Based Tests for .env / .env.example key parity.
11
+ *
12
+ * **Validates: Requirements 8.1, 8.2, 8.3**
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=env-parity.pbt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-parity.pbt.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/env-parity.pbt.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ *
10
+ * Property-Based Tests for .env / .env.example key parity.
11
+ *
12
+ * **Validates: Requirements 8.1, 8.2, 8.3**
13
+ */
14
+ import { describe, it, expect, beforeEach, afterEach } from 'bun:test';
15
+ import * as fc from 'fast-check';
16
+ import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ import { tmpdir } from 'node:os';
19
+ import { parseEnvKeys, checkEnvParity } from '../linter/env-parity.js';
20
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
21
+ /** Generates valid UPPER_SNAKE_CASE env key strings */
22
+ const envKeyArb = fc
23
+ .stringMatching(/^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$/)
24
+ .filter(k => k.length >= 2 && k.length <= 30);
25
+ /** Generates a set of unique env keys */
26
+ const envKeySetArb = fc
27
+ .uniqueArray(envKeyArb, { minLength: 1, maxLength: 10 })
28
+ .map(keys => new Set(keys));
29
+ /** Serialises a set of keys to .env file content */
30
+ function toEnvContent(keys) {
31
+ return [...keys].map(k => `${k}=`).join('\n') + '\n';
32
+ }
33
+ /** Serialises a set of keys to .env.example file content */
34
+ function toExampleContent(keys) {
35
+ return [...keys].map(k => `${k}= # placeholder`).join('\n') + '\n';
36
+ }
37
+ // ─── Property 2: .env / .env.example key parity ──────────────────────────────
38
+ describe('.env / .env.example key parity (Property 2)', () => {
39
+ let tmpDir;
40
+ beforeEach(() => {
41
+ tmpDir = join(tmpdir(), `vonosan-pbt-${Date.now()}-${Math.random().toString(36).slice(2)}`);
42
+ mkdirSync(tmpDir, { recursive: true });
43
+ });
44
+ afterEach(() => {
45
+ rmSync(tmpDir, { recursive: true, force: true });
46
+ });
47
+ // ── 2a: parseEnvKeys correctly extracts all keys ──────────────────────────
48
+ it('parseEnvKeys extracts exactly the keys present in the file', () => {
49
+ fc.assert(fc.property(envKeySetArb, (keys) => {
50
+ const content = toEnvContent(keys);
51
+ const parsed = parseEnvKeys(content);
52
+ expect(parsed).toEqual(keys);
53
+ }), { numRuns: 100 });
54
+ });
55
+ it('parseEnvKeys ignores comment lines and blank lines', () => {
56
+ fc.assert(fc.property(envKeySetArb, fc.array(fc.string({ maxLength: 30 }), { maxLength: 5 }), (keys, comments) => {
57
+ const commentLines = comments.map(c => `# ${c}`).join('\n');
58
+ const content = commentLines + '\n' + toEnvContent(keys);
59
+ const parsed = parseEnvKeys(content);
60
+ expect(parsed).toEqual(keys);
61
+ }), { numRuns: 100 });
62
+ });
63
+ // ── 2b: After env:add both files have the same keys ───────────────────────
64
+ it('when .env and .env.example have identical keys, checkEnvParity reports no missing keys', () => {
65
+ fc.assert(fc.property(envKeySetArb, (keys) => {
66
+ writeFileSync(join(tmpDir, '.env'), toEnvContent(keys), 'utf8');
67
+ writeFileSync(join(tmpDir, '.env.example'), toExampleContent(keys), 'utf8');
68
+ const result = checkEnvParity(tmpDir);
69
+ expect(result.missingInExample).toHaveLength(0);
70
+ expect(result.missingInEnv).toHaveLength(0);
71
+ }), { numRuns: 100 });
72
+ });
73
+ it('keys in .env but not in .env.example are reported as missingInExample', () => {
74
+ fc.assert(fc.property(envKeySetArb, envKeySetArb, (envKeys, extraKeys) => {
75
+ // Ensure extraKeys are disjoint from envKeys
76
+ const disjointExtra = new Set([...extraKeys].filter(k => !envKeys.has(k)));
77
+ if (disjointExtra.size === 0)
78
+ return; // skip degenerate case
79
+ const allEnvKeys = new Set([...envKeys, ...disjointExtra]);
80
+ writeFileSync(join(tmpDir, '.env'), toEnvContent(allEnvKeys), 'utf8');
81
+ writeFileSync(join(tmpDir, '.env.example'), toExampleContent(envKeys), 'utf8');
82
+ const result = checkEnvParity(tmpDir);
83
+ for (const key of disjointExtra) {
84
+ expect(result.missingInExample).toContain(key);
85
+ }
86
+ }), { numRuns: 100 });
87
+ });
88
+ it('keys in .env.example but not in .env are reported as missingInEnv', () => {
89
+ fc.assert(fc.property(envKeySetArb, envKeySetArb, (envKeys, extraKeys) => {
90
+ const disjointExtra = new Set([...extraKeys].filter(k => !envKeys.has(k)));
91
+ if (disjointExtra.size === 0)
92
+ return;
93
+ const allExampleKeys = new Set([...envKeys, ...disjointExtra]);
94
+ writeFileSync(join(tmpDir, '.env'), toEnvContent(envKeys), 'utf8');
95
+ writeFileSync(join(tmpDir, '.env.example'), toExampleContent(allExampleKeys), 'utf8');
96
+ const result = checkEnvParity(tmpDir);
97
+ for (const key of disjointExtra) {
98
+ expect(result.missingInEnv).toContain(key);
99
+ }
100
+ }), { numRuns: 100 });
101
+ });
102
+ it('returns empty lists when .env does not exist (no error)', () => {
103
+ // No .env file written
104
+ const result = checkEnvParity(tmpDir);
105
+ expect(result.missingInExample).toHaveLength(0);
106
+ expect(result.missingInEnv).toHaveLength(0);
107
+ });
108
+ // ── 2c: Parity is symmetric — swapping files swaps the missing lists ───────
109
+ it('parity check is symmetric: swapping .env and .env.example swaps the missing lists', () => {
110
+ fc.assert(fc.property(envKeySetArb, envKeySetArb, (keysA, keysB) => {
111
+ // Write A → .env, B → .env.example
112
+ writeFileSync(join(tmpDir, '.env'), toEnvContent(keysA), 'utf8');
113
+ writeFileSync(join(tmpDir, '.env.example'), toExampleContent(keysB), 'utf8');
114
+ const resultAB = checkEnvParity(tmpDir);
115
+ // Swap: B → .env, A → .env.example
116
+ writeFileSync(join(tmpDir, '.env'), toEnvContent(keysB), 'utf8');
117
+ writeFileSync(join(tmpDir, '.env.example'), toExampleContent(keysA), 'utf8');
118
+ const resultBA = checkEnvParity(tmpDir);
119
+ // missingInExample(A,B) === missingInEnv(B,A)
120
+ expect(new Set(resultAB.missingInExample)).toEqual(new Set(resultBA.missingInEnv));
121
+ expect(new Set(resultAB.missingInEnv)).toEqual(new Set(resultBA.missingInExample));
122
+ }), { numRuns: 100 });
123
+ });
124
+ });
125
+ //# sourceMappingURL=env-parity.pbt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-parity.pbt.test.js","sourceRoot":"","sources":["../../src/__tests__/env-parity.pbt.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ *
10
+ * Property-Based Tests for module scaffold file generation.
11
+ *
12
+ * **Validates: Requirements 2.1, 2.2, 2.3, 2.8**
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=module-generator.pbt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-generator.pbt.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/module-generator.pbt.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ *
10
+ * Property-Based Tests for module scaffold file generation.
11
+ *
12
+ * **Validates: Requirements 2.1, 2.2, 2.3, 2.8**
13
+ */
14
+ import { describe, it, expect } from 'bun:test';
15
+ import * as fc from 'fast-check';
16
+ import { generateModule } from '../generators/module-generator.js';
17
+ import { hasHeader } from '../header-generator.js';
18
+ // ─── Generators ───────────────────────────────────────────────────────────────
19
+ /** Valid module names: lowercase letters, digits, hyphens */
20
+ const moduleNameArb = fc
21
+ .stringMatching(/^[a-z][a-z0-9-]*$/)
22
+ .filter(n => n.length >= 2 && n.length <= 30);
23
+ // ─── Property 16: module scaffold produces all required files ─────────────────
24
+ describe('module scaffold produces all required files (Property 16)', () => {
25
+ // ── 16a: API files are always generated when api=true ─────────────────────
26
+ it('generates routes.ts, controller.ts, service.ts, dto.ts, schema.ts when api=true', () => {
27
+ fc.assert(fc.property(moduleNameArb, (name) => {
28
+ const files = generateModule(name, { api: true, frontend: false, saas: false });
29
+ const paths = files.map(f => f.path);
30
+ expect(paths.some(p => p.endsWith(`${name}.routes.ts`))).toBe(true);
31
+ expect(paths.some(p => p.endsWith(`${name}.controller.ts`))).toBe(true);
32
+ expect(paths.some(p => p.endsWith(`${name}.service.ts`))).toBe(true);
33
+ expect(paths.some(p => p.endsWith(`${name}.dto.ts`))).toBe(true);
34
+ expect(paths.some(p => p.endsWith(`${name}.schema.ts`))).toBe(true);
35
+ }), { numRuns: 100 });
36
+ });
37
+ // ── 16b: resource.ts and policy.ts are generated with api=true ────────────
38
+ it('generates resource.ts and policy.ts when api=true', () => {
39
+ fc.assert(fc.property(moduleNameArb, (name) => {
40
+ const files = generateModule(name, { api: true, frontend: false, saas: false });
41
+ const paths = files.map(f => f.path);
42
+ expect(paths.some(p => p.endsWith(`${name}.resource.ts`))).toBe(true);
43
+ expect(paths.some(p => p.endsWith(`${name}.policy.ts`))).toBe(true);
44
+ }), { numRuns: 100 });
45
+ });
46
+ // ── 16c: test files are generated with api=true ────────────────────────────
47
+ it('generates unit, integration, and e2e test files when api=true', () => {
48
+ fc.assert(fc.property(moduleNameArb, (name) => {
49
+ const files = generateModule(name, { api: true, frontend: false, saas: false });
50
+ const paths = files.map(f => f.path);
51
+ expect(paths.some(p => p.endsWith(`${name}.unit.test.ts`))).toBe(true);
52
+ expect(paths.some(p => p.endsWith(`${name}.integration.test.ts`))).toBe(true);
53
+ expect(paths.some(p => p.endsWith(`${name}.e2e.test.ts`))).toBe(true);
54
+ }), { numRuns: 100 });
55
+ });
56
+ // ── 16d: frontend files are generated when frontend=true ──────────────────
57
+ it('generates index.page.vue and composable when frontend=true', () => {
58
+ fc.assert(fc.property(moduleNameArb, (name) => {
59
+ const files = generateModule(name, { api: false, frontend: true, saas: false });
60
+ const paths = files.map(f => f.path);
61
+ expect(paths.some(p => p.endsWith('index.page.vue'))).toBe(true);
62
+ expect(paths.some(p => p.includes('composables/'))).toBe(true);
63
+ }), { numRuns: 100 });
64
+ });
65
+ // ── 16e: no frontend files when frontend=false ────────────────────────────
66
+ it('does not generate page or composable when frontend=false', () => {
67
+ fc.assert(fc.property(moduleNameArb, (name) => {
68
+ const files = generateModule(name, { api: true, frontend: false, saas: false });
69
+ const paths = files.map(f => f.path);
70
+ expect(paths.some(p => p.endsWith('.page.vue'))).toBe(false);
71
+ expect(paths.some(p => p.includes('composables/'))).toBe(false);
72
+ }), { numRuns: 100 });
73
+ });
74
+ // ── 16f: every generated file has the Bonifade header ─────────────────────
75
+ it('every generated file contains the Bonifade Technologies header', () => {
76
+ fc.assert(fc.property(moduleNameArb, (name) => {
77
+ const files = generateModule(name, { api: true, frontend: true, saas: false });
78
+ for (const { path, content } of files) {
79
+ // .vue files embed the header in a comment block — check for the marker
80
+ const hasIt = hasHeader(content) ||
81
+ content.includes('Bonifade Technologies'); // .vue files use HTML comment
82
+ expect(hasIt).toBe(true);
83
+ }
84
+ }), { numRuns: 50 });
85
+ });
86
+ // ── 16g: saas mode adds deleted_at to schema ──────────────────────────────
87
+ it('schema contains deleted_at when saas=true', () => {
88
+ fc.assert(fc.property(moduleNameArb, (name) => {
89
+ const files = generateModule(name, { api: true, frontend: false, saas: true });
90
+ const schemaFile = files.find(f => f.path.endsWith(`${name}.schema.ts`));
91
+ expect(schemaFile).toBeDefined();
92
+ expect(schemaFile.content).toContain('deleted_at');
93
+ }), { numRuns: 100 });
94
+ });
95
+ // ── 16h: non-saas schema does NOT contain deleted_at ─────────────────────
96
+ it('schema does not contain deleted_at when saas=false', () => {
97
+ fc.assert(fc.property(moduleNameArb, (name) => {
98
+ const files = generateModule(name, { api: true, frontend: false, saas: false });
99
+ const schemaFile = files.find(f => f.path.endsWith(`${name}.schema.ts`));
100
+ expect(schemaFile).toBeDefined();
101
+ expect(schemaFile.content).not.toContain('deleted_at');
102
+ }), { numRuns: 100 });
103
+ });
104
+ // ── 16i: all file paths are under src/modules/<name>/ ─────────────────────
105
+ it('all generated file paths are under src/modules/<name>/', () => {
106
+ fc.assert(fc.property(moduleNameArb, (name) => {
107
+ const files = generateModule(name, { api: true, frontend: true, saas: false });
108
+ for (const { path } of files) {
109
+ expect(path.startsWith(`src/modules/${name}/`)).toBe(true);
110
+ }
111
+ }), { numRuns: 100 });
112
+ });
113
+ // ── 16j: no duplicate file paths ─────────────────────────────────────────
114
+ it('no duplicate file paths are generated', () => {
115
+ fc.assert(fc.property(moduleNameArb, (name) => {
116
+ const files = generateModule(name, { api: true, frontend: true, saas: false });
117
+ const paths = files.map(f => f.path);
118
+ const unique = new Set(paths);
119
+ expect(unique.size).toBe(paths.length);
120
+ }), { numRuns: 100 });
121
+ });
122
+ // ── 16k: api=false generates no API files ────────────────────────────────
123
+ it('generates no API files when api=false', () => {
124
+ fc.assert(fc.property(moduleNameArb, (name) => {
125
+ const files = generateModule(name, { api: false, frontend: false, saas: false });
126
+ expect(files).toHaveLength(0);
127
+ }), { numRuns: 100 });
128
+ });
129
+ });
130
+ //# sourceMappingURL=module-generator.pbt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-generator.pbt.test.js","sourceRoot":"","sources":["../../src/__tests__/module-generator.pbt.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * `vonosan add <module> [--eject]`
12
+ *
13
+ * - Installs the @vonosan/<module> package
14
+ * - Generates required files
15
+ * - Updates vonosan.config.ts (idempotent)
16
+ *
17
+ * With `--eject`: copies module source into src/modules/<module>/ and
18
+ * removes the package dependency.
19
+ */
20
+ export declare function runAdd(args: string[]): Promise<void>;
21
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0DH;;;;;;;;;GASG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC1D"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { execSync } from 'node:child_process';
11
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, cpSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
14
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
15
+ const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
16
+ const bold = (s) => `\x1b[1m${s}\x1b[0m`;
17
+ /** Known installable Vonosan modules */
18
+ const KNOWN_MODULES = {
19
+ auth: '@vonosan/auth',
20
+ notifications: '@vonosan/notifications',
21
+ logging: '@vonosan/logging',
22
+ ws: '@vonosan/ws',
23
+ storage: '@vonosan/storage',
24
+ queue: '@vonosan/queue',
25
+ cache: '@vonosan/cache',
26
+ email: '@vonosan/email',
27
+ i18n: '@vonosan/i18n',
28
+ };
29
+ function run(cmd) {
30
+ execSync(cmd, { stdio: 'inherit', cwd: process.cwd() });
31
+ }
32
+ /**
33
+ * Reads vonosan.config.ts and appends the module to the `modules` array.
34
+ * This is a best-effort text manipulation — for a production implementation
35
+ * you would use an AST transformer.
36
+ */
37
+ function updateVonosanConfig(packageName) {
38
+ const configPath = join(process.cwd(), 'vonosan.config.ts');
39
+ if (!existsSync(configPath))
40
+ return;
41
+ const content = readFileSync(configPath, 'utf8');
42
+ // Idempotency check
43
+ if (content.includes(packageName)) {
44
+ process.stdout.write(yellow(` vonosan.config.ts already references "${packageName}" — skipping.\n`));
45
+ return;
46
+ }
47
+ // Append to modules array if present, otherwise add a comment
48
+ const updated = content.replace(/modules\s*:\s*\[([^\]]*)\]/, (match, inner) => `modules: [${inner.trim() ? inner + ',\n ' : '\n '}// ${packageName} — configure here\n ]`);
49
+ if (updated !== content) {
50
+ writeFileSync(configPath, updated, 'utf8');
51
+ process.stdout.write(green(` Updated vonosan.config.ts\n`));
52
+ }
53
+ }
54
+ /**
55
+ * `vonosan add <module> [--eject]`
56
+ *
57
+ * - Installs the @vonosan/<module> package
58
+ * - Generates required files
59
+ * - Updates vonosan.config.ts (idempotent)
60
+ *
61
+ * With `--eject`: copies module source into src/modules/<module>/ and
62
+ * removes the package dependency.
63
+ */
64
+ export async function runAdd(args) {
65
+ const eject = args.includes('--eject');
66
+ const moduleArgs = args.filter(a => !a.startsWith('--'));
67
+ const [moduleName, ...extra] = moduleArgs;
68
+ if (!moduleName) {
69
+ process.stderr.write(red('Usage: vonosan add <module> [--eject]\n'));
70
+ process.stderr.write(` Known modules: ${Object.keys(KNOWN_MODULES).join(', ')}\n`);
71
+ process.exit(1);
72
+ }
73
+ const packageName = KNOWN_MODULES[moduleName] ?? `@vonosan/${moduleName}`;
74
+ process.stdout.write(bold(`Adding module "${moduleName}" (${packageName}) …\n`));
75
+ if (eject) {
76
+ await ejectModule(moduleName, packageName);
77
+ return;
78
+ }
79
+ // Install package
80
+ try {
81
+ run(`bun add ${packageName}`);
82
+ process.stdout.write(green(`✔ Installed ${packageName}\n`));
83
+ }
84
+ catch {
85
+ process.stderr.write(yellow(`⚠ Could not install ${packageName} — it may not be published yet.\n`));
86
+ }
87
+ // Update vonosan.config.ts
88
+ updateVonosanConfig(packageName);
89
+ process.stdout.write(green(`\n✔ Module "${moduleName}" added. Configure it in vonosan.config.ts.\n`));
90
+ }
91
+ /**
92
+ * Ejects a module: copies its source into src/modules/<module>/ and removes
93
+ * the package dependency.
94
+ */
95
+ async function ejectModule(moduleName, packageName) {
96
+ const nodeModulesPath = join(process.cwd(), 'node_modules', packageName, 'src');
97
+ const targetDir = join(process.cwd(), 'src', 'modules', moduleName);
98
+ if (existsSync(targetDir)) {
99
+ process.stderr.write(red(`Module source already ejected at ${targetDir}. Remove it first.\n`));
100
+ process.exit(1);
101
+ }
102
+ if (!existsSync(nodeModulesPath)) {
103
+ process.stderr.write(red(`Cannot eject: ${packageName} is not installed or has no src/ directory.\n` +
104
+ `Run \`vonosan add ${moduleName}\` first.\n`));
105
+ process.exit(1);
106
+ }
107
+ mkdirSync(targetDir, { recursive: true });
108
+ cpSync(nodeModulesPath, targetDir, { recursive: true });
109
+ process.stdout.write(green(`✔ Ejected ${packageName} source to ${targetDir}\n`));
110
+ // Remove the package dependency
111
+ try {
112
+ run(`bun remove ${packageName}`);
113
+ process.stdout.write(green(`✔ Removed ${packageName} from dependencies\n`));
114
+ }
115
+ catch {
116
+ process.stdout.write(yellow(`⚠ Could not remove ${packageName} — remove it manually.\n`));
117
+ }
118
+ // Update vonosan.config.ts to remove the package reference
119
+ const configPath = join(process.cwd(), 'vonosan.config.ts');
120
+ if (existsSync(configPath)) {
121
+ const content = readFileSync(configPath, 'utf8');
122
+ const updated = content.replace(new RegExp(`import.*from.*${packageName}.*\\n`, 'g'), '');
123
+ if (updated !== content)
124
+ writeFileSync(configPath, updated, 'utf8');
125
+ }
126
+ process.stdout.write(green(`\n✔ Module "${moduleName}" ejected to src/modules/${moduleName}/\n`));
127
+ }
128
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * `vonosan audit [--fix]`
12
+ *
13
+ * Scans all files under src/ and reports violations.
14
+ * With `--fix`, auto-resolves header and console-log violations.
15
+ * Exits 0 when clean, 1 when violations remain.
16
+ */
17
+ export declare function runAudit(args: string[]): Promise<void>;
18
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmCH;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC5D"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { join } from 'node:path';
11
+ import { lintProject } from '../linter.js';
12
+ import { runFixHeaders } from './fix-headers.js';
13
+ import { runFixLogs } from './fix-logs.js';
14
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
15
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
16
+ const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
17
+ const bold = (s) => `\x1b[1m${s}\x1b[0m`;
18
+ const dim = (s) => `\x1b[2m${s}\x1b[0m`;
19
+ /** Rules that can be auto-fixed */
20
+ const AUTO_FIXABLE = ['header-missing', 'console-log'];
21
+ function printReport(results) {
22
+ if (results.length === 0)
23
+ return;
24
+ // Group by rule category
25
+ const byRule = new Map();
26
+ for (const r of results) {
27
+ const list = byRule.get(r.rule) ?? [];
28
+ list.push(r);
29
+ byRule.set(r.rule, list);
30
+ }
31
+ for (const [rule, violations] of byRule) {
32
+ process.stdout.write(`\n${bold(yellow(`[${rule}]`))} — ${violations.length} violation${violations.length === 1 ? '' : 's'}\n`);
33
+ for (const v of violations) {
34
+ process.stdout.write(` ${dim(v.file + ':' + v.line)} ${v.message}\n`);
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * `vonosan audit [--fix]`
40
+ *
41
+ * Scans all files under src/ and reports violations.
42
+ * With `--fix`, auto-resolves header and console-log violations.
43
+ * Exits 0 when clean, 1 when violations remain.
44
+ */
45
+ export async function runAudit(args) {
46
+ const fix = args.includes('--fix');
47
+ const srcDir = join(process.cwd(), 'src');
48
+ process.stdout.write(`${bold('Vonosan Audit')} — scanning ${srcDir} …\n`);
49
+ if (fix) {
50
+ process.stdout.write('\nAuto-fixing headers …\n');
51
+ await runFixHeaders([]);
52
+ process.stdout.write('\nAuto-fixing console logs …\n');
53
+ await runFixLogs([]);
54
+ }
55
+ const results = await lintProject(srcDir);
56
+ if (results.length === 0) {
57
+ process.stdout.write(green('\n✔ Audit passed — no violations found.\n'));
58
+ process.exit(0);
59
+ }
60
+ printReport(results);
61
+ const autoFixable = results.filter(r => AUTO_FIXABLE.includes(r.rule));
62
+ const manual = results.filter(r => !AUTO_FIXABLE.includes(r.rule));
63
+ process.stdout.write(`\n${red(`✖ ${results.length} violation${results.length === 1 ? '' : 's'} found.`)}`);
64
+ if (!fix && autoFixable.length > 0) {
65
+ process.stdout.write(`\n${yellow(` ${autoFixable.length} can be auto-fixed — run \`vonosan audit --fix\` to resolve them.`)}`);
66
+ }
67
+ if (manual.length > 0) {
68
+ process.stdout.write(`\n${yellow(` ${manual.length} require${manual.length === 1 ? 's' : ''} manual intervention.`)}`);
69
+ }
70
+ process.stdout.write('\n');
71
+ process.exit(1);
72
+ }
73
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * `vonosan branch:finish`
12
+ *
13
+ * 1. Checks for uncommitted changes — halts if any.
14
+ * 2. Merges the current feature branch into the recorded parent.
15
+ * 3. Deletes the feature branch.
16
+ * 4. Checks out the parent branch.
17
+ */
18
+ export declare function runBranchFinish(_args: string[]): Promise<void>;
19
+ //# sourceMappingURL=branch-finish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-finish.d.ts","sourceRoot":"","sources":["../../src/commands/branch-finish.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwCH;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDpE"}