dotenv-diff 2.6.3 → 2.7.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/CHANGELOG.md +16 -0
- package/README.md +8 -2
- package/dist/src/commands/compare.d.ts.map +1 -1
- package/dist/src/commands/compare.js +0 -4
- package/dist/src/commands/compare.js.map +1 -1
- package/dist/src/commands/scanUsage.d.ts.map +1 -1
- package/dist/src/commands/scanUsage.js +3 -1
- package/dist/src/commands/scanUsage.js.map +1 -1
- package/dist/src/config/constants.d.ts +4 -0
- package/dist/src/config/constants.d.ts.map +1 -1
- package/dist/src/config/constants.js +4 -0
- package/dist/src/config/constants.js.map +1 -1
- package/dist/src/core/scan/patterns.d.ts.map +1 -0
- package/dist/src/core/{patterns.js → scan/patterns.js} +2 -0
- package/dist/src/core/scan/patterns.js.map +1 -0
- package/dist/src/core/scan/scanFile.js +1 -1
- package/dist/src/core/scan/scanFile.js.map +1 -1
- package/dist/src/core/security/exampleSecretDetector.js +2 -2
- package/dist/src/core/security/exampleSecretDetector.js.map +1 -1
- package/dist/src/services/fileWalker.js +1 -1
- package/dist/src/services/fileWalker.js.map +1 -1
- package/dist/src/services/printScanResult.d.ts.map +1 -1
- package/dist/src/services/printScanResult.js +21 -32
- package/dist/src/services/printScanResult.js.map +1 -1
- package/dist/src/services/scanCodebase.d.ts.map +1 -1
- package/dist/src/services/scanCodebase.js +1 -17
- package/dist/src/services/scanCodebase.js.map +1 -1
- package/dist/src/ui/compare/printErrorNotFound.d.ts.map +1 -1
- package/dist/src/ui/compare/printErrorNotFound.js +10 -6
- package/dist/src/ui/compare/printErrorNotFound.js.map +1 -1
- package/dist/src/ui/compare/printHeader.d.ts +0 -1
- package/dist/src/ui/compare/printHeader.d.ts.map +1 -1
- package/dist/src/ui/compare/printHeader.js +3 -4
- package/dist/src/ui/compare/printHeader.js.map +1 -1
- package/dist/src/ui/compare/printIssues.d.ts.map +1 -1
- package/dist/src/ui/compare/printIssues.js +25 -10
- package/dist/src/ui/compare/printIssues.js.map +1 -1
- package/dist/src/ui/compare/printPrompt.d.ts +1 -1
- package/dist/src/ui/compare/printPrompt.d.ts.map +1 -1
- package/dist/src/ui/compare/printPrompt.js +24 -7
- package/dist/src/ui/compare/printPrompt.js.map +1 -1
- package/dist/src/ui/compare/printStats.d.ts.map +1 -1
- package/dist/src/ui/compare/printStats.js +14 -11
- package/dist/src/ui/compare/printStats.js.map +1 -1
- package/dist/src/ui/scan/printComparisonError.js +11 -10
- package/dist/src/ui/scan/printComparisonError.js.map +1 -1
- package/dist/src/ui/scan/printConsolelogWarning.d.ts +2 -1
- package/dist/src/ui/scan/printConsolelogWarning.d.ts.map +1 -1
- package/dist/src/ui/scan/printConsolelogWarning.js +11 -9
- package/dist/src/ui/scan/printConsolelogWarning.js.map +1 -1
- package/dist/src/ui/scan/printExampleWarnings.d.ts +2 -1
- package/dist/src/ui/scan/printExampleWarnings.d.ts.map +1 -1
- package/dist/src/ui/scan/printExampleWarnings.js +10 -5
- package/dist/src/ui/scan/printExampleWarnings.js.map +1 -1
- package/dist/src/ui/scan/printExpireWarnings.d.ts +1 -1
- package/dist/src/ui/scan/printExpireWarnings.d.ts.map +1 -1
- package/dist/src/ui/scan/printExpireWarnings.js +23 -21
- package/dist/src/ui/scan/printExpireWarnings.js.map +1 -1
- package/dist/src/ui/scan/printFrameworkWarnings.d.ts +2 -1
- package/dist/src/ui/scan/printFrameworkWarnings.d.ts.map +1 -1
- package/dist/src/ui/scan/printFrameworkWarnings.js +27 -7
- package/dist/src/ui/scan/printFrameworkWarnings.js.map +1 -1
- package/dist/src/ui/scan/printHeader.d.ts.map +1 -1
- package/dist/src/ui/scan/printHeader.js +8 -5
- package/dist/src/ui/scan/printHeader.js.map +1 -1
- package/dist/src/ui/scan/printHealthScore.d.ts.map +1 -1
- package/dist/src/ui/scan/printHealthScore.js +12 -21
- package/dist/src/ui/scan/printHealthScore.js.map +1 -1
- package/dist/src/ui/scan/printInconsistentNamingWarning.d.ts +2 -1
- package/dist/src/ui/scan/printInconsistentNamingWarning.d.ts.map +1 -1
- package/dist/src/ui/scan/printInconsistentNamingWarning.js +11 -8
- package/dist/src/ui/scan/printInconsistentNamingWarning.js.map +1 -1
- package/dist/src/ui/scan/printMissing.d.ts.map +1 -1
- package/dist/src/ui/scan/printMissing.js +6 -9
- package/dist/src/ui/scan/printMissing.js.map +1 -1
- package/dist/src/ui/scan/printMissingExample.d.ts.map +1 -1
- package/dist/src/ui/scan/printMissingExample.js +7 -10
- package/dist/src/ui/scan/printMissingExample.js.map +1 -1
- package/dist/src/ui/scan/printSecrets.d.ts +2 -1
- package/dist/src/ui/scan/printSecrets.d.ts.map +1 -1
- package/dist/src/ui/scan/printSecrets.js +15 -24
- package/dist/src/ui/scan/printSecrets.js.map +1 -1
- package/dist/src/ui/scan/printStats.d.ts +0 -1
- package/dist/src/ui/scan/printStats.d.ts.map +1 -1
- package/dist/src/ui/scan/printStats.js +10 -9
- package/dist/src/ui/scan/printStats.js.map +1 -1
- package/dist/src/ui/scan/printUnused.d.ts +3 -3
- package/dist/src/ui/scan/printUnused.d.ts.map +1 -1
- package/dist/src/ui/scan/printUnused.js +12 -8
- package/dist/src/ui/scan/printUnused.js.map +1 -1
- package/dist/src/ui/scan/printUppercaseWarning.d.ts +2 -1
- package/dist/src/ui/scan/printUppercaseWarning.d.ts.map +1 -1
- package/dist/src/ui/scan/printUppercaseWarning.js +11 -7
- package/dist/src/ui/scan/printUppercaseWarning.js.map +1 -1
- package/dist/src/ui/shared/printAutoFix.d.ts.map +1 -1
- package/dist/src/ui/shared/printAutoFix.js +12 -10
- package/dist/src/ui/shared/printAutoFix.js.map +1 -1
- package/dist/src/ui/shared/printConfigStatus.d.ts +1 -1
- package/dist/src/ui/shared/printConfigStatus.d.ts.map +1 -1
- package/dist/src/ui/shared/printConfigStatus.js +13 -10
- package/dist/src/ui/shared/printConfigStatus.js.map +1 -1
- package/dist/src/ui/shared/printDuplicates.d.ts +2 -1
- package/dist/src/ui/shared/printDuplicates.d.ts.map +1 -1
- package/dist/src/ui/shared/printDuplicates.js +17 -6
- package/dist/src/ui/shared/printDuplicates.js.map +1 -1
- package/dist/src/ui/shared/printFixTips.js +7 -7
- package/dist/src/ui/shared/printFixTips.js.map +1 -1
- package/dist/src/ui/shared/printGitignore.d.ts +2 -0
- package/dist/src/ui/shared/printGitignore.d.ts.map +1 -1
- package/dist/src/ui/shared/printGitignore.js +13 -12
- package/dist/src/ui/shared/printGitignore.js.map +1 -1
- package/dist/src/ui/shared/printInitStatus.d.ts +4 -4
- package/dist/src/ui/shared/printInitStatus.d.ts.map +1 -1
- package/dist/src/ui/shared/printInitStatus.js +14 -11
- package/dist/src/ui/shared/printInitStatus.js.map +1 -1
- package/dist/src/ui/shared/printOptionErrors.d.ts.map +1 -1
- package/dist/src/ui/shared/printOptionErrors.js +19 -5
- package/dist/src/ui/shared/printOptionErrors.js.map +1 -1
- package/dist/src/ui/theme.d.ts +16 -0
- package/dist/src/ui/theme.d.ts.map +1 -0
- package/dist/src/ui/theme.js +41 -0
- package/dist/src/ui/theme.js.map +1 -0
- package/docs/assets/demo.gif +0 -0
- package/docs/assets/success.png +0 -0
- package/docs/capabilities.md +85 -0
- package/docs/index.md +1 -34
- package/package.json +1 -1
- package/dist/src/core/patterns.d.ts.map +0 -1
- package/dist/src/core/patterns.js.map +0 -1
- package/dist/src/ui/scan/printProgress.d.ts +0 -22
- package/dist/src/ui/scan/printProgress.d.ts.map +0 -1
- package/dist/src/ui/scan/printProgress.js +0 -36
- package/dist/src/ui/scan/printProgress.js.map +0 -1
- package/dist/src/ui/shared/printStrictModeError.d.ts +0 -26
- package/dist/src/ui/shared/printStrictModeError.d.ts.map +0 -1
- package/dist/src/ui/shared/printStrictModeError.js +0 -41
- package/dist/src/ui/shared/printStrictModeError.js.map +0 -1
- package/dist/src/ui/shared/printSuccess.d.ts +0 -11
- package/dist/src/ui/shared/printSuccess.d.ts.map +0 -1
- package/dist/src/ui/shared/printSuccess.js +0 -27
- package/dist/src/ui/shared/printSuccess.js.map +0 -1
- package/docs/assets/demo1.gif +0 -0
- package/docs/assets/success1.png +0 -0
- /package/dist/src/core/{patterns.d.ts → scan/patterns.d.ts} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
1
|
import path from 'path';
|
|
2
|
+
import { label, value, accent, error, divider, header } from '../theme.js';
|
|
3
3
|
/**
|
|
4
4
|
* Prints message when dotenv-diff.config.json is successfully loaded.
|
|
5
5
|
* @param filePath The path to the loaded config file
|
|
@@ -8,20 +8,23 @@ import path from 'path';
|
|
|
8
8
|
export function printConfigLoaded(filePath) {
|
|
9
9
|
const fileName = path.basename(filePath);
|
|
10
10
|
console.log();
|
|
11
|
-
console.log(`${
|
|
11
|
+
console.log(`${accent('▸')} ${header('Config')}`);
|
|
12
|
+
console.log(`${divider}`);
|
|
13
|
+
console.log(`${label('Loaded'.padEnd(26))}${value(fileName)}`);
|
|
14
|
+
console.log(`${divider}`);
|
|
12
15
|
}
|
|
13
16
|
/**
|
|
14
17
|
* Prints message when dotenv-diff.config.json fails to parse.
|
|
15
18
|
* @param error The thrown error
|
|
16
19
|
* @returns void
|
|
17
20
|
*/
|
|
18
|
-
export function printConfigLoadError(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
21
|
+
export function printConfigLoadError(err) {
|
|
22
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
23
|
+
console.log();
|
|
24
|
+
console.log(`${error('▸')} ${header('Config Error')}`);
|
|
25
|
+
console.log(`${divider}`);
|
|
26
|
+
console.log(`${label('Failed to parse'.padEnd(26))}${error('dotenv-diff.config.json')}`);
|
|
27
|
+
console.log(`${label('Reason'.padEnd(26))}${error(message)}`);
|
|
28
|
+
console.log(`${divider}`);
|
|
26
29
|
}
|
|
27
30
|
//# sourceMappingURL=printConfigStatus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printConfigStatus.js","sourceRoot":"","sources":["../../../../src/ui/shared/printConfigStatus.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"printConfigStatus.js","sourceRoot":"","sources":["../../../../src/ui/shared/printConfigStatus.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE3E;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* @param dEx Array of duplicate keys in the example file with their counts.
|
|
7
7
|
* @param json Whether to output in JSON format.
|
|
8
8
|
* @param fix Whether fix mode is enabled (skips printing duplicates as they will be fixed).
|
|
9
|
+
* @param strict Whether strict mode is enabled.
|
|
9
10
|
* @returns void
|
|
10
11
|
*/
|
|
11
12
|
export declare function printDuplicates(envName: string, exampleName: string, dEnv: Array<{
|
|
@@ -14,5 +15,5 @@ export declare function printDuplicates(envName: string, exampleName: string, dE
|
|
|
14
15
|
}>, dEx: Array<{
|
|
15
16
|
key: string;
|
|
16
17
|
count: number;
|
|
17
|
-
}>, json: boolean, fix?: boolean): void;
|
|
18
|
+
}>, json: boolean, fix?: boolean, strict?: boolean): void;
|
|
18
19
|
//# sourceMappingURL=printDuplicates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printDuplicates.d.ts","sourceRoot":"","sources":["../../../../src/ui/shared/printDuplicates.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"printDuplicates.d.ts","sourceRoot":"","sources":["../../../../src/ui/shared/printDuplicates.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3C,GAAG,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1C,IAAI,EAAE,OAAO,EACb,GAAG,UAAQ,EACX,MAAM,UAAQ,GACb,IAAI,CA6BN"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { label, value, warning, error, divider, header } from '../theme.js';
|
|
2
2
|
/**
|
|
3
3
|
* Prints duplicate keys found in the environment and example files.
|
|
4
4
|
* @param envName The name of the environment file.
|
|
@@ -7,20 +7,31 @@ import chalk from 'chalk';
|
|
|
7
7
|
* @param dEx Array of duplicate keys in the example file with their counts.
|
|
8
8
|
* @param json Whether to output in JSON format.
|
|
9
9
|
* @param fix Whether fix mode is enabled (skips printing duplicates as they will be fixed).
|
|
10
|
+
* @param strict Whether strict mode is enabled.
|
|
10
11
|
* @returns void
|
|
11
12
|
*/
|
|
12
|
-
export function printDuplicates(envName, exampleName, dEnv, dEx, json, fix = false) {
|
|
13
|
+
export function printDuplicates(envName, exampleName, dEnv, dEx, json, fix = false, strict = false) {
|
|
13
14
|
if (json)
|
|
14
15
|
return;
|
|
16
|
+
const indicator = strict ? error('▸') : warning('▸');
|
|
15
17
|
if (dEnv.length && !fix) {
|
|
16
|
-
console.log(
|
|
17
|
-
|
|
18
|
+
console.log();
|
|
19
|
+
console.log(`${indicator} ${header(`Duplicate keys in ${envName}`)}`);
|
|
20
|
+
console.log(`${divider}`);
|
|
21
|
+
for (const { key, count } of dEnv) {
|
|
22
|
+
console.log(`${label(key.padEnd(26))}${value(`${count} occurrences`)}`);
|
|
23
|
+
}
|
|
24
|
+
console.log(`${divider}`);
|
|
18
25
|
console.log();
|
|
19
26
|
}
|
|
20
27
|
if (dEx.length) {
|
|
21
|
-
console.log(chalk.yellow(`⚠️ Duplicate keys in ${exampleName} (last occurrence wins):`));
|
|
22
|
-
dEx.forEach(({ key, count }) => console.log(chalk.yellow(` - ${key} (${count} occurrences)`)));
|
|
23
28
|
console.log();
|
|
29
|
+
console.log(`${indicator} ${header(`Duplicate keys in ${exampleName}`)}`);
|
|
30
|
+
console.log(`${divider}`);
|
|
31
|
+
for (const { key, count } of dEx) {
|
|
32
|
+
console.log(`${label(key.padEnd(26))}${value(`${count} occurrences`)}`);
|
|
33
|
+
}
|
|
34
|
+
console.log(`${divider}`);
|
|
24
35
|
}
|
|
25
36
|
}
|
|
26
37
|
//# sourceMappingURL=printDuplicates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printDuplicates.js","sourceRoot":"","sources":["../../../../src/ui/shared/printDuplicates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"printDuplicates.js","sourceRoot":"","sources":["../../../../src/ui/shared/printDuplicates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,WAAmB,EACnB,IAA2C,EAC3C,GAA0C,EAC1C,IAAa,EACb,GAAG,GAAG,KAAK,EACX,MAAM,GAAG,KAAK;IAEd,IAAI,IAAI;QAAE,OAAO;IAEjB,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,MAAM,CAAC,qBAAqB,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;QAE1B,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,MAAM,CAAC,qBAAqB,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;QAE1B,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -15,27 +15,27 @@ export function printFixTips(filtered, envNotIgnored, json, fix) {
|
|
|
15
15
|
let tip = null;
|
|
16
16
|
if (hasMissing && hasDupEnv && envNotIgnored) {
|
|
17
17
|
tip =
|
|
18
|
-
'
|
|
18
|
+
'Tip: Run with `--fix` to add missing keys, remove duplicates and add .env to .gitignore';
|
|
19
19
|
}
|
|
20
20
|
else if (hasMissing && hasDupEnv) {
|
|
21
|
-
tip = '
|
|
21
|
+
tip = 'Tip: Run with `--fix` to add missing keys and remove duplicates';
|
|
22
22
|
}
|
|
23
23
|
else if (hasDupEnv && envNotIgnored) {
|
|
24
24
|
tip =
|
|
25
|
-
'
|
|
25
|
+
'Tip: Run with `--fix` to remove duplicate keys and add .env to .gitignore';
|
|
26
26
|
}
|
|
27
27
|
else if (hasMissing && envNotIgnored) {
|
|
28
28
|
tip =
|
|
29
|
-
'
|
|
29
|
+
'Tip: Run with `--fix` to add missing keys and add .env to .gitignore';
|
|
30
30
|
}
|
|
31
31
|
else if (hasMissing) {
|
|
32
|
-
tip = '
|
|
32
|
+
tip = 'Tip: Run with `--fix` to add missing keys';
|
|
33
33
|
}
|
|
34
34
|
else if (hasDupEnv) {
|
|
35
|
-
tip = '
|
|
35
|
+
tip = 'Tip: Run with `--fix` to remove duplicate keys';
|
|
36
36
|
}
|
|
37
37
|
else if (envNotIgnored) {
|
|
38
|
-
tip = '
|
|
38
|
+
tip = 'Tip: Run with `--fix` to ensure .env is added to .gitignore';
|
|
39
39
|
}
|
|
40
40
|
if (tip) {
|
|
41
41
|
console.log(chalk.gray(tip));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printFixTips.js","sourceRoot":"","sources":["../../../../src/ui/shared/printFixTips.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAkB,EAClB,aAAsB,EACtB,IAAa,EACb,GAAY;IAEZ,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO;IAExB,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpD,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,IAAI,UAAU,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QAC7C,GAAG;YACD,
|
|
1
|
+
{"version":3,"file":"printFixTips.js","sourceRoot":"","sources":["../../../../src/ui/shared/printFixTips.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAkB,EAClB,aAAsB,EACtB,IAAa,EACb,GAAY;IAEZ,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO;IAExB,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpD,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,IAAI,UAAU,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QAC7C,GAAG;YACD,yFAAyF,CAAC;IAC9F,CAAC;SAAM,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QACnC,GAAG,GAAG,iEAAiE,CAAC;IAC1E,CAAC;SAAM,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,GAAG;YACD,2EAA2E,CAAC;IAChF,CAAC;SAAM,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;QACvC,GAAG;YACD,sEAAsE,CAAC;IAC3E,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,GAAG,GAAG,2CAA2C,CAAC;IACpD,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,GAAG,GAAG,gDAAgD,CAAC;IACzD,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACzB,GAAG,GAAG,6DAA6D,CAAC;IACtE,CAAC;IAED,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -7,6 +7,8 @@ interface GitignoreWarningOptions {
|
|
|
7
7
|
envFile: string;
|
|
8
8
|
/** The reason for the gitignore warning */
|
|
9
9
|
reason: GitignoreIssue;
|
|
10
|
+
/** Whether strict mode is enabled */
|
|
11
|
+
strict?: boolean;
|
|
10
12
|
/** Optional custom log function (defaults to console.log) */
|
|
11
13
|
log?: (msg: string) => void;
|
|
12
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printGitignore.d.ts","sourceRoot":"","sources":["../../../../src/ui/shared/printGitignore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"printGitignore.d.ts","sourceRoot":"","sources":["../../../../src/ui/shared/printGitignore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D;;GAEG;AACH,UAAU,uBAAuB;IAC/B,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,MAAM,EAAE,cAAc,CAAC;IACvB,qCAAqC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAiB5E"}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
1
|
import { GITIGNORE_ISSUES } from '../../config/constants.js';
|
|
2
|
+
import { label, value, warning, error, divider, header } from '../theme.js';
|
|
3
3
|
/**
|
|
4
4
|
* Logs a warning about .env not being ignored by Git.
|
|
5
5
|
* @param options - Options for the gitignore warning.
|
|
6
6
|
* @returns void
|
|
7
7
|
*/
|
|
8
8
|
export function printGitignoreWarning(options) {
|
|
9
|
-
const { envFile, reason, log = console.log } = options;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
9
|
+
const { envFile, reason, strict = false, log = console.log } = options;
|
|
10
|
+
const indicator = strict ? error('▸') : warning('▸');
|
|
11
|
+
const issue = reason === GITIGNORE_ISSUES.NO_GITIGNORE
|
|
12
|
+
? 'no .gitignore found'
|
|
13
|
+
: 'not ignored by git';
|
|
14
|
+
log('');
|
|
15
|
+
log(`${indicator} ${header('Gitignore warning')}`);
|
|
16
|
+
log(`${divider}`);
|
|
17
|
+
log(`${label('File'.padEnd(26))}${(strict ? error : warning)(envFile)}`);
|
|
18
|
+
log(`${label('Issue'.padEnd(26))}${(strict ? error : warning)(issue)}`);
|
|
19
|
+
log(`${label('Suggestion'.padEnd(26))}${value(`add ${envFile} to .gitignore`)}`);
|
|
20
|
+
log(`${divider}`);
|
|
20
21
|
}
|
|
21
22
|
//# sourceMappingURL=printGitignore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printGitignore.js","sourceRoot":"","sources":["../../../../src/ui/shared/printGitignore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"printGitignore.js","sourceRoot":"","sources":["../../../../src/ui/shared/printGitignore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgB5E;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgC;IACpE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAEvE,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAErD,MAAM,KAAK,GACT,MAAM,KAAK,gBAAgB,CAAC,YAAY;QACtC,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,oBAAoB,CAAC;IAE3B,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,GAAG,SAAS,IAAI,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAClB,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzE,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,OAAO,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACjF,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Printed when the config file is successfully created
|
|
3
|
-
* @param
|
|
3
|
+
* @param filePath - The path to the created config file
|
|
4
4
|
* @returns void
|
|
5
5
|
*/
|
|
6
|
-
export declare function printInitSuccess(
|
|
6
|
+
export declare function printInitSuccess(filePath: string): void;
|
|
7
7
|
/**
|
|
8
8
|
* Printed when config file already exists
|
|
9
|
-
* @param
|
|
9
|
+
* @param filePath - The path to the existing config file
|
|
10
10
|
* @returns void
|
|
11
11
|
*/
|
|
12
|
-
export declare function printInitExists(
|
|
12
|
+
export declare function printInitExists(filePath: string): void;
|
|
13
13
|
//# sourceMappingURL=printInitStatus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printInitStatus.d.ts","sourceRoot":"","sources":["../../../../src/ui/shared/printInitStatus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"printInitStatus.d.ts","sourceRoot":"","sources":["../../../../src/ui/shared/printInitStatus.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMtD"}
|
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { basename } from 'path';
|
|
2
|
+
import { label, value, accent, warning, divider, header } from '../theme.js';
|
|
2
3
|
/**
|
|
3
4
|
* Printed when the config file is successfully created
|
|
4
|
-
* @param
|
|
5
|
+
* @param filePath - The path to the created config file
|
|
5
6
|
* @returns void
|
|
6
7
|
*/
|
|
7
|
-
export function printInitSuccess(
|
|
8
|
-
console.log();
|
|
9
|
-
console.log(chalk.green('✅ Created dotenv-diff.config.json'));
|
|
10
|
-
console.log(chalk.dim(` → ${path}`));
|
|
8
|
+
export function printInitSuccess(filePath) {
|
|
11
9
|
console.log();
|
|
10
|
+
console.log(`${accent('▸')} ${header('Config created')}`);
|
|
11
|
+
console.log(`${divider}`);
|
|
12
|
+
console.log(`${label('Path'.padEnd(26))}${value(basename(filePath))}`);
|
|
13
|
+
console.log(`${divider}`);
|
|
12
14
|
}
|
|
13
15
|
/**
|
|
14
16
|
* Printed when config file already exists
|
|
15
|
-
* @param
|
|
17
|
+
* @param filePath - The path to the existing config file
|
|
16
18
|
* @returns void
|
|
17
19
|
*/
|
|
18
|
-
export function printInitExists(
|
|
19
|
-
console.log();
|
|
20
|
-
console.log(chalk.yellow('⚠️ dotenv-diff.config.json already exists.'));
|
|
21
|
-
console.log(chalk.dim(` → ${path}`));
|
|
20
|
+
export function printInitExists(filePath) {
|
|
22
21
|
console.log();
|
|
22
|
+
console.log(`${warning('▸')} ${header('Config already exists')}`);
|
|
23
|
+
console.log(`${divider}`);
|
|
24
|
+
console.log(`${label('Path'.padEnd(26))}${value(basename(filePath))}`);
|
|
25
|
+
console.log(`${divider}`);
|
|
23
26
|
}
|
|
24
27
|
//# sourceMappingURL=printInitStatus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printInitStatus.js","sourceRoot":"","sources":["../../../../src/ui/shared/printInitStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"printInitStatus.js","sourceRoot":"","sources":["../../../../src/ui/shared/printInitStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE7E;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printOptionErrors.d.ts","sourceRoot":"","sources":["../../../../src/ui/shared/printOptionErrors.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EAAE,EACb,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,KAAK,
|
|
1
|
+
{"version":3,"file":"printOptionErrors.d.ts","sourceRoot":"","sources":["../../../../src/ui/shared/printOptionErrors.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EAAE,EACb,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,KAAK,CASP;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAOxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { label, value, warning, error, divider, header } from '../theme.js';
|
|
2
2
|
/**
|
|
3
3
|
* Prints an error for invalid --only categories and exits.
|
|
4
4
|
* @param flagName - The name of the flag.
|
|
@@ -6,8 +6,13 @@ import chalk from 'chalk';
|
|
|
6
6
|
* @param allowed - The allowed values.
|
|
7
7
|
*/
|
|
8
8
|
export function printInvalidCategory(flagName, bad, allowed) {
|
|
9
|
-
console.
|
|
10
|
-
|
|
9
|
+
console.log();
|
|
10
|
+
console.log(`${error('▸')} ${header('Invalid flag')}`);
|
|
11
|
+
console.log(`${divider}`);
|
|
12
|
+
console.log(`${label('Flag'.padEnd(26))}${error(flagName)}`);
|
|
13
|
+
console.log(`${label('Invalid values'.padEnd(26))}${error(bad.join(', '))}`);
|
|
14
|
+
console.log(`${label('Allowed'.padEnd(26))}${value(allowed.join(', '))}`);
|
|
15
|
+
console.log(`${divider}`);
|
|
11
16
|
process.exit(1);
|
|
12
17
|
}
|
|
13
18
|
/**
|
|
@@ -15,7 +20,11 @@ export function printInvalidCategory(flagName, bad, allowed) {
|
|
|
15
20
|
* @param pattern - The invalid regex pattern.
|
|
16
21
|
*/
|
|
17
22
|
export function printInvalidRegex(pattern) {
|
|
18
|
-
console.
|
|
23
|
+
console.log();
|
|
24
|
+
console.log(`${error('▸')} ${header('Invalid regex')}`);
|
|
25
|
+
console.log(`${divider}`);
|
|
26
|
+
console.log(`${label('Pattern'.padEnd(26))}${error(pattern)}`);
|
|
27
|
+
console.log(`${divider}`);
|
|
19
28
|
process.exit(1);
|
|
20
29
|
}
|
|
21
30
|
/**
|
|
@@ -23,6 +32,11 @@ export function printInvalidRegex(pattern) {
|
|
|
23
32
|
* @returns void
|
|
24
33
|
*/
|
|
25
34
|
export function printCiYesWarning() {
|
|
26
|
-
console.log(
|
|
35
|
+
console.log();
|
|
36
|
+
console.log(`${warning('▸')} ${header('Flag conflict')}`);
|
|
37
|
+
console.log(`${divider}`);
|
|
38
|
+
console.log(`${label('Issue'.padEnd(26))}${warning('Both --ci and --yes provided')}`);
|
|
39
|
+
console.log(`${label('Resolution'.padEnd(26))}${value('proceeding with --yes')}`);
|
|
40
|
+
console.log(`${divider}`);
|
|
27
41
|
}
|
|
28
42
|
//# sourceMappingURL=printOptionErrors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printOptionErrors.js","sourceRoot":"","sources":["../../../../src/ui/shared/printOptionErrors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"printOptionErrors.js","sourceRoot":"","sources":["../../../../src/ui/shared/printOptionErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,GAAa,EACb,OAA0B;IAE1B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const dim: import("chalk").ChalkInstance;
|
|
2
|
+
export declare const label: import("chalk").ChalkInstance;
|
|
3
|
+
export declare const value: import("chalk").ChalkInstance;
|
|
4
|
+
export declare const accent: import("chalk").ChalkInstance;
|
|
5
|
+
export declare const warning: import("chalk").ChalkInstance;
|
|
6
|
+
export declare const error: import("chalk").ChalkInstance;
|
|
7
|
+
export declare const divider: string;
|
|
8
|
+
export declare const header: import("chalk").ChalkInstance;
|
|
9
|
+
/**
|
|
10
|
+
* Wraps framework warning reasons to a max line length, indenting wrapped lines to align with the start of the reason text.
|
|
11
|
+
* @param reason The warning reason text to wrap
|
|
12
|
+
* @param indent The number of spaces to indent wrapped lines (should align with the start of the reason text in the output)
|
|
13
|
+
* @returns The wrapped reason text with newlines and indentation as needed
|
|
14
|
+
*/
|
|
15
|
+
export declare function wrapReason(reason: string, indent: number): string;
|
|
16
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/ui/theme.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG,+BAA2B,CAAC;AAC5C,eAAO,MAAM,KAAK,+BAAyB,CAAC;AAC5C,eAAO,MAAM,KAAK,+BAA8B,CAAC;AACjD,eAAO,MAAM,MAAM,+BAAwB,CAAC;AAC5C,eAAO,MAAM,OAAO,+BAAuB,CAAC;AAC5C,eAAO,MAAM,KAAK,+BAAyB,CAAC;AAC5C,eAAO,MAAM,OAAO,QAAsB,CAAC;AAC3C,eAAO,MAAM,MAAM,+BAAoB,CAAC;AAQxC;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBjE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const dim = chalk.hex('#555555');
|
|
3
|
+
export const label = chalk.hex('#888888');
|
|
4
|
+
export const value = chalk.hex('#e0e0e0').bold;
|
|
5
|
+
export const accent = chalk.hex('#00d4aa');
|
|
6
|
+
export const warning = chalk.hex('#ffae42');
|
|
7
|
+
export const error = chalk.hex('#ff4d4d');
|
|
8
|
+
export const divider = dim('─'.repeat(50));
|
|
9
|
+
export const header = chalk.white.bold;
|
|
10
|
+
/**
|
|
11
|
+
* This is the maximum line length for reason text in warnings.
|
|
12
|
+
* If a reason exceeds this length, it will be wrapped to the next line with indentation.
|
|
13
|
+
*/
|
|
14
|
+
const REASON_MAX = 24;
|
|
15
|
+
/**
|
|
16
|
+
* Wraps framework warning reasons to a max line length, indenting wrapped lines to align with the start of the reason text.
|
|
17
|
+
* @param reason The warning reason text to wrap
|
|
18
|
+
* @param indent The number of spaces to indent wrapped lines (should align with the start of the reason text in the output)
|
|
19
|
+
* @returns The wrapped reason text with newlines and indentation as needed
|
|
20
|
+
*/
|
|
21
|
+
export function wrapReason(reason, indent) {
|
|
22
|
+
if (reason.length <= REASON_MAX)
|
|
23
|
+
return reason;
|
|
24
|
+
const pad = ' '.repeat(indent);
|
|
25
|
+
const words = reason.split(' ');
|
|
26
|
+
const lines = [];
|
|
27
|
+
let current = '';
|
|
28
|
+
for (const word of words) {
|
|
29
|
+
if ((current + word).length > REASON_MAX) {
|
|
30
|
+
lines.push(current.trimEnd());
|
|
31
|
+
current = word + ' ';
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
current += word + ' ';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (current.trim())
|
|
38
|
+
lines.push(current.trimEnd());
|
|
39
|
+
return lines.join(`\n${pad}`);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/ui/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,GAAG,GAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,KAAK,GAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,KAAK,GAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;AACjD,MAAM,CAAC,MAAM,MAAM,GAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,KAAK,GAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,MAAc;IACvD,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU;QAAE,OAAO,MAAM,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,IAAI,GAAG,GAAG,CAAC;QACxB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# dotenv-diff capabilities
|
|
2
|
+
|
|
3
|
+
`dotenv-diff` scans your codebase for environment variable usage and checks it against your env files.
|
|
4
|
+
|
|
5
|
+
This document focuses on one question: **what does the scanner actually check for?**
|
|
6
|
+
|
|
7
|
+
The tool recognises the following patterns:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// Node.js – dot and bracket notation
|
|
11
|
+
process.env.MY_KEY
|
|
12
|
+
process.env["MY_KEY"]
|
|
13
|
+
process.env['MY_KEY']
|
|
14
|
+
|
|
15
|
+
// Node.js – destructuring
|
|
16
|
+
const { MY_KEY } = process.env
|
|
17
|
+
const { MY_KEY: alias, OTHER_KEY = "fallback" } = process.env
|
|
18
|
+
|
|
19
|
+
// Vite / import.meta
|
|
20
|
+
import.meta.env.MY_KEY
|
|
21
|
+
import.meta.env["MY_KEY"]
|
|
22
|
+
import.meta.env['MY_KEY']
|
|
23
|
+
|
|
24
|
+
// SvelteKit – dynamic (env object)
|
|
25
|
+
import { env } from '$env/dynamic/private';
|
|
26
|
+
import { env } from '$env/dynamic/public';
|
|
27
|
+
env.MY_KEY
|
|
28
|
+
|
|
29
|
+
// SvelteKit – static (named imports)
|
|
30
|
+
import { MY_KEY } from '$env/static/private';
|
|
31
|
+
import { MY_KEY } from '$env/static/public';
|
|
32
|
+
MY_KEY
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Default scanned file types: .ts, .js, jsx, tsx, vue, .mjs, .mts, .cjs, .cts, .svelte
|
|
36
|
+
|
|
37
|
+
## What It Checks For
|
|
38
|
+
|
|
39
|
+
### 1 Missing Variables
|
|
40
|
+
|
|
41
|
+
Variables that are **used in code** but **not defined** in the selected env comparison file.
|
|
42
|
+
|
|
43
|
+
### 2 Unused Variables
|
|
44
|
+
|
|
45
|
+
Variables that are **defined in env files** but **never used** in the scanned codebase.
|
|
46
|
+
|
|
47
|
+
### 3 Duplicate Keys
|
|
48
|
+
|
|
49
|
+
Duplicate variable definitions inside env files (both main env and example env, when available).
|
|
50
|
+
|
|
51
|
+
### 4 Secret Detection
|
|
52
|
+
|
|
53
|
+
Potential secrets and sensitive values, including high-risk patterns.
|
|
54
|
+
|
|
55
|
+
### 5 Example File Secret Warnings
|
|
56
|
+
|
|
57
|
+
Potential secrets found in `.env.example` content.
|
|
58
|
+
|
|
59
|
+
### 6 Framework-Specific Misuse
|
|
60
|
+
|
|
61
|
+
Framework-aware warnings (for supported frameworks) around unsafe or incorrect env usage patterns.
|
|
62
|
+
|
|
63
|
+
### 7 Uppercase Naming Warnings
|
|
64
|
+
|
|
65
|
+
Variables that do not follow conventional uppercase env naming style.
|
|
66
|
+
|
|
67
|
+
### 8 Inconsistent Naming Warnings
|
|
68
|
+
|
|
69
|
+
Variables that appear to use mixed or conflicting naming patterns.
|
|
70
|
+
|
|
71
|
+
### 9 Console Log Exposure Warnings
|
|
72
|
+
|
|
73
|
+
Cases where environment-related values are logged with `console.log`.
|
|
74
|
+
|
|
75
|
+
### 10 Expiration Warnings
|
|
76
|
+
|
|
77
|
+
Warnings for environment values that look like expiring tokens/credentials or contain expiration metadata.
|
|
78
|
+
|
|
79
|
+
### 11 Gitignore Safety Check
|
|
80
|
+
|
|
81
|
+
Checks whether `.env` is properly ignored by `.gitignore`.
|
|
82
|
+
|
|
83
|
+
### 12 Health Score
|
|
84
|
+
|
|
85
|
+
A final score based on scan findings (missing, unused, duplicates, security warnings, and more).
|
package/docs/index.md
CHANGED
|
@@ -32,44 +32,11 @@ npx dotenv-diff
|
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
35
|
-
The extension recognises the following patterns:
|
|
36
|
-
|
|
37
|
-
```typescript
|
|
38
|
-
// Node.js – dot and bracket notation
|
|
39
|
-
process.env.MY_KEY
|
|
40
|
-
process.env["MY_KEY"]
|
|
41
|
-
process.env['MY_KEY']
|
|
42
|
-
|
|
43
|
-
// Node.js – destructuring
|
|
44
|
-
const { MY_KEY } = process.env
|
|
45
|
-
const { MY_KEY: alias, OTHER_KEY = "fallback" } = process.env
|
|
46
|
-
|
|
47
|
-
// Vite / import.meta
|
|
48
|
-
import.meta.env.MY_KEY
|
|
49
|
-
import.meta.env["MY_KEY"]
|
|
50
|
-
import.meta.env['MY_KEY']
|
|
51
|
-
|
|
52
|
-
// SvelteKit – dynamic (env object)
|
|
53
|
-
import { env } from '$env/dynamic/private';
|
|
54
|
-
import { env } from '$env/dynamic/public';
|
|
55
|
-
env.MY_KEY
|
|
56
|
-
|
|
57
|
-
// SvelteKit – static (named imports)
|
|
58
|
-
import { MY_KEY } from '$env/static/private';
|
|
59
|
-
import { MY_KEY } from '$env/static/public';
|
|
60
|
-
MY_KEY
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Only `UPPER_CASE` key names are matched, which is the standard convention for environment variables.
|
|
64
|
-
|
|
65
|
-
Default scanned file types: .ts, .js, jsx, tsx, vue, .mjs, .cjs, .svelte
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
35
|
## Table of Contents
|
|
70
36
|
|
|
71
37
|
| Document | Description |
|
|
72
38
|
|---|---|
|
|
39
|
+
| [Capabilities](./capabilities.md) | What the scanner checks for and how it works |and rules |
|
|
73
40
|
| [Configuration and Flags](./configuration_and_flags.md) | Full CLI/config reference for options and behavior |
|
|
74
41
|
| [Expiration Warnings](./expiration_warnings.md) | How `@expire` annotations work and strict mode integration |
|
|
75
42
|
| [Ignore Comments](./ignore_comments.md) | Suppress false positives with inline/block ignore markers |
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/core/patterns.ts"],"names":[],"mappings":"AAAA,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,aAAa,GAAG,iBAAiB,GAAG,WAAW,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,EAAE,CAAC;CAClD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,EAqGjC,CAAC;AAGF,eAAO,MAAM,0BAA0B,UAStC,CAAC;AAGF,eAAO,MAAM,wBAAwB,UAiBpC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/core/patterns.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAc;IACrC;;;;;;;;OAQG;IACH;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EACH,6EAA6E;QAC/E,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,gDAAgD;YAChD,uDAAuD;YACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,CAAC;KACF;IAED;;;;;;OAMG;IACH;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,mCAAmC;QAC1C,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YAExB,OAAO,OAAO;iBACX,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1B,MAAM,CAAC,OAAO,CAAC;iBACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,gCAAgC;gBAChC,oCAAoC;gBACpC,mCAAmC;gBACnC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;KACF;IAED;;;;;;;;OAQG;IACH;QACE,IAAI,EAAE,iBAAiB;QACvB,KAAK,EACH,uFAAuF;QACzF,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,CAAC;KACF;IAED,iCAAiC;IACjC,gDAAgD;IAChD,mDAAmD;IACnD;QACE,IAAI,EAAE,WAAoB;QAC1B,KAAK,EACH,2FAA2F;KAC9F;IAED,+BAA+B;IAC/B,uEAAuE;IACvE;QACE,IAAI,EAAE,WAAoB;QAC1B,KAAK,EAAE,oCAAoC;KAC5C;IAED,oDAAoD;IACpD,8CAA8C;IAC9C;QACE,IAAI,EAAE,WAAoB;QAC1B,KAAK,EACH,4FAA4F;KAC/F;IAED,8DAA8D;IAC9D,iCAAiC;IACjC;QACE,IAAI,EAAE,WAAoB;QAC1B,KAAK,EACH,6FAA6F;KAChG;CACF,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;CACP,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,cAAc;IACd,YAAY;IACZ,aAAa;IACb,UAAU;IACV,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,WAAW;CACZ,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Options for printing progress in the console.
|
|
3
|
-
*/
|
|
4
|
-
interface ProgressOptions {
|
|
5
|
-
/** Whether to output in JSON format (if true, progress will not be printed) */
|
|
6
|
-
isJson: boolean;
|
|
7
|
-
/** The current progress count (e.g., number of files scanned) */
|
|
8
|
-
current: number;
|
|
9
|
-
/** The total count for completion (e.g., total number of files to scan) */
|
|
10
|
-
total: number;
|
|
11
|
-
/** Optional label to display alongside the progress bar (default: 'Scanning') */
|
|
12
|
-
label?: string;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Prints a progress bar to stdout.
|
|
16
|
-
* Overwrites the same line using carriage return.
|
|
17
|
-
* @param options - Progress options including current, total, and label.
|
|
18
|
-
* @returns void
|
|
19
|
-
*/
|
|
20
|
-
export declare function printProgress(options: ProgressOptions): void;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=printProgress.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"printProgress.d.ts","sourceRoot":"","sources":["../../../../src/ui/scan/printProgress.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,UAAU,eAAe;IACvB,+EAA+E;IAC/E,MAAM,EAAE,OAAO,CAAC;IAChB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAmC5D"}
|