@kabran-tecnologia/kabran-config 2.1.0 → 2.2.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/README.md +6 -19
- package/package.json +1 -1
- package/src/core/config-loader.mjs +108 -3
- package/templates/.husky/pre-push +5 -4
package/README.md
CHANGED
|
@@ -368,8 +368,9 @@ echo "npx lint-staged" > .husky/pre-commit
|
|
|
368
368
|
# Add commit-msg hook
|
|
369
369
|
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg
|
|
370
370
|
|
|
371
|
-
# Add pre-push hook (optional)
|
|
372
|
-
|
|
371
|
+
# Add pre-push hook (optional - kept lightweight by design)
|
|
372
|
+
# Full validation runs in CI. Uncomment type-check if desired:
|
|
373
|
+
# echo "npm run type-check" > .husky/pre-push
|
|
373
374
|
```
|
|
374
375
|
|
|
375
376
|
---
|
|
@@ -476,21 +477,14 @@ node node_modules/@kabran-tecnologia/kabran-config/src/scripts/license-check.mjs
|
|
|
476
477
|
}
|
|
477
478
|
```
|
|
478
479
|
|
|
479
|
-
**Usage in CI
|
|
480
|
+
**Usage in CI (recommended):**
|
|
480
481
|
|
|
481
482
|
```yaml
|
|
482
|
-
# .github/workflows/
|
|
483
|
+
# .github/workflows/ci.yml
|
|
483
484
|
- name: License Check
|
|
484
485
|
run: npm run license:check
|
|
485
486
|
```
|
|
486
487
|
|
|
487
|
-
**Usage in Husky:**
|
|
488
|
-
|
|
489
|
-
```bash
|
|
490
|
-
# .husky/pre-push
|
|
491
|
-
npm run license:check
|
|
492
|
-
```
|
|
493
|
-
|
|
494
488
|
**Blocked licenses:** GPL, AGPL, LGPL, EUPL (viral copyleft)
|
|
495
489
|
**Exit code:** 1 if prohibited licenses found, 0 otherwise
|
|
496
490
|
|
|
@@ -607,14 +601,7 @@ node node_modules/@kabran-tecnologia/kabran-config/src/scripts/env-validator.mjs
|
|
|
607
601
|
3. If env vars detected, validates `.env.example` exists
|
|
608
602
|
4. Warns if vars in `.env.example` lack comments/documentation
|
|
609
603
|
|
|
610
|
-
**Usage in
|
|
611
|
-
|
|
612
|
-
```bash
|
|
613
|
-
# .husky/pre-push
|
|
614
|
-
npm run env:validate
|
|
615
|
-
```
|
|
616
|
-
|
|
617
|
-
**Usage in CI/CD:**
|
|
604
|
+
**Usage in CI (recommended):**
|
|
618
605
|
|
|
619
606
|
```yaml
|
|
620
607
|
# .github/workflows/security.yml
|
package/package.json
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* Enables projects to customize validator behavior without modifying kabran-config.
|
|
6
6
|
*
|
|
7
7
|
* Features:
|
|
8
|
-
* - Smart detection of tools (ESLint, TypeScript, Prettier, Vitest, Playwright)
|
|
8
|
+
* - Smart detection of tools (ESLint, TypeScript, Prettier, Vitest, Playwright, Turbo)
|
|
9
9
|
* - Automatic Doppler integration for secrets injection in tests
|
|
10
|
+
* - Native support for Turbo monorepos (auto-detects turbo.json)
|
|
10
11
|
* - Convention over configuration - works out of the box
|
|
11
12
|
*
|
|
12
13
|
* @module config-loader
|
|
@@ -45,6 +46,7 @@ const TOOL_CONFIGS = {
|
|
|
45
46
|
prettier: ['prettier.config.mjs', 'prettier.config.js', '.prettierrc', '.prettierrc.json', '.prettierrc.js'],
|
|
46
47
|
vitest: ['vitest.config.ts', 'vitest.config.mts', 'vitest.config.js', 'vitest.config.mjs'],
|
|
47
48
|
playwright: ['playwright.config.ts', 'playwright.config.js'],
|
|
49
|
+
turbo: ['turbo.json'],
|
|
48
50
|
};
|
|
49
51
|
|
|
50
52
|
/**
|
|
@@ -59,10 +61,27 @@ function hasToolConfig(cwd, configFiles) {
|
|
|
59
61
|
|
|
60
62
|
/**
|
|
61
63
|
* Check if Doppler is configured for the current directory.
|
|
64
|
+
*
|
|
65
|
+
* Detection methods (in order of reliability):
|
|
66
|
+
* 1. DOPPLER_TOKEN environment variable is set
|
|
67
|
+
* 2. doppler.yaml exists in the project
|
|
68
|
+
* 3. doppler configure get token returns a value (CLI-level config)
|
|
69
|
+
*
|
|
62
70
|
* @param {string} cwd - Working directory
|
|
63
|
-
* @returns {boolean} True if Doppler
|
|
71
|
+
* @returns {boolean} True if Doppler is available
|
|
64
72
|
*/
|
|
65
73
|
function hasDopplerConfigured(cwd) {
|
|
74
|
+
// Method 1: Environment variable (most common in CI/CD and scoped setups)
|
|
75
|
+
if (process.env.DOPPLER_TOKEN) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Method 2: doppler.yaml in project (common for project-level config)
|
|
80
|
+
if (existsSync(join(cwd, 'doppler.yaml'))) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Method 3: CLI-level configuration (doppler setup was run)
|
|
66
85
|
try {
|
|
67
86
|
const result = execSync('doppler configure get token', {
|
|
68
87
|
cwd,
|
|
@@ -72,7 +91,18 @@ function hasDopplerConfigured(cwd) {
|
|
|
72
91
|
});
|
|
73
92
|
return result.trim().length > 0;
|
|
74
93
|
} catch {
|
|
75
|
-
|
|
94
|
+
// Method 4: Try doppler secrets as last resort (validates full setup)
|
|
95
|
+
try {
|
|
96
|
+
execSync('doppler secrets --only-names', {
|
|
97
|
+
cwd,
|
|
98
|
+
stdio: 'pipe',
|
|
99
|
+
encoding: 'utf-8',
|
|
100
|
+
timeout: 10000,
|
|
101
|
+
});
|
|
102
|
+
return true;
|
|
103
|
+
} catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
76
106
|
}
|
|
77
107
|
}
|
|
78
108
|
|
|
@@ -89,6 +119,15 @@ export function wrapWithDoppler(cmd, useDoppler) {
|
|
|
89
119
|
/**
|
|
90
120
|
* Detect available tools and generate smart defaults.
|
|
91
121
|
* Only configures commands for tools that are actually set up in the project.
|
|
122
|
+
*
|
|
123
|
+
* Turbo monorepo support:
|
|
124
|
+
* - When turbo.json is detected, commands delegate to `turbo run` for:
|
|
125
|
+
* - Lint: `turbo run lint`
|
|
126
|
+
* - Types: `turbo run type-check`
|
|
127
|
+
* - Tests: `turbo run test`
|
|
128
|
+
* - Build: `turbo run build`
|
|
129
|
+
* - This ensures proper monorepo handling with caching and workspace orchestration.
|
|
130
|
+
*
|
|
92
131
|
* @param {string} cwd - Working directory
|
|
93
132
|
* @returns {object} Detected defaults for CLI commands
|
|
94
133
|
*/
|
|
@@ -98,10 +137,76 @@ export function detectToolDefaults(cwd) {
|
|
|
98
137
|
test: {},
|
|
99
138
|
build: {},
|
|
100
139
|
ci: { steps: [] },
|
|
140
|
+
turbo: false,
|
|
101
141
|
};
|
|
102
142
|
|
|
103
143
|
const hasDoppler = hasDopplerConfigured(cwd);
|
|
144
|
+
const hasTurbo = hasToolConfig(cwd, TOOL_CONFIGS.turbo);
|
|
145
|
+
|
|
146
|
+
// Store turbo detection result for consumers
|
|
147
|
+
defaults.turbo = hasTurbo;
|
|
148
|
+
|
|
149
|
+
// Turbo monorepo mode: delegate to turbo run commands
|
|
150
|
+
if (hasTurbo) {
|
|
151
|
+
return detectTurboDefaults(defaults, hasDoppler);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Standard single-package mode: use direct tool commands
|
|
155
|
+
return detectStandardDefaults(cwd, defaults, hasDoppler);
|
|
156
|
+
}
|
|
104
157
|
|
|
158
|
+
/**
|
|
159
|
+
* Generate defaults for Turbo monorepo projects.
|
|
160
|
+
* Uses `turbo run` commands for all operations.
|
|
161
|
+
* @param {object} defaults - Base defaults object
|
|
162
|
+
* @param {boolean} hasDoppler - Whether Doppler is configured
|
|
163
|
+
* @returns {object} Turbo-specific defaults
|
|
164
|
+
*/
|
|
165
|
+
function detectTurboDefaults(defaults, hasDoppler) {
|
|
166
|
+
// L1: Static Analysis via Turbo
|
|
167
|
+
defaults.check.lint = 'turbo run lint';
|
|
168
|
+
defaults.check.types = 'turbo run type-check';
|
|
169
|
+
defaults.check.format = 'turbo run format:check';
|
|
170
|
+
|
|
171
|
+
// L2: Unit Tests via Turbo (with Doppler support)
|
|
172
|
+
const testCmd = 'turbo run test';
|
|
173
|
+
defaults.test.unit = {
|
|
174
|
+
command: wrapWithDoppler(testCmd, hasDoppler),
|
|
175
|
+
doppler: hasDoppler,
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
// L3: Integration Tests via Turbo (with Doppler support)
|
|
179
|
+
const integrationCmd = 'turbo run test:integration';
|
|
180
|
+
defaults.test.integration = {
|
|
181
|
+
command: wrapWithDoppler(integrationCmd, hasDoppler),
|
|
182
|
+
doppler: hasDoppler,
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// L4: E2E Tests via Turbo (with Doppler support)
|
|
186
|
+
const e2eCmd = 'turbo run test:e2e';
|
|
187
|
+
defaults.test.e2e = {
|
|
188
|
+
command: wrapWithDoppler(e2eCmd, hasDoppler),
|
|
189
|
+
doppler: hasDoppler,
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// Build via Turbo
|
|
193
|
+
defaults.build.command = 'turbo run build';
|
|
194
|
+
|
|
195
|
+
// CI steps for Turbo projects
|
|
196
|
+
defaults.ci.steps = ['check', 'test:unit', 'build'];
|
|
197
|
+
|
|
198
|
+
return defaults;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Generate defaults for standard single-package projects.
|
|
203
|
+
* Uses direct tool commands (npx eslint, npx tsc, etc).
|
|
204
|
+
* @param {string} cwd - Working directory
|
|
205
|
+
* @param {object} defaults - Base defaults object
|
|
206
|
+
* @param {boolean} hasDoppler - Whether Doppler is configured
|
|
207
|
+
* @returns {object} Standard project defaults
|
|
208
|
+
*/
|
|
209
|
+
function detectStandardDefaults(cwd, defaults, hasDoppler) {
|
|
105
210
|
// L1: Static Analysis
|
|
106
211
|
if (hasToolConfig(cwd, TOOL_CONFIGS.eslint)) {
|
|
107
212
|
defaults.check.lint = 'npx eslint .';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
# Pre-push hook - kept lightweight by design
|
|
2
|
+
# Full validation (lint, tests, build) runs in CI asynchronously
|
|
3
|
+
#
|
|
4
|
+
# Uncomment below if you want local type-check before push:
|
|
5
|
+
# npm run type-check
|