@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.
Files changed (75) hide show
  1. package/.envguardrc.example.json +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +320 -0
  4. package/dist/analyzer/envAnalyzer.d.ts +8 -0
  5. package/dist/analyzer/envAnalyzer.d.ts.map +1 -0
  6. package/dist/analyzer/envAnalyzer.js +112 -0
  7. package/dist/analyzer/envAnalyzer.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +52 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/check.d.ts +5 -0
  13. package/dist/commands/check.d.ts.map +1 -0
  14. package/dist/commands/check.js +9 -0
  15. package/dist/commands/check.js.map +1 -0
  16. package/dist/commands/fix.d.ts +4 -0
  17. package/dist/commands/fix.d.ts.map +1 -0
  18. package/dist/commands/fix.js +115 -0
  19. package/dist/commands/fix.js.map +1 -0
  20. package/dist/commands/scan.d.ts +9 -0
  21. package/dist/commands/scan.d.ts.map +1 -0
  22. package/dist/commands/scan.js +274 -0
  23. package/dist/commands/scan.js.map +1 -0
  24. package/dist/config/configLoader.d.ts +35 -0
  25. package/dist/config/configLoader.d.ts.map +1 -0
  26. package/dist/config/configLoader.js +141 -0
  27. package/dist/config/configLoader.js.map +1 -0
  28. package/dist/constants/knownEnvVars.d.ts +38 -0
  29. package/dist/constants/knownEnvVars.d.ts.map +1 -0
  30. package/dist/constants/knownEnvVars.js +111 -0
  31. package/dist/constants/knownEnvVars.js.map +1 -0
  32. package/dist/index.d.ts +5 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +25 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/parser/envParser.d.ts +13 -0
  37. package/dist/parser/envParser.d.ts.map +1 -0
  38. package/dist/parser/envParser.js +126 -0
  39. package/dist/parser/envParser.js.map +1 -0
  40. package/dist/parser/serverlessParser.d.ts +27 -0
  41. package/dist/parser/serverlessParser.d.ts.map +1 -0
  42. package/dist/parser/serverlessParser.js +162 -0
  43. package/dist/parser/serverlessParser.js.map +1 -0
  44. package/dist/scanner/codeScanner.d.ts +13 -0
  45. package/dist/scanner/codeScanner.d.ts.map +1 -0
  46. package/dist/scanner/codeScanner.js +157 -0
  47. package/dist/scanner/codeScanner.js.map +1 -0
  48. package/dist/types.d.ts +24 -0
  49. package/dist/types.d.ts.map +1 -0
  50. package/dist/types.js +3 -0
  51. package/dist/types.js.map +1 -0
  52. package/package.json +40 -0
  53. package/src/analyzer/envAnalyzer.ts +133 -0
  54. package/src/cli.ts +54 -0
  55. package/src/commands/check.ts +6 -0
  56. package/src/commands/fix.ts +104 -0
  57. package/src/commands/scan.ts +289 -0
  58. package/src/config/configLoader.ts +131 -0
  59. package/src/constants/knownEnvVars.ts +108 -0
  60. package/src/index.ts +4 -0
  61. package/src/parser/envParser.ts +114 -0
  62. package/src/parser/serverlessParser.ts +146 -0
  63. package/src/scanner/codeScanner.ts +148 -0
  64. package/src/types.ts +26 -0
  65. package/test-project/.envguardrc.json +7 -0
  66. package/test-project/src/lambda1/.env.example +11 -0
  67. package/test-project/src/lambda1/handler.js +14 -0
  68. package/test-project/src/lambda2/.env.example +9 -0
  69. package/test-project/src/lambda2/handler.js +11 -0
  70. package/test-project/src/lambda2/handler2.js +13 -0
  71. package/test-project/src/lambda2/serverless.yml +50 -0
  72. package/test-project/src/payment/.env.example +23 -0
  73. package/test-project/src/payment/payment.js +14 -0
  74. package/test-project/src/payment/server.ts +11 -0
  75. 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"}
@@ -0,0 +1,5 @@
1
+ export { CodeScanner } from './scanner/codeScanner';
2
+ export { EnvParser } from './parser/envParser';
3
+ export { EnvAnalyzer } from './analyzer/envAnalyzer';
4
+ export * from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}