lambda-live-debugger 0.0.101 → 0.0.103

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.
@@ -37,7 +37,13 @@ async function readConfig() {
37
37
  });
38
38
  }
39
39
  else {
40
- const configMerged = { ...configFromCliArgs, ...configFromConfigFile };
40
+ // remove all undefined values from the configFromCliArgs
41
+ for (const key in configFromCliArgs) {
42
+ if (configFromCliArgs[key] === undefined) {
43
+ delete configFromCliArgs[key];
44
+ }
45
+ }
46
+ const configMerged = { ...configFromConfigFile, ...configFromCliArgs };
41
47
  const debuggerId = await generateDebuggerId(!!configMerged.observable);
42
48
  setConfig({
43
49
  ...configMerged,
Binary file
@@ -9,6 +9,7 @@ import { Logger } from "../logger.mjs";
9
9
  import { Worker } from "node:worker_threads";
10
10
  import { getModuleDirname, getProjectDirname } from "../getDirname.mjs";
11
11
  import { Configuration } from "../configuration.mjs";
12
+ import { findNpmPath } from "../utils/findNpmPath.mjs";
12
13
  /**
13
14
  * Support for AWS CDK framework
14
15
  */
@@ -216,10 +217,13 @@ export class CdkFramework {
216
217
  };
217
218
  process.env.CDK_CONTEXT_JSON = JSON.stringify(CDK_CONTEXT_JSON);
218
219
  Logger.verbose(`[CDK] Context:`, JSON.stringify(CDK_CONTEXT_JSON, null, 2));
220
+ const awsCdkLibPath = await findNpmPath(path.join(getProjectDirname(), config.subfolder ?? "/"), "aws-cdk-lib");
221
+ Logger.verbose(`[CDK] aws-cdk-lib path: ${awsCdkLibPath}`);
219
222
  const lambdas = await new Promise((resolve, reject) => {
220
223
  const worker = new Worker(path.resolve(path.join(getModuleDirname(), "frameworks/cdkFrameworkWorker.mjs")), {
221
224
  workerData: {
222
225
  verbose: Configuration.config.verbose,
226
+ awsCdkLibPath,
223
227
  },
224
228
  });
225
229
  worker.on("message", (message) => {
@@ -1,9 +1,12 @@
1
1
  import { createRequire as topLevelCreateRequire } from "module";
2
2
  const require = topLevelCreateRequire(import.meta.url);
3
+ import path from "path";
4
+ import { fileURLToPath } from "node:url";
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
3
7
 
4
8
  import { workerData, parentPort } from "node:worker_threads";
5
9
  import fs from "fs/promises";
6
- import path from "path";
7
10
 
8
11
  import { Logger } from "../logger.mjs";
9
12
 
@@ -18,7 +21,9 @@ parentPort.on("message", async (data) => {
18
21
 
19
22
  // execute code to get the data into global.lambdas
20
23
  const codeFile = await fs.readFile(data.compileOutput, "utf8");
21
- const __dirname = path.resolve("./x"); // CDK needs this, pure magic
24
+
25
+ fixCdkPaths();
26
+
22
27
  eval(codeFile);
23
28
 
24
29
  if (!global.lambdas || global.lambdas?.length === 0) {
@@ -45,3 +50,53 @@ parentPort.on("message", async (data) => {
45
50
  );
46
51
  parentPort.postMessage(lambdas);
47
52
  });
53
+
54
+ /**
55
+ * Some paths are not resolved correctly in the CDK code, so we need to fix them
56
+ */
57
+ function fixCdkPaths() {
58
+ //const path = require("path"); // leave this line for manual debugging
59
+
60
+ // Get the path to the aws-cdk-lib module
61
+ let awsCdkLibPath = require.resolve("aws-cdk-lib");
62
+ awsCdkLibPath = awsCdkLibPath.replace("/index.js", "");
63
+ Logger.verbose(`[CDK] [Worker] aws-cdk-lib PATH ${awsCdkLibPath}`);
64
+
65
+ const pathsFix = {
66
+ "custom-resource-handlers/": `${awsCdkLibPath}/custom-resource-handlers/`,
67
+ };
68
+
69
+ // Create a proxy to intercept calls to the path module so we can fix paths
70
+ const pathProxy = new Proxy(path, {
71
+ get(target, prop) {
72
+ if (typeof target[prop] === "function") {
73
+ return function (...args) {
74
+ if (prop === "resolve") {
75
+ let resolvedPath = target[prop].apply(target, args);
76
+
77
+ for (const [key, value] of Object.entries(pathsFix)) {
78
+ if (resolvedPath.includes(key)) {
79
+ // replace the beginning of the path with the value
80
+ const i = resolvedPath.indexOf(key);
81
+ const newResolvedPath = `${value}${resolvedPath.substring(i + key.length)}`;
82
+ Logger.verbose(
83
+ `[CDK] [Worker] Fixing path ${resolvedPath} -> ${newResolvedPath}`
84
+ );
85
+ resolvedPath = newResolvedPath;
86
+ }
87
+ }
88
+
89
+ return resolvedPath;
90
+ }
91
+ return target[prop].apply(target, args);
92
+ };
93
+ }
94
+ return target[prop];
95
+ },
96
+ });
97
+
98
+ // Override the path module in the require cache
99
+ require.cache[require.resolve("path")] = {
100
+ exports: pathProxy,
101
+ };
102
+ }
@@ -13,7 +13,6 @@ import { VsCode } from "./vsCode.mjs";
13
13
  import path from "path";
14
14
  import { getRootFolder } from "./utils/getRootFolder.mjs";
15
15
  import fs from "fs/promises";
16
- import { outputFolder } from "./constants.mjs";
17
16
  import { Logger } from "./logger.mjs";
18
17
  import { getModuleDirname, getProjectDirname } from "./getDirname.mjs";
19
18
  import { LambdaConnection } from "./lambdaConnection.mjs";
@@ -56,8 +55,9 @@ async function run() {
56
55
  await InfraDeploy.removeInfrastructure();
57
56
  // await GitIgnore.removeFromGitIgnore();
58
57
  // delete folder .lldebugger
59
- Logger.verbose(`Removing ${outputFolder} folder...`);
60
- await fs.rm(outputFolder, { recursive: true });
58
+ const folder = path.join(getProjectDirname(), ".lldebugger");
59
+ Logger.verbose(`Removing ${folder} folder...`);
60
+ await fs.rm(folder, { recursive: true });
61
61
  if (Configuration.config.remove === "all") {
62
62
  await InfraDeploy.deleteLayer();
63
63
  }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Function to find the path of a module in the directory and parent directories
3
+ * @param {*} dir
4
+ * @param {*} moduleName
5
+ */
6
+ export declare function findNpmPath(dir: string, moduleName: string): Promise<string | undefined>;
@@ -0,0 +1,39 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ /**
4
+ * Function to find the path of a module in the directory and parent directories
5
+ * @param {*} dir
6
+ * @param {*} moduleName
7
+ */
8
+ export async function findNpmPath(dir, moduleName) {
9
+ if (dir === "/")
10
+ return undefined;
11
+ try {
12
+ await fs.access(path.join(dir, "package.json"));
13
+ const modulePath = await checkModuleInPackageJson(dir, moduleName);
14
+ if (modulePath) {
15
+ return modulePath;
16
+ }
17
+ }
18
+ catch {
19
+ // ignore, no package.json in this directory
20
+ }
21
+ return await findNpmPath(path.resolve(path.join(dir, "..")), moduleName);
22
+ }
23
+ /**
24
+ * Function to check if a module exists in package.json and return the path
25
+ * @param {*} dir
26
+ * @param {*} moduleName
27
+ * @returns
28
+ */
29
+ async function checkModuleInPackageJson(dir, moduleName) {
30
+ const packageJsonPath = path.join(dir, "package.json");
31
+ const packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf8"));
32
+ const dependencies = packageJson.dependencies || {};
33
+ const devDependencies = packageJson.devDependencies || {};
34
+ if (dependencies[moduleName] || devDependencies[moduleName]) {
35
+ const modulePath = path.join(dir, "node_modules", moduleName);
36
+ return modulePath;
37
+ }
38
+ return undefined;
39
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lambda-live-debugger",
3
- "version": "0.0.101",
3
+ "version": "0.0.103",
4
4
  "type": "module",
5
5
  "description": "Debug Lambda functions locally like it is running in the cloud",
6
6
  "repository": {