@danielszlaski/envguard 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.
- package/.envguardrc.example.json +17 -0
- package/LICENSE +21 -0
- package/README.md +320 -0
- package/dist/analyzer/envAnalyzer.d.ts +8 -0
- package/dist/analyzer/envAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/envAnalyzer.js +112 -0
- package/dist/analyzer/envAnalyzer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/check.d.ts +5 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +9 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/fix.d.ts +4 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +115 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/scan.d.ts +9 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +274 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/config/configLoader.d.ts +35 -0
- package/dist/config/configLoader.d.ts.map +1 -0
- package/dist/config/configLoader.js +141 -0
- package/dist/config/configLoader.js.map +1 -0
- package/dist/constants/knownEnvVars.d.ts +38 -0
- package/dist/constants/knownEnvVars.d.ts.map +1 -0
- package/dist/constants/knownEnvVars.js +111 -0
- package/dist/constants/knownEnvVars.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/envParser.d.ts +13 -0
- package/dist/parser/envParser.d.ts.map +1 -0
- package/dist/parser/envParser.js +126 -0
- package/dist/parser/envParser.js.map +1 -0
- package/dist/parser/serverlessParser.d.ts +27 -0
- package/dist/parser/serverlessParser.d.ts.map +1 -0
- package/dist/parser/serverlessParser.js +162 -0
- package/dist/parser/serverlessParser.js.map +1 -0
- package/dist/scanner/codeScanner.d.ts +13 -0
- package/dist/scanner/codeScanner.d.ts.map +1 -0
- package/dist/scanner/codeScanner.js +157 -0
- package/dist/scanner/codeScanner.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
- package/src/analyzer/envAnalyzer.ts +133 -0
- package/src/cli.ts +54 -0
- package/src/commands/check.ts +6 -0
- package/src/commands/fix.ts +104 -0
- package/src/commands/scan.ts +289 -0
- package/src/config/configLoader.ts +131 -0
- package/src/constants/knownEnvVars.ts +108 -0
- package/src/index.ts +4 -0
- package/src/parser/envParser.ts +114 -0
- package/src/parser/serverlessParser.ts +146 -0
- package/src/scanner/codeScanner.ts +148 -0
- package/src/types.ts +26 -0
- package/test-project/.envguardrc.json +7 -0
- package/test-project/src/lambda1/.env.example +11 -0
- package/test-project/src/lambda1/handler.js +14 -0
- package/test-project/src/lambda2/.env.example +9 -0
- package/test-project/src/lambda2/handler.js +11 -0
- package/test-project/src/lambda2/handler2.js +13 -0
- package/test-project/src/lambda2/serverless.yml +50 -0
- package/test-project/src/payment/.env.example +23 -0
- package/test-project/src/payment/payment.js +14 -0
- package/test-project/src/payment/server.ts +11 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knownEnvVars.d.ts","sourceRoot":"","sources":["../../src/constants/knownEnvVars.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,aAkB5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,aAY9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU,aASrB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,yBAAyB,aAKpC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS,aAIpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB,aAM7B,CAAC;AAEH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Well-known environment variables that are provided by runtimes and don't need
|
|
4
|
+
* to be explicitly defined in .env or serverless.yml
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.KNOWN_RUNTIME_VARS = exports.TEST_VARS = exports.SERVERLESS_FRAMEWORK_VARS = exports.CI_CD_VARS = exports.NODEJS_RUNTIME_VARS = exports.AWS_PROVIDED_VARS = void 0;
|
|
8
|
+
exports.isKnownRuntimeVar = isKnownRuntimeVar;
|
|
9
|
+
exports.getRuntimeVarCategory = getRuntimeVarCategory;
|
|
10
|
+
/**
|
|
11
|
+
* AWS Lambda automatically provides these environment variables
|
|
12
|
+
* https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html
|
|
13
|
+
*/
|
|
14
|
+
exports.AWS_PROVIDED_VARS = new Set([
|
|
15
|
+
'AWS_REGION',
|
|
16
|
+
'AWS_DEFAULT_REGION',
|
|
17
|
+
'AWS_EXECUTION_ENV',
|
|
18
|
+
'AWS_LAMBDA_FUNCTION_NAME',
|
|
19
|
+
'AWS_LAMBDA_FUNCTION_VERSION',
|
|
20
|
+
'AWS_LAMBDA_FUNCTION_MEMORY_SIZE',
|
|
21
|
+
'AWS_LAMBDA_LOG_GROUP_NAME',
|
|
22
|
+
'AWS_LAMBDA_LOG_STREAM_NAME',
|
|
23
|
+
'AWS_ACCESS_KEY_ID',
|
|
24
|
+
'AWS_SECRET_ACCESS_KEY',
|
|
25
|
+
'AWS_SESSION_TOKEN',
|
|
26
|
+
'AWS_LAMBDA_RUNTIME_API',
|
|
27
|
+
'_HANDLER',
|
|
28
|
+
'_X_AMZN_TRACE_ID',
|
|
29
|
+
'LAMBDA_TASK_ROOT',
|
|
30
|
+
'LAMBDA_RUNTIME_DIR',
|
|
31
|
+
'TZ', // Timezone
|
|
32
|
+
]);
|
|
33
|
+
/**
|
|
34
|
+
* Common Node.js and development environment variables
|
|
35
|
+
*/
|
|
36
|
+
exports.NODEJS_RUNTIME_VARS = new Set([
|
|
37
|
+
'NODE_ENV',
|
|
38
|
+
'NODE_OPTIONS',
|
|
39
|
+
'PATH',
|
|
40
|
+
'HOME',
|
|
41
|
+
'USER',
|
|
42
|
+
'LANG',
|
|
43
|
+
'LC_ALL',
|
|
44
|
+
'PWD',
|
|
45
|
+
'OLDPWD',
|
|
46
|
+
'SHELL',
|
|
47
|
+
'TERM',
|
|
48
|
+
]);
|
|
49
|
+
/**
|
|
50
|
+
* CI/CD and testing environment variables
|
|
51
|
+
*/
|
|
52
|
+
exports.CI_CD_VARS = new Set([
|
|
53
|
+
'CI',
|
|
54
|
+
'CONTINUOUS_INTEGRATION',
|
|
55
|
+
'GITHUB_ACTIONS',
|
|
56
|
+
'GITLAB_CI',
|
|
57
|
+
'CIRCLECI',
|
|
58
|
+
'TRAVIS',
|
|
59
|
+
'JENKINS_URL',
|
|
60
|
+
'BUILDKITE',
|
|
61
|
+
]);
|
|
62
|
+
/**
|
|
63
|
+
* Serverless Framework and local development
|
|
64
|
+
*/
|
|
65
|
+
exports.SERVERLESS_FRAMEWORK_VARS = new Set([
|
|
66
|
+
'IS_OFFLINE',
|
|
67
|
+
'SLS_OFFLINE',
|
|
68
|
+
'SERVERLESS_STAGE',
|
|
69
|
+
'SERVERLESS_REGION',
|
|
70
|
+
]);
|
|
71
|
+
/**
|
|
72
|
+
* Testing framework variables
|
|
73
|
+
*/
|
|
74
|
+
exports.TEST_VARS = new Set([
|
|
75
|
+
'JEST_WORKER_ID',
|
|
76
|
+
'VITEST_WORKER_ID',
|
|
77
|
+
'MOCHA_COLORS',
|
|
78
|
+
]);
|
|
79
|
+
/**
|
|
80
|
+
* Combine all known runtime variables that don't need to be explicitly defined
|
|
81
|
+
*/
|
|
82
|
+
exports.KNOWN_RUNTIME_VARS = new Set([
|
|
83
|
+
...exports.AWS_PROVIDED_VARS,
|
|
84
|
+
...exports.NODEJS_RUNTIME_VARS,
|
|
85
|
+
...exports.CI_CD_VARS,
|
|
86
|
+
...exports.SERVERLESS_FRAMEWORK_VARS,
|
|
87
|
+
...exports.TEST_VARS,
|
|
88
|
+
]);
|
|
89
|
+
/**
|
|
90
|
+
* Check if a variable is a known runtime variable
|
|
91
|
+
*/
|
|
92
|
+
function isKnownRuntimeVar(varName) {
|
|
93
|
+
return exports.KNOWN_RUNTIME_VARS.has(varName);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get a human-readable category for a known runtime variable
|
|
97
|
+
*/
|
|
98
|
+
function getRuntimeVarCategory(varName) {
|
|
99
|
+
if (exports.AWS_PROVIDED_VARS.has(varName))
|
|
100
|
+
return 'AWS Lambda';
|
|
101
|
+
if (exports.NODEJS_RUNTIME_VARS.has(varName))
|
|
102
|
+
return 'Node.js Runtime';
|
|
103
|
+
if (exports.CI_CD_VARS.has(varName))
|
|
104
|
+
return 'CI/CD';
|
|
105
|
+
if (exports.SERVERLESS_FRAMEWORK_VARS.has(varName))
|
|
106
|
+
return 'Serverless Framework';
|
|
107
|
+
if (exports.TEST_VARS.has(varName))
|
|
108
|
+
return 'Testing';
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=knownEnvVars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knownEnvVars.js","sourceRoot":"","sources":["../../src/constants/knownEnvVars.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA0FH,8CAEC;AAKD,sDAOC;AAtGD;;;GAGG;AACU,QAAA,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,YAAY;IACZ,oBAAoB;IACpB,mBAAmB;IACnB,0BAA0B;IAC1B,6BAA6B;IAC7B,iCAAiC;IACjC,2BAA2B;IAC3B,4BAA4B;IAC5B,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,wBAAwB;IACxB,UAAU;IACV,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;IACpB,IAAI,EAAE,WAAW;CAClB,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,mBAAmB,GAAG,IAAI,GAAG,CAAC;IACzC,UAAU;IACV,cAAc;IACd,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,OAAO;IACP,MAAM;CACP,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,UAAU,GAAG,IAAI,GAAG,CAAC;IAChC,IAAI;IACJ,wBAAwB;IACxB,gBAAgB;IAChB,WAAW;IACX,UAAU;IACV,QAAQ;IACR,aAAa;IACb,WAAW;CACZ,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,yBAAyB,GAAG,IAAI,GAAG,CAAC;IAC/C,YAAY;IACZ,aAAa;IACb,kBAAkB;IAClB,mBAAmB;CACpB,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,SAAS,GAAG,IAAI,GAAG,CAAC;IAC/B,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;CACf,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACxC,GAAG,yBAAiB;IACpB,GAAG,2BAAmB;IACtB,GAAG,kBAAU;IACb,GAAG,iCAAyB;IAC5B,GAAG,iBAAS;CACb,CAAC,CAAC;AAEH;;GAEG;AACH,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,OAAO,0BAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IACnD,IAAI,yBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,YAAY,CAAC;IACxD,IAAI,2BAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAC/D,IAAI,kBAAU,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5C,IAAI,iCAAyB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,sBAAsB,CAAC;IAC1E,IAAI,iBAAS,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,cAAc,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.EnvAnalyzer = exports.EnvParser = exports.CodeScanner = void 0;
|
|
18
|
+
var codeScanner_1 = require("./scanner/codeScanner");
|
|
19
|
+
Object.defineProperty(exports, "CodeScanner", { enumerable: true, get: function () { return codeScanner_1.CodeScanner; } });
|
|
20
|
+
var envParser_1 = require("./parser/envParser");
|
|
21
|
+
Object.defineProperty(exports, "EnvParser", { enumerable: true, get: function () { return envParser_1.EnvParser; } });
|
|
22
|
+
var envAnalyzer_1 = require("./analyzer/envAnalyzer");
|
|
23
|
+
Object.defineProperty(exports, "EnvAnalyzer", { enumerable: true, get: function () { return envAnalyzer_1.EnvAnalyzer; } });
|
|
24
|
+
__exportStar(require("./types"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAAoD;AAA3C,0GAAA,WAAW,OAAA;AACpB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,sDAAqD;AAA5C,0GAAA,WAAW,OAAA;AACpB,0CAAwB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface EnvEntry {
|
|
2
|
+
key: string;
|
|
3
|
+
value: string;
|
|
4
|
+
comment?: string;
|
|
5
|
+
lineNumber: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class EnvParser {
|
|
8
|
+
parse(filePath: string): Map<string, EnvEntry>;
|
|
9
|
+
private isUserComment;
|
|
10
|
+
parseExample(filePath: string): Set<string>;
|
|
11
|
+
getExistingContent(filePath: string): string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=envParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envParser.d.ts","sourceRoot":"","sources":["../../src/parser/envParser.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACpB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;IAwD9C,OAAO,CAAC,aAAa;IAQrB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAgC3C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAM7C"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.EnvParser = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
class EnvParser {
|
|
39
|
+
parse(filePath) {
|
|
40
|
+
const envVars = new Map();
|
|
41
|
+
if (!fs.existsSync(filePath)) {
|
|
42
|
+
return envVars;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
46
|
+
const lines = content.split('\n');
|
|
47
|
+
let currentComment = '';
|
|
48
|
+
lines.forEach((line, index) => {
|
|
49
|
+
const trimmed = line.trim();
|
|
50
|
+
// Skip empty lines
|
|
51
|
+
if (!trimmed) {
|
|
52
|
+
currentComment = '';
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Capture comments
|
|
56
|
+
if (trimmed.startsWith('#')) {
|
|
57
|
+
currentComment = trimmed.substring(1).trim();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Parse key=value
|
|
61
|
+
const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);
|
|
62
|
+
if (match) {
|
|
63
|
+
const key = match[1];
|
|
64
|
+
let value = match[2];
|
|
65
|
+
// Remove quotes if present
|
|
66
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
67
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
68
|
+
value = value.slice(1, -1);
|
|
69
|
+
}
|
|
70
|
+
envVars.set(key, {
|
|
71
|
+
key,
|
|
72
|
+
value,
|
|
73
|
+
comment: this.isUserComment(currentComment) ? currentComment : undefined,
|
|
74
|
+
lineNumber: index + 1,
|
|
75
|
+
});
|
|
76
|
+
currentComment = '';
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error(`Error parsing ${filePath}:`, error);
|
|
82
|
+
}
|
|
83
|
+
return envVars;
|
|
84
|
+
}
|
|
85
|
+
isUserComment(comment) {
|
|
86
|
+
if (!comment)
|
|
87
|
+
return false;
|
|
88
|
+
// Filter out auto-generated comments to prevent duplicates when running fix multiple times
|
|
89
|
+
const autoGeneratedPrefixes = ['Used in:', 'Format:', 'Auto-generated by'];
|
|
90
|
+
return !autoGeneratedPrefixes.some(prefix => comment.startsWith(prefix));
|
|
91
|
+
}
|
|
92
|
+
parseExample(filePath) {
|
|
93
|
+
const envVars = new Set();
|
|
94
|
+
if (!fs.existsSync(filePath)) {
|
|
95
|
+
return envVars;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
99
|
+
const lines = content.split('\n');
|
|
100
|
+
lines.forEach(line => {
|
|
101
|
+
const trimmed = line.trim();
|
|
102
|
+
// Skip comments and empty lines
|
|
103
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Parse key=value
|
|
107
|
+
const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=/);
|
|
108
|
+
if (match) {
|
|
109
|
+
envVars.add(match[1]);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error(`Error parsing ${filePath}:`, error);
|
|
115
|
+
}
|
|
116
|
+
return envVars;
|
|
117
|
+
}
|
|
118
|
+
getExistingContent(filePath) {
|
|
119
|
+
if (!fs.existsSync(filePath)) {
|
|
120
|
+
return '';
|
|
121
|
+
}
|
|
122
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.EnvParser = EnvParser;
|
|
126
|
+
//# sourceMappingURL=envParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envParser.js","sourceRoot":"","sources":["../../src/parser/envParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ServerlessEnvEntry {
|
|
2
|
+
key: string;
|
|
3
|
+
valueExpression: string;
|
|
4
|
+
isReference: boolean;
|
|
5
|
+
source: string;
|
|
6
|
+
lineNumber?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class ServerlessParser {
|
|
9
|
+
/**
|
|
10
|
+
* Parse a serverless.yml file and extract environment variables
|
|
11
|
+
* from the provider.environment section
|
|
12
|
+
*/
|
|
13
|
+
parse(filePath: string): Map<string, ServerlessEnvEntry>;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a value references external sources like SSM, Secrets Manager, etc.
|
|
16
|
+
*/
|
|
17
|
+
private isReference;
|
|
18
|
+
/**
|
|
19
|
+
* Validate if a key is a valid environment variable name
|
|
20
|
+
*/
|
|
21
|
+
private isValidEnvVarName;
|
|
22
|
+
/**
|
|
23
|
+
* Find all serverless.yml files in a directory
|
|
24
|
+
*/
|
|
25
|
+
findServerlessFiles(rootDir: string): Promise<string[]>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=serverlessParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverlessParser.d.ts","sourceRoot":"","sources":["../../src/parser/serverlessParser.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAwBD,qBAAa,gBAAgB;IAC3B;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC;IA8DxD;;OAEG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACG,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAW9D"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ServerlessParser = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const yaml = __importStar(require("js-yaml"));
|
|
39
|
+
// CloudFormation intrinsic function types for js-yaml
|
|
40
|
+
const CF_SCHEMA = yaml.FAILSAFE_SCHEMA.extend([
|
|
41
|
+
new yaml.Type('!Ref', { kind: 'scalar', construct: (data) => ({ Ref: data }) }),
|
|
42
|
+
new yaml.Type('!GetAtt', { kind: 'scalar', construct: (data) => ({ 'Fn::GetAtt': data }) }),
|
|
43
|
+
new yaml.Type('!GetAtt', { kind: 'sequence', construct: (data) => ({ 'Fn::GetAtt': data }) }),
|
|
44
|
+
new yaml.Type('!Join', { kind: 'sequence', construct: (data) => ({ 'Fn::Join': data }) }),
|
|
45
|
+
new yaml.Type('!Sub', { kind: 'scalar', construct: (data) => ({ 'Fn::Sub': data }) }),
|
|
46
|
+
new yaml.Type('!Sub', { kind: 'sequence', construct: (data) => ({ 'Fn::Sub': data }) }),
|
|
47
|
+
new yaml.Type('!ImportValue', { kind: 'scalar', construct: (data) => ({ 'Fn::ImportValue': data }) }),
|
|
48
|
+
new yaml.Type('!Select', { kind: 'sequence', construct: (data) => ({ 'Fn::Select': data }) }),
|
|
49
|
+
new yaml.Type('!Split', { kind: 'sequence', construct: (data) => ({ 'Fn::Split': data }) }),
|
|
50
|
+
new yaml.Type('!FindInMap', { kind: 'sequence', construct: (data) => ({ 'Fn::FindInMap': data }) }),
|
|
51
|
+
new yaml.Type('!GetAZs', { kind: 'scalar', construct: (data) => ({ 'Fn::GetAZs': data }) }),
|
|
52
|
+
new yaml.Type('!Base64', { kind: 'scalar', construct: (data) => ({ 'Fn::Base64': data }) }),
|
|
53
|
+
new yaml.Type('!Equals', { kind: 'sequence', construct: (data) => ({ 'Fn::Equals': data }) }),
|
|
54
|
+
new yaml.Type('!Not', { kind: 'sequence', construct: (data) => ({ 'Fn::Not': data }) }),
|
|
55
|
+
new yaml.Type('!And', { kind: 'sequence', construct: (data) => ({ 'Fn::And': data }) }),
|
|
56
|
+
new yaml.Type('!Or', { kind: 'sequence', construct: (data) => ({ 'Fn::Or': data }) }),
|
|
57
|
+
new yaml.Type('!If', { kind: 'sequence', construct: (data) => ({ 'Fn::If': data }) }),
|
|
58
|
+
new yaml.Type('!Condition', { kind: 'scalar', construct: (data) => ({ Condition: data }) }),
|
|
59
|
+
]);
|
|
60
|
+
class ServerlessParser {
|
|
61
|
+
/**
|
|
62
|
+
* Parse a serverless.yml file and extract environment variables
|
|
63
|
+
* from the provider.environment section
|
|
64
|
+
*/
|
|
65
|
+
parse(filePath) {
|
|
66
|
+
const envVars = new Map();
|
|
67
|
+
if (!fs.existsSync(filePath)) {
|
|
68
|
+
return envVars;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
72
|
+
const doc = yaml.load(content, { schema: CF_SCHEMA });
|
|
73
|
+
if (!doc || typeof doc !== 'object') {
|
|
74
|
+
return envVars;
|
|
75
|
+
}
|
|
76
|
+
// Extract from provider.environment
|
|
77
|
+
const providerEnv = doc.provider?.environment;
|
|
78
|
+
if (providerEnv && typeof providerEnv === 'object') {
|
|
79
|
+
for (const [key, value] of Object.entries(providerEnv)) {
|
|
80
|
+
// Only include uppercase env var names (convention)
|
|
81
|
+
if (this.isValidEnvVarName(key)) {
|
|
82
|
+
const valueStr = String(value);
|
|
83
|
+
envVars.set(key, {
|
|
84
|
+
key,
|
|
85
|
+
valueExpression: valueStr,
|
|
86
|
+
isReference: this.isReference(valueStr),
|
|
87
|
+
source: filePath,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Also check for function-level environment variables
|
|
93
|
+
const functions = doc.functions;
|
|
94
|
+
if (functions && typeof functions === 'object') {
|
|
95
|
+
for (const [funcName, funcConfig] of Object.entries(functions)) {
|
|
96
|
+
const funcEnv = funcConfig?.environment;
|
|
97
|
+
if (funcEnv && typeof funcEnv === 'object') {
|
|
98
|
+
for (const [key, value] of Object.entries(funcEnv)) {
|
|
99
|
+
if (this.isValidEnvVarName(key)) {
|
|
100
|
+
const valueStr = String(value);
|
|
101
|
+
// Don't overwrite if already exists from provider level
|
|
102
|
+
if (!envVars.has(key)) {
|
|
103
|
+
envVars.set(key, {
|
|
104
|
+
key,
|
|
105
|
+
valueExpression: valueStr,
|
|
106
|
+
isReference: this.isReference(valueStr),
|
|
107
|
+
source: `${filePath} (function: ${funcName})`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error(`Error parsing ${filePath}:`, error);
|
|
118
|
+
}
|
|
119
|
+
return envVars;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if a value references external sources like SSM, Secrets Manager, etc.
|
|
123
|
+
*/
|
|
124
|
+
isReference(value) {
|
|
125
|
+
if (typeof value !== 'string') {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
// Check for common serverless variable patterns
|
|
129
|
+
const referencePatterns = [
|
|
130
|
+
/\$\{ssm:/, // SSM Parameter Store
|
|
131
|
+
/\$\{aws:reference/, // AWS reference
|
|
132
|
+
/\$\{file\(/, // File reference
|
|
133
|
+
/\$\{self:custom\./, // Custom variables
|
|
134
|
+
/\$\{opt:/, // CLI options
|
|
135
|
+
/\$\{env:/, // Environment variables
|
|
136
|
+
/\$\{cf:/, // CloudFormation outputs
|
|
137
|
+
];
|
|
138
|
+
return referencePatterns.some(pattern => pattern.test(value));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Validate if a key is a valid environment variable name
|
|
142
|
+
*/
|
|
143
|
+
isValidEnvVarName(key) {
|
|
144
|
+
// Environment variables should typically be uppercase with underscores
|
|
145
|
+
// But we'll be flexible and accept mixed case
|
|
146
|
+
return /^[A-Z_][A-Z0-9_]*$/i.test(key);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Find all serverless.yml files in a directory
|
|
150
|
+
*/
|
|
151
|
+
async findServerlessFiles(rootDir) {
|
|
152
|
+
const { glob } = await Promise.resolve().then(() => __importStar(require('glob')));
|
|
153
|
+
const files = await glob('**/serverless.{yml,yaml}', {
|
|
154
|
+
cwd: rootDir,
|
|
155
|
+
ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'],
|
|
156
|
+
absolute: true,
|
|
157
|
+
});
|
|
158
|
+
return files;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.ServerlessParser = ServerlessParser;
|
|
162
|
+
//# sourceMappingURL=serverlessParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverlessParser.js","sourceRoot":"","sources":["../../src/parser/serverlessParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class CodeScanner {
|
|
2
|
+
private rootDir;
|
|
3
|
+
private excludePatterns;
|
|
4
|
+
private serverlessParser;
|
|
5
|
+
constructor(rootDir: string, excludePatterns?: string[]);
|
|
6
|
+
scan(): Promise<Map<string, string[]>>;
|
|
7
|
+
scanFile(filePath: string): Promise<Set<string>>;
|
|
8
|
+
findEnvFiles(): Promise<string[]>;
|
|
9
|
+
findServerlessFiles(): Promise<string[]>;
|
|
10
|
+
scanServerlessFile(filePath: string): Map<string, any>;
|
|
11
|
+
scanByDirectory(): Promise<Map<string, Map<string, string[]>>>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=codeScanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeScanner.d.ts","sourceRoot":"","sources":["../../src/scanner/codeScanner.ts"],"names":[],"mappings":"AAKA,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,OAAO,EAAE,MAAM,EAAE,eAAe,GAAE,MAAM,EAA8C;IAM5F,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAqCtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAwChD,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAUjC,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAU9C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAIhD,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CA8BrE"}
|