From 7f34f8a8b10065f9e444aa651a296aeabb8c9f33 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 07:50:46 +0100 Subject: [PATCH 01/17] feat: oss-serverless support --- .vscode/launch.json | 20 ++ package-lock.json | 289 +++++++++++++++--- package.json | 5 +- test/osls-basic.test.ts | 71 +++++ test/osls-basic/.gitignore | 6 + test/osls-basic/functions1.yml | 2 + test/osls-basic/functions2.yml | 2 + test/osls-basic/package.json | 19 ++ test/osls-basic/serverless.yml | 11 + .../services/testJsCommonJs/lambda.js | 40 +++ .../services/testJsCommonJs/package.json | 8 + .../services/testJsEsModule/lambda.js | 35 +++ .../services/testJsEsModule/package.json | 8 + 13 files changed, 470 insertions(+), 46 deletions(-) create mode 100644 test/osls-basic.test.ts create mode 100644 test/osls-basic/.gitignore create mode 100644 test/osls-basic/functions1.yml create mode 100644 test/osls-basic/functions2.yml create mode 100644 test/osls-basic/package.json create mode 100644 test/osls-basic/serverless.yml create mode 100755 test/osls-basic/services/testJsCommonJs/lambda.js create mode 100644 test/osls-basic/services/testJsCommonJs/package.json create mode 100755 test/osls-basic/services/testJsEsModule/lambda.js create mode 100644 test/osls-basic/services/testJsEsModule/package.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 5bcfd20..386b1e6 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -130,6 +130,26 @@ "type": "node", "cwd": "${workspaceRoot}/test/sls-esbuild-esm" }, + { + "name": "LLDebugger - OSLS basic", + "program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs", + "args": ["../../src/lldebugger.ts", "--stage=test"], + "request": "launch", + "skipFiles": ["/**"], + "console": "integratedTerminal", + "type": "node", + "cwd": "${workspaceRoot}/test/osls-basic" + }, + { + "name": "LLDebugger - OSLS basic - observability", + "program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs", + "args": ["../../src/lldebugger.ts", "--stage=test", "-o"], + "request": "launch", + "skipFiles": ["/**"], + "console": "integratedTerminal", + "type": "node", + "cwd": "${workspaceRoot}/test/osls-basic" + }, { "name": "LLDebugger - SAM basic", "program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs", diff --git a/package-lock.json b/package-lock.json index 7f00577..3d764f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,7 @@ "test/cdk-config", "test/sls-basic", "test/sls-esbuild", + "test/osls-basic", "test/sam-basic", "test/sam-alt", "test/terraform-basic" @@ -3436,21 +3437,6 @@ "node": ">=10" } }, - "node_modules/@serverless/dashboard-plugin/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@serverless/dashboard-plugin/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -9907,6 +9893,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -13990,21 +13991,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/open/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -14094,6 +14080,224 @@ "node": ">=0.10.0" } }, + "node_modules/osls": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/osls/-/osls-3.41.0.tgz", + "integrity": "sha512-GcrMSRYZFLuk60/pYPoF6bSwkLKZw5Fd8Cc+KTYWIDj8GmgY8V5Cb1YJgxJoYO6IbZgxzwXAcozE/MXd5o8wnA==", + "dev": true, + "dependencies": { + "@aws-sdk/client-api-gateway": "^3.588.0", + "@aws-sdk/client-cognito-identity-provider": "^3.588.0", + "@aws-sdk/client-eventbridge": "^3.588.0", + "@aws-sdk/client-iam": "^3.588.0", + "@aws-sdk/client-lambda": "^3.588.0", + "@aws-sdk/client-s3": "^3.588.0", + "@serverless/utils": "^6.13.1", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "archiver": "^5.3.1", + "aws-sdk": "^2.1404.0", + "bluebird": "^3.7.2", + "cachedir": "^2.3.0", + "chalk": "^4.1.2", + "child-process-ext": "^2.1.1", + "ci-info": "^3.9.0", + "cli-progress-footer": "^2.3.2", + "d": "^1.0.1", + "dayjs": "^1.11.8", + "decompress": "^4.2.1", + "dotenv": "^16.3.1", + "dotenv-expand": "^10.0.0", + "essentials": "^1.2.0", + "ext": "^1.7.0", + "fastest-levenshtein": "^1.0.16", + "filesize": "^10.0.7", + "fs-extra": "^10.1.0", + "get-stdin": "^8.0.0", + "globby": "^11.1.0", + "graceful-fs": "^4.2.11", + "https-proxy-agent": "^5.0.1", + "is-docker": "^2.2.1", + "js-yaml": "^4.1.0", + "json-cycle": "^1.5.0", + "json-refs": "^3.0.15", + "lodash": "^4.17.21", + "memoizee": "^0.4.15", + "micromatch": "^4.0.5", + "node-fetch": "^2.6.11", + "object-hash": "^3.0.0", + "open": "^8.4.2", + "process-utils": "^4.0.0", + "promise-queue": "^2.2.5", + "require-from-string": "^2.0.2", + "semver": "^7.5.3", + "signal-exit": "^3.0.7", + "strip-ansi": "^6.0.1", + "supports-color": "^8.1.1", + "timers-ext": "^0.1.7", + "type": "^2.7.2", + "untildify": "^4.0.0", + "uuid": "^9.0.0", + "ws": "^7.5.9", + "yaml-ast-parser": "0.0.43" + }, + "bin": { + "serverless": "bin/serverless.js", + "sls": "bin/serverless.js" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/osls-basic": { + "resolved": "test/osls-basic", + "link": true + }, + "node_modules/osls/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/osls/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/osls/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/osls/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/osls/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/osls/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/osls/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/osls/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/osls/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/osls/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/osls/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -15796,21 +16000,6 @@ "node": ">= 6" } }, - "node_modules/serverless/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/serverless/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -18656,6 +18845,16 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "test/osls-basic": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + }, + "devDependencies": { + "osls": "^3.41.0" + } + }, "test/sam-alt": { "version": "0.0.1", "dependencies": { diff --git a/package.json b/package.json index b42e072..3d9e18d 100755 --- a/package.json +++ b/package.json @@ -60,6 +60,8 @@ "test-sls-esbuild-cjs-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/sls-esbuild-cjs.test.ts", "test-sls-esbuild-esm": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/sls-esbuild-esm.test.ts", "test-sls-esbuild-esm-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/sls-esbuild-esm.test.ts", + "test-osls-basic": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/osls-basic.test.ts", + "test-osls-basic-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/osls-basic.test.ts", "test-sam-basic": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/sam-basic.test.ts", "test-sam-basic-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/sam-basic.test.ts", "test-sam-alt": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/sam-alt.test.ts", @@ -141,8 +143,9 @@ "test/cdk-config", "test/sls-basic", "test/sls-esbuild", + "test/osls-basic", "test/sam-basic", "test/sam-alt", "test/terraform-basic" ] -} +} \ No newline at end of file diff --git a/test/osls-basic.test.ts b/test/osls-basic.test.ts new file mode 100644 index 0000000..60b4f36 --- /dev/null +++ b/test/osls-basic.test.ts @@ -0,0 +1,71 @@ +import { expect, test, describe, beforeAll, afterAll } from 'vitest'; +import { ChildProcess } from 'child_process'; +import { startDebugger } from './utils/startDebugger.js'; +import { expectInfraRemoved } from './utils/expectInfraRemoved.js'; +import { expectInfraDeployed } from './utils/expectInfraDeployed.js'; +import { removeInfra } from './utils/removeInfra.js'; +import { exec } from 'child_process'; +import { promisify } from 'util'; +import { callLambda } from './utils/callLambda.js'; +import { getSamplePayload } from './utils/getSamplePayload.js'; +import { validateLocalResponse } from './utils/validateLocalResponse.js'; +import { getTestProjectFolder } from './utils/getTestProjectFolder.js'; + +export const execAsync = promisify(exec); + +const observableMode = process.env.OBSERVABLE_MODE === 'true'; + +describe('osls-basic', async () => { + const folder = await getTestProjectFolder('osls-basic'); + let lldProcess: ChildProcess | undefined; + + beforeAll(async () => { + if (process.env.CI === 'true' || process.env.RUN_TEST_FROM_CLI === 'true') { + lldProcess = await startDebugger(folder, ['--stage=test']); + } + }); + + afterAll(async () => { + // stop the debugger + lldProcess?.kill(); + }); + + test('check infra', async () => { + const lambdaName = 'lls-osls-basic-test-testJsCommonJs'; + await expectInfraDeployed(lambdaName); + }); + + test('call Lambda - testJsCommonJs', async () => { + const lambdaName = 'lls-osls-basic-test-testJsCommonJs'; + + const payload = getSamplePayload(lambdaName); + const response = await callLambda(lambdaName, payload); + + expect(response.inputEvent).toEqual(payload); + expect(response.runningLocally).toEqual(!observableMode); + if (observableMode) { + await validateLocalResponse(lambdaName, payload); + } + }); + + test('call Lambda - testJsEsModule', async () => { + const lambdaName = 'lls-osls-basic-test-testJsEsModule'; + + const payload = getSamplePayload(lambdaName); + const response = await callLambda(lambdaName, payload); + + expect(response.inputEvent).toEqual(payload); + expect(response.runningLocally).toEqual(!observableMode); + if (observableMode) { + await validateLocalResponse(lambdaName, payload); + } + }); + + test('remove infra', async () => { + if (process.env.CI === 'true' || process.env.RUN_TEST_FROM_CLI === 'true') { + await removeInfra(lldProcess, folder, ['--stage=test']); + const lambdaName = 'lls-osls-basic-test-testJsCommonJs'; + await expectInfraRemoved(lambdaName); + } + }); +}); diff --git a/test/osls-basic/.gitignore b/test/osls-basic/.gitignore new file mode 100644 index 0000000..2b48c8b --- /dev/null +++ b/test/osls-basic/.gitignore @@ -0,0 +1,6 @@ +# package directories +node_modules +jspm_packages + +# Serverless directories +.serverless \ No newline at end of file diff --git a/test/osls-basic/functions1.yml b/test/osls-basic/functions1.yml new file mode 100644 index 0000000..7226b5a --- /dev/null +++ b/test/osls-basic/functions1.yml @@ -0,0 +1,2 @@ +testJsEsModule: + handler: services/testJsEsModule/lambda.lambdaHandler diff --git a/test/osls-basic/functions2.yml b/test/osls-basic/functions2.yml new file mode 100644 index 0000000..52f57d7 --- /dev/null +++ b/test/osls-basic/functions2.yml @@ -0,0 +1,2 @@ +testJsCommonJs: + handler: services/testJsCommonJs/lambda.lambdaHandler diff --git a/test/osls-basic/package.json b/test/osls-basic/package.json new file mode 100644 index 0000000..139c3e2 --- /dev/null +++ b/test/osls-basic/package.json @@ -0,0 +1,19 @@ +{ + "name": "osls-basic", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "deploy": "serverless deploy --stage=test", + "destroy": "serverless remove --stage=test" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "osls": "^3.41.0" + }, + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + } +} \ No newline at end of file diff --git a/test/osls-basic/serverless.yml b/test/osls-basic/serverless.yml new file mode 100644 index 0000000..601cb31 --- /dev/null +++ b/test/osls-basic/serverless.yml @@ -0,0 +1,11 @@ +service: lls-osls-basic +frameworkVersion: '3' + +provider: + name: aws + runtime: nodejs20.x + region: eu-west-1 + +functions: + - ${file(./functions1.yml)} + - ${file(./functions2.yml)} diff --git a/test/osls-basic/services/testJsCommonJs/lambda.js b/test/osls-basic/services/testJsCommonJs/lambda.js new file mode 100755 index 0000000..4e37462 --- /dev/null +++ b/test/osls-basic/services/testJsCommonJs/lambda.js @@ -0,0 +1,40 @@ +const { STSClient, GetCallerIdentityCommand } = require('@aws-sdk/client-sts'); + +const stsClient = new STSClient({}); + +const lambdaHandler = async (event, context) => { + // Check context + const remainingTime = context.getRemainingTimeInMillis(); + if (remainingTime === undefined) { + throw new Error('Remaining time is undefined'); + } + + // check if SDK works + const command = new GetCallerIdentityCommand({}); + const identity = await stsClient.send(command); + + const response = { + inputEvent: event, + accountId: identity.Account, + runningLocally: process.env.IS_LOCAL === 'true', + }; + + if (process.env.IS_LOCAL === 'true') { + const fs = require('fs'); + const path = require('path'); + const filePath = path.join( + '..', + 'local_lambda_responses', + `${context.functionName}.json`, + ); + + fs.writeFileSync(filePath, JSON.stringify(response, null, 2)); + } + + return response; +}; + +// Export the lambda handler if needed, e.g., for unit testing +module.exports = { + lambdaHandler, +}; diff --git a/test/osls-basic/services/testJsCommonJs/package.json b/test/osls-basic/services/testJsCommonJs/package.json new file mode 100644 index 0000000..9a7eb49 --- /dev/null +++ b/test/osls-basic/services/testJsCommonJs/package.json @@ -0,0 +1,8 @@ +{ + "name": "sls-basic-test-js-commonjs", + "version": "1.0.0", + "type": "commonjs", + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + } +} diff --git a/test/osls-basic/services/testJsEsModule/lambda.js b/test/osls-basic/services/testJsEsModule/lambda.js new file mode 100755 index 0000000..e350820 --- /dev/null +++ b/test/osls-basic/services/testJsEsModule/lambda.js @@ -0,0 +1,35 @@ +import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts'; + +const stsClient = new STSClient({}); + +export const lambdaHandler = async (event, context) => { + // check context + const remainingTime = context.getRemainingTimeInMillis(); + if (remainingTime === undefined) { + throw new Error('Remaining time is undefined'); + } + + // check SDK works + const command = new GetCallerIdentityCommand({}); + const identity = await stsClient.send(command); + + const response = { + inputEvent: event, + accountId: identity.Account, + runningLocally: process.env.IS_LOCAL === 'true', + }; + + if (process.env.IS_LOCAL === 'true') { + const fs = await import('fs'); + const path = await import('path'); + const filePath = path.join( + '..', + 'local_lambda_responses', + `${context.functionName}.json`, + ); + + fs.writeFileSync(filePath, JSON.stringify(response, null, 2)); + } + + return response; +}; diff --git a/test/osls-basic/services/testJsEsModule/package.json b/test/osls-basic/services/testJsEsModule/package.json new file mode 100644 index 0000000..9722514 --- /dev/null +++ b/test/osls-basic/services/testJsEsModule/package.json @@ -0,0 +1,8 @@ +{ + "name": "sls-basic-test-js-esmodule", + "version": "1.0.0", + "type": "module", + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + } +} From 3adb7bc80e572e6492b8f032f057a6b8c2189d30 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 07:56:07 +0100 Subject: [PATCH 02/17] fix: CICD --- .github/workflows/common-test.yml | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/.github/workflows/common-test.yml b/.github/workflows/common-test.yml index 4820280..61f4768 100644 --- a/.github/workflows/common-test.yml +++ b/.github/workflows/common-test.yml @@ -263,6 +263,54 @@ jobs: - name: Test - observability mode run: OBSERVABLE_MODE=true npx vitest --retry 1 test/sls-esbuild-esm.test.ts + test-osls-basic: + runs-on: ubuntu-latest + concurrency: + group: test-osls-basic + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.node_version }} + registry-url: 'https://registry.npmjs.org' + - name: Install dependencies + run: npm ci + - name: Download build artifact + uses: actions/download-artifact@v4 + if: ${{ inputs.mode == 'build' }} + with: + name: dist + path: dist + - name: Install lambda-live-debugger globally + if: ${{ inputs.mode == 'global' }} + run: | + npm i lambda-live-debugger -g + npm i osls@3.41.0 -g + working-directory: test + - name: Install lambda-live-debugger locally + if: ${{ inputs.mode == 'local' }} + run: | + npm i lambda-live-debugger + working-directory: test + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-region: eu-west-1 + role-to-assume: ${{ secrets.AWS_ROLE }} + role-session-name: GitHubActions + - name: Destroy + run: npm run destroy + working-directory: test/osls-basic + continue-on-error: true + - name: Deploy + run: npm run deploy + working-directory: test/osls-basic + - name: Test + run: npx vitest --retry 1 test/sls-basic.test.ts + - name: Test - observability mode + run: OBSERVABLE_MODE=true npx vitest --retry 1 test/osls-basic.test.ts + test-sam-basic: runs-on: ubuntu-latest concurrency: From 05e02ded88588288d81a1863f88ea9066a379fba Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 08:00:15 +0100 Subject: [PATCH 03/17] fix: prettier --- package.json | 2 +- test/osls-basic/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3d9e18d..2b4c675 100755 --- a/package.json +++ b/package.json @@ -148,4 +148,4 @@ "test/sam-alt", "test/terraform-basic" ] -} \ No newline at end of file +} diff --git a/test/osls-basic/package.json b/test/osls-basic/package.json index 139c3e2..d2f8a92 100644 --- a/test/osls-basic/package.json +++ b/test/osls-basic/package.json @@ -16,4 +16,4 @@ "dependencies": { "@aws-sdk/client-sts": "^3.577.0" } -} \ No newline at end of file +} From 5dba63573d01828937c21427ae1c2ad7f7c369e7 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 08:08:23 +0100 Subject: [PATCH 04/17] fix: CICD --- .github/workflows/common-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/common-test.yml b/.github/workflows/common-test.yml index 61f4768..0e3d421 100644 --- a/.github/workflows/common-test.yml +++ b/.github/workflows/common-test.yml @@ -307,7 +307,7 @@ jobs: run: npm run deploy working-directory: test/osls-basic - name: Test - run: npx vitest --retry 1 test/sls-basic.test.ts + run: npx vitest --retry 1 test/osls-basic.test.ts - name: Test - observability mode run: OBSERVABLE_MODE=true npx vitest --retry 1 test/osls-basic.test.ts From 52176fe0f2e43ec0dded5ffbd386b9f71da30b1b Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 08:16:12 +0100 Subject: [PATCH 05/17] fix: CICD --- .github/workflows/common-test.yml | 2 ++ package-lock.json | 1 + package.json | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/common-test.yml b/.github/workflows/common-test.yml index 0e3d421..ff3af6a 100644 --- a/.github/workflows/common-test.yml +++ b/.github/workflows/common-test.yml @@ -276,6 +276,8 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Install dependencies run: npm ci + - name: Uninstall serverless + run: npm uninstall serverless - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} diff --git a/package-lock.json b/package-lock.json index 3d764f3..1a371dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,6 +79,7 @@ "eslint-config-prettier": "^9.1.0", "globals": "^15.9.0", "husky": "^9.1.4", + "osls": "^3.41.0", "prettier": "^3.3.3", "semantic-release": "^23.0.8", "serverless": "^3.38.0", diff --git a/package.json b/package.json index 2b4c675..ed32e3f 100755 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "prettier": "^3.3.3", "semantic-release": "^23.0.8", "serverless": "^3.38.0", + "osls": "^3.41.0", "serverless-esbuild": "^1.52.1", "tsx": "^4.7.1", "typescript-eslint": "^8.0.0", @@ -148,4 +149,4 @@ "test/sam-alt", "test/terraform-basic" ] -} +} \ No newline at end of file From 4b09177b944a9dfdebcd910d9843e5049a9b681d Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 08:18:27 +0100 Subject: [PATCH 06/17] fix: prettier --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ed32e3f..e6b725a 100755 --- a/package.json +++ b/package.json @@ -149,4 +149,4 @@ "test/sam-alt", "test/terraform-basic" ] -} \ No newline at end of file +} From e0b933a71efc89ffceb5dce28c550b9ae4860765 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 17:42:58 +0100 Subject: [PATCH 07/17] fix: dependencies --- test/package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/package.json b/test/package.json index 05695aa..6683a67 100644 --- a/test/package.json +++ b/test/package.json @@ -11,12 +11,9 @@ "devDependencies": { "@aws-sdk/client-lambda": "^3.577.0", "vitest": "^2.0.4", - "serverless": "^3.38.0", - "serverless-esbuild": "^1.52.1", "typescript": "~5.4.3" }, "dependencies": { - "esbuild": "^0.20.1", "@aws-sdk/client-iam": "^3.577.0", "@tsconfig/node20": "^20.1.4" } From 203dab372964aab71f0960bfd7b1d255bee1aa4c Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:07:04 +0100 Subject: [PATCH 08/17] fix: CICD tests --- .github/workflows/common-test.yml | 38 ++++++++++++++++++++++--------- README.md | 2 +- prepareForTest.js | 29 +++++++++++++++++++++++ tsconfig.json | 2 +- 4 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 prepareForTest.js diff --git a/.github/workflows/common-test.yml b/.github/workflows/common-test.yml index ff3af6a..a1d4ebc 100644 --- a/.github/workflows/common-test.yml +++ b/.github/workflows/common-test.yml @@ -37,7 +37,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci + run: | + node prepareForTest.js cdk-basic + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} @@ -84,7 +86,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci + run: | + node prepareForTest.js cdk-esm + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} @@ -131,7 +135,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci + run: | + node prepareForTest.js sls-basic + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} @@ -179,7 +185,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci + run: | + node prepareForTest.js sls-esbuild-cjs + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} @@ -227,7 +235,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci + run: | + node prepareForTest.js sls-esbuild-esm + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} @@ -275,9 +285,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci - - name: Uninstall serverless - run: npm uninstall serverless + run: | + node prepareForTest.js osls-basic + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} @@ -329,7 +339,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci + run: | + node prepareForTest.js sam-basic + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} @@ -380,7 +392,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci + run: | + node prepareForTest.js sam-alt + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} @@ -427,7 +441,9 @@ jobs: node-version: ${{ env.node_version }} registry-url: 'https://registry.npmjs.org' - name: Install dependencies - run: npm ci + run: | + node prepareForTest.js terraform-basic + npm i - name: Download build artifact uses: actions/download-artifact@v4 if: ${{ inputs.mode == 'build' }} diff --git a/README.md b/README.md index d4edadd..d7021c0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ This tool offers similar functionality to [SST](https://sst.dev/) and [Serverles It supports the following frameworks: - AWS CDK v2 -- Serverless Framework v3 (SLS) +- Serverless Framework v3 (SLS) and [`osls` fork](https://github.com/oss-serverless/serverless) - AWS Serverless Application Model (SAM) - Terraform - Any other framework or setup by implementing a simple function in TypeScript diff --git a/prepareForTest.js b/prepareForTest.js new file mode 100644 index 0000000..6cedcb8 --- /dev/null +++ b/prepareForTest.js @@ -0,0 +1,29 @@ +import { readFile, writeFile } from 'fs/promises'; +import { argv } from 'process'; + +async function modifyPackageJson(testCase) { + const filePath = 'package.json'; + + const data = await readFile(filePath, 'utf-8'); + const packageJson = JSON.parse(data); + + // Delete scripts and devDependencies nodes + delete packageJson.scripts; + delete packageJson.devDependencies; + + // Replace workspaces node with specified values + packageJson.workspaces = ['test', `test/${testCase}`]; + + // Write the modified package.json back to the file + await writeFile(filePath, JSON.stringify(packageJson, null, 2), 'utf-8'); + console.log(`Modified ${filePath} successfully!`); +} + +// Run the function with the provided file path and argument +const [testCase] = argv.slice(1); +if (!testCase) { + console.error('Usage: node prepareForTest.js '); + process.exit(1); +} + +modifyPackageJson(filePath, testCase); diff --git a/tsconfig.json b/tsconfig.json index b3f4705..4ea5d2b 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,5 +6,5 @@ "outDir": "./dist" }, "include": ["src/**/*", "test/**/*", "*.*", ".vitepress/**/*"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "prepareForTest.js"] } From 9f622e4609cdf97d0d0f47984d5447ccb80a83ab Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:10:00 +0100 Subject: [PATCH 09/17] fix: lint --- eslint.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/eslint.config.js b/eslint.config.js index 495a4b4..c70a734 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -14,6 +14,7 @@ export default [ '**/.aws-sam/**', 'src/extension/aws/*.js', '.vitepress/cache/**', + 'prepareForTest.js', ], }, { From aa25ca535143621efa498ce1ad91a732ec5d24c8 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:17:45 +0100 Subject: [PATCH 10/17] fix: CICD --- prepareForTest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prepareForTest.js b/prepareForTest.js index 6cedcb8..40313f6 100644 --- a/prepareForTest.js +++ b/prepareForTest.js @@ -26,4 +26,4 @@ if (!testCase) { process.exit(1); } -modifyPackageJson(filePath, testCase); +modifyPackageJson(testCase); From 96da83c63aaf5d50b3f239475d15ed46d62e4022 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:24:29 +0100 Subject: [PATCH 11/17] chore: add tests --- .vscode/launch.json | 40 +++++++++++++ package-lock.json | 24 ++++++-- package.json | 8 ++- test/osls-esbuild-cjs.test.ts | 58 +++++++++++++++++++ test/osls-esbuild-cjs/.gitignore | 6 ++ test/osls-esbuild-cjs/package.json | 23 ++++++++ test/osls-esbuild-cjs/serverless.yml | 20 +++++++ .../services/testTsCommonJs/lambda.ts | 36 ++++++++++++ .../services/testTsCommonJs/package.json | 8 +++ .../services/testTsCommonJs/tsconfig.json | 7 +++ test/osls-esbuild-esm.test.ts | 58 +++++++++++++++++++ test/osls-esbuild-esm/.gitignore | 6 ++ test/osls-esbuild-esm/package.json | 24 ++++++++ test/osls-esbuild-esm/serverless.yml | 24 ++++++++ .../services/testTsEsModule/lambda.ts | 35 +++++++++++ .../services/testTsEsModule/package.json | 11 ++++ .../services/testTsEsModule/tsconfig.json | 7 +++ test/osls-esbuild-esm/tsconfig.json | 7 +++ 18 files changed, 397 insertions(+), 5 deletions(-) create mode 100644 test/osls-esbuild-cjs.test.ts create mode 100644 test/osls-esbuild-cjs/.gitignore create mode 100644 test/osls-esbuild-cjs/package.json create mode 100644 test/osls-esbuild-cjs/serverless.yml create mode 100755 test/osls-esbuild-cjs/services/testTsCommonJs/lambda.ts create mode 100644 test/osls-esbuild-cjs/services/testTsCommonJs/package.json create mode 100755 test/osls-esbuild-cjs/services/testTsCommonJs/tsconfig.json create mode 100644 test/osls-esbuild-esm.test.ts create mode 100644 test/osls-esbuild-esm/.gitignore create mode 100644 test/osls-esbuild-esm/package.json create mode 100644 test/osls-esbuild-esm/serverless.yml create mode 100755 test/osls-esbuild-esm/services/testTsEsModule/lambda.ts create mode 100644 test/osls-esbuild-esm/services/testTsEsModule/package.json create mode 100755 test/osls-esbuild-esm/services/testTsEsModule/tsconfig.json create mode 100755 test/osls-esbuild-esm/tsconfig.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 386b1e6..f853065 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -150,6 +150,46 @@ "type": "node", "cwd": "${workspaceRoot}/test/osls-basic" }, + { + "name": "LLDebugger - OSLS EsBuild CJS", + "program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs", + "args": ["../../src/lldebugger.ts"], + "request": "launch", + "skipFiles": ["/**"], + "console": "integratedTerminal", + "type": "node", + "cwd": "${workspaceRoot}/test/osls-esbuild-cjs" + }, + { + "name": "LLDebugger - OSLS EsBuild CJS - observability", + "program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs", + "args": ["../../src/lldebugger.ts", "-o"], + "request": "launch", + "skipFiles": ["/**"], + "console": "integratedTerminal", + "type": "node", + "cwd": "${workspaceRoot}/test/osls-esbuild-cjs" + }, + { + "name": "LLDebugger - OSLS EsBuild ESM", + "program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs", + "args": ["../../src/lldebugger.ts"], + "request": "launch", + "skipFiles": ["/**"], + "console": "integratedTerminal", + "type": "node", + "cwd": "${workspaceRoot}/test/osls-esbuild-esm" + }, + { + "name": "LLDebugger - OSLS EsBuild ESM - observability", + "program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs", + "args": ["../../src/lldebugger.ts", "-o"], + "request": "launch", + "skipFiles": ["/**"], + "console": "integratedTerminal", + "type": "node", + "cwd": "${workspaceRoot}/test/osls-esbuild-esm" + }, { "name": "LLDebugger - SAM basic", "program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs", diff --git a/package-lock.json b/package-lock.json index 1a371dc..9442210 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,8 @@ "test/sls-basic", "test/sls-esbuild", "test/osls-basic", + "test/osls-esbuild", + "test/sls-esbuild-cjs", "test/sam-basic", "test/sam-alt", "test/terraform-basic" @@ -16273,6 +16275,10 @@ "resolved": "test/sls-basic", "link": true }, + "node_modules/sls-esbuild": { + "resolved": "test/sls-esbuild-cjs", + "link": true + }, "node_modules/sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -18759,13 +18765,10 @@ "license": "ISC", "dependencies": { "@aws-sdk/client-iam": "^3.577.0", - "@tsconfig/node20": "^20.1.4", - "esbuild": "^0.20.1" + "@tsconfig/node20": "^20.1.4" }, "devDependencies": { "@aws-sdk/client-lambda": "^3.577.0", - "serverless": "^3.38.0", - "serverless-esbuild": "^1.52.1", "typescript": "~5.4.3", "vitest": "^2.0.4" } @@ -18886,6 +18889,19 @@ "serverless": "^3.38.0" } }, + "test/sls-esbuild-cjs": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + }, + "devDependencies": { + "@tsconfig/node20": "^20.1.4", + "esbuild": "^0.20.2", + "serverless": "^3.38.0", + "serverless-esbuild": "^1.52.1" + } + }, "test/terraform-basic": { "version": "1.0.0", "license": "ISC", diff --git a/package.json b/package.json index e6b725a..b5dc034 100755 --- a/package.json +++ b/package.json @@ -62,6 +62,10 @@ "test-sls-esbuild-esm-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/sls-esbuild-esm.test.ts", "test-osls-basic": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/osls-basic.test.ts", "test-osls-basic-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/osls-basic.test.ts", + "test-osls-esbuild-cjs": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/osls-esbuild-cjs.test.ts", + "test-osls-esbuild-cjs-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/osls-esbuild-cjs.test.ts", + "test-osls-esbuild-esm": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/osls-esbuild-esm.test.ts", + "test-osls-esbuild-esm-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/osls-esbuild-esm.test.ts", "test-sam-basic": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/sam-basic.test.ts", "test-sam-basic-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/sam-basic.test.ts", "test-sam-alt": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/sam-alt.test.ts", @@ -145,8 +149,10 @@ "test/sls-basic", "test/sls-esbuild", "test/osls-basic", + "test/osls-esbuild", + "test/sls-esbuild-cjs", "test/sam-basic", "test/sam-alt", "test/terraform-basic" ] -} +} \ No newline at end of file diff --git a/test/osls-esbuild-cjs.test.ts b/test/osls-esbuild-cjs.test.ts new file mode 100644 index 0000000..3bf2cca --- /dev/null +++ b/test/osls-esbuild-cjs.test.ts @@ -0,0 +1,58 @@ +import { expect, test, describe, beforeAll, afterAll } from 'vitest'; +import { ChildProcess } from 'child_process'; +import { startDebugger } from './utils/startDebugger.js'; +import { expectInfraRemoved } from './utils/expectInfraRemoved.js'; +import { expectInfraDeployed } from './utils/expectInfraDeployed.js'; +import { removeInfra } from './utils/removeInfra.js'; +import { exec } from 'child_process'; +import { promisify } from 'util'; +import { callLambda } from './utils/callLambda.js'; +import { getSamplePayload } from './utils/getSamplePayload.js'; +import { validateLocalResponse } from './utils/validateLocalResponse.js'; +import { getTestProjectFolder } from './utils/getTestProjectFolder.js'; + +export const execAsync = promisify(exec); + +const observableMode = process.env.OBSERVABLE_MODE === 'true'; + +describe('osls-esbuild-cjs', async () => { + const folder = await getTestProjectFolder('osls-esbuild-cjs'); + let lldProcess: ChildProcess | undefined; + + beforeAll(async () => { + if (process.env.CI === 'true' || process.env.RUN_TEST_FROM_CLI === 'true') { + lldProcess = await startDebugger(folder); + } + }); + + afterAll(async () => { + // stop the debugger + lldProcess?.kill(); + }); + + test('check infra', async () => { + const lambdaName = 'lls-osls-esbuild-cjs-test-testTsCommonJs'; + await expectInfraDeployed(lambdaName); + }); + + test('call Lambda - testTsCommonJs', async () => { + const lambdaName = 'lls-osls-esbuild-cjs-test-testTsCommonJs'; + + const payload = getSamplePayload(lambdaName); + const response = await callLambda(lambdaName, payload); + + expect(response.inputEvent).toEqual(payload); + expect(response.runningLocally).toEqual(!observableMode); + if (observableMode) { + await validateLocalResponse(lambdaName, payload); + } + }); + + test('remove infra', async () => { + if (process.env.CI === 'true' || process.env.RUN_TEST_FROM_CLI === 'true') { + await removeInfra(lldProcess, folder); + const lambdaName = 'lls-osls-esbuild-cjs-test-testTsCommonJs'; + await expectInfraRemoved(lambdaName); + } + }); +}); diff --git a/test/osls-esbuild-cjs/.gitignore b/test/osls-esbuild-cjs/.gitignore new file mode 100644 index 0000000..2b48c8b --- /dev/null +++ b/test/osls-esbuild-cjs/.gitignore @@ -0,0 +1,6 @@ +# package directories +node_modules +jspm_packages + +# Serverless directories +.serverless \ No newline at end of file diff --git a/test/osls-esbuild-cjs/package.json b/test/osls-esbuild-cjs/package.json new file mode 100644 index 0000000..35bc802 --- /dev/null +++ b/test/osls-esbuild-cjs/package.json @@ -0,0 +1,23 @@ +{ + "name": "osls-esbuild", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "deploy": "serverless deploy", + "destroy": "serverless remove" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "esbuild": "^0.20.2", + "osls": "^3.41.0", + "serverless-esbuild": "^1.52.1", + "@tsconfig/node20": "^20.1.4" + }, + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + } +} \ No newline at end of file diff --git a/test/osls-esbuild-cjs/serverless.yml b/test/osls-esbuild-cjs/serverless.yml new file mode 100644 index 0000000..718a6fc --- /dev/null +++ b/test/osls-esbuild-cjs/serverless.yml @@ -0,0 +1,20 @@ +service: lls-osls-esbuild-cjs +frameworkVersion: '3' + +plugins: + - serverless-esbuild + +provider: + name: aws + runtime: nodejs20.x + region: eu-west-1 + stage: test + +custom: + esbuild: + bundle: true + minify: false + +functions: + testTsCommonJs: + handler: services/testTsCommonJs/lambda.lambdaHandler diff --git a/test/osls-esbuild-cjs/services/testTsCommonJs/lambda.ts b/test/osls-esbuild-cjs/services/testTsCommonJs/lambda.ts new file mode 100755 index 0000000..70bd2e6 --- /dev/null +++ b/test/osls-esbuild-cjs/services/testTsCommonJs/lambda.ts @@ -0,0 +1,36 @@ +import { Handler } from 'aws-lambda'; +import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts'; + +const stsClient = new STSClient({}); + +export const lambdaHandler: Handler = async (event, context) => { + // check context + const remainingTime = context.getRemainingTimeInMillis(); + if (remainingTime === undefined) { + throw new Error('Remaining time is undefined'); + } + + // check SDK works + const command = new GetCallerIdentityCommand({}); + const identity = await stsClient.send(command); + + const response = { + inputEvent: event, + accountId: identity.Account, + runningLocally: process.env.IS_LOCAL === 'true', + }; + + if (process.env.IS_LOCAL === 'true') { + const fs = await import('fs'); + const path = await import('path'); + const filePath = path.join( + '..', + 'local_lambda_responses', + `${context.functionName}.json`, + ); + + fs.writeFileSync(filePath, JSON.stringify(response, null, 2)); + } + + return response; +}; diff --git a/test/osls-esbuild-cjs/services/testTsCommonJs/package.json b/test/osls-esbuild-cjs/services/testTsCommonJs/package.json new file mode 100644 index 0000000..df873a2 --- /dev/null +++ b/test/osls-esbuild-cjs/services/testTsCommonJs/package.json @@ -0,0 +1,8 @@ +{ + "name": "sls-esbuild-test-ts-commonjs", + "version": "1.0.0", + "type": "commonjs", + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + } +} diff --git a/test/osls-esbuild-cjs/services/testTsCommonJs/tsconfig.json b/test/osls-esbuild-cjs/services/testTsCommonJs/tsconfig.json new file mode 100755 index 0000000..f48ef0e --- /dev/null +++ b/test/osls-esbuild-cjs/services/testTsCommonJs/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "compilerOptions": { + "moduleResolution": "node", + "module": "CommonJS" + } +} diff --git a/test/osls-esbuild-esm.test.ts b/test/osls-esbuild-esm.test.ts new file mode 100644 index 0000000..5677e63 --- /dev/null +++ b/test/osls-esbuild-esm.test.ts @@ -0,0 +1,58 @@ +import { expect, test, describe, beforeAll, afterAll } from 'vitest'; +import { ChildProcess } from 'child_process'; +import { startDebugger } from './utils/startDebugger.js'; +import { expectInfraRemoved } from './utils/expectInfraRemoved.js'; +import { expectInfraDeployed } from './utils/expectInfraDeployed.js'; +import { removeInfra } from './utils/removeInfra.js'; +import { exec } from 'child_process'; +import { promisify } from 'util'; +import { callLambda } from './utils/callLambda.js'; +import { getSamplePayload } from './utils/getSamplePayload.js'; +import { validateLocalResponse } from './utils/validateLocalResponse.js'; +import { getTestProjectFolder } from './utils/getTestProjectFolder.js'; + +export const execAsync = promisify(exec); + +const observableMode = process.env.OBSERVABLE_MODE === 'true'; + +describe('osls-esbuild-esm', async () => { + const folder = await getTestProjectFolder('osls-esbuild-esm'); + let lldProcess: ChildProcess | undefined; + + beforeAll(async () => { + if (process.env.CI === 'true' || process.env.RUN_TEST_FROM_CLI === 'true') { + lldProcess = await startDebugger(folder); + } + }); + + afterAll(async () => { + // stop the debugger + lldProcess?.kill(); + }); + + test('check infra', async () => { + const lambdaName = 'lls-osls-esbuild-esm-test-testTsEsModule'; + await expectInfraDeployed(lambdaName); + }); + + test('call Lambda - testTsEsModule', async () => { + const lambdaName = 'lls-osls-esbuild-esm-test-testTsEsModule'; + + const payload = getSamplePayload(lambdaName); + const response = await callLambda(lambdaName, payload); + + expect(response.inputEvent).toEqual(payload); + expect(response.runningLocally).toEqual(!observableMode); + if (observableMode) { + await validateLocalResponse(lambdaName, payload); + } + }); + + test('remove infra', async () => { + if (process.env.CI === 'true' || process.env.RUN_TEST_FROM_CLI === 'true') { + await removeInfra(lldProcess, folder); + const lambdaName = 'lls-osls-esbuild-esm-test-testTsEsModule'; + await expectInfraRemoved(lambdaName); + } + }); +}); diff --git a/test/osls-esbuild-esm/.gitignore b/test/osls-esbuild-esm/.gitignore new file mode 100644 index 0000000..2b48c8b --- /dev/null +++ b/test/osls-esbuild-esm/.gitignore @@ -0,0 +1,6 @@ +# package directories +node_modules +jspm_packages + +# Serverless directories +.serverless \ No newline at end of file diff --git a/test/osls-esbuild-esm/package.json b/test/osls-esbuild-esm/package.json new file mode 100644 index 0000000..df2489c --- /dev/null +++ b/test/osls-esbuild-esm/package.json @@ -0,0 +1,24 @@ +{ + "name": "osls-esbuild", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "deploy": "serverless deploy", + "destroy": "serverless remove" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "esbuild": "^0.20.2", + "osls": "^3.41.0", + "serverless-esbuild": "^1.52.1", + "@types/aws-lambda": "^8.10.137" + }, + "dependencies": { + "@tsconfig/node20": "^20.1.4", + "@aws-sdk/client-sts": "^3.577.0" + } +} \ No newline at end of file diff --git a/test/osls-esbuild-esm/serverless.yml b/test/osls-esbuild-esm/serverless.yml new file mode 100644 index 0000000..cd96d6d --- /dev/null +++ b/test/osls-esbuild-esm/serverless.yml @@ -0,0 +1,24 @@ +service: lls-osls-esbuild-esm +frameworkVersion: '3' + +plugins: + - serverless-esbuild + +provider: + name: aws + runtime: nodejs20.x + region: eu-west-1 + stage: test + +custom: + esbuild: + bundle: true + minify: true + format: esm + outputFileExtension: .mjs + banner: + js: "import { createRequire } from 'module';const require = createRequire(import.meta.url);" + +functions: + testTsEsModule: + handler: services/testTsEsModule/lambda.lambdaHandler diff --git a/test/osls-esbuild-esm/services/testTsEsModule/lambda.ts b/test/osls-esbuild-esm/services/testTsEsModule/lambda.ts new file mode 100755 index 0000000..5e17de6 --- /dev/null +++ b/test/osls-esbuild-esm/services/testTsEsModule/lambda.ts @@ -0,0 +1,35 @@ +import { Handler } from 'aws-lambda'; +import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts'; + +const stsClient = new STSClient({}); + +export const lambdaHandler: Handler = async (event, context) => { + // check context + const remainingTime = context.getRemainingTimeInMillis(); + if (remainingTime === undefined) { + throw new Error('Remaining time is undefined'); + } + + // check SDK works + const command = new GetCallerIdentityCommand({}); + const identity = await stsClient.send(command); + + const response = { + inputEvent: event, + accountId: identity.Account, + runningLocally: process.env.IS_LOCAL === 'true', + }; + + if (process.env.IS_LOCAL === 'true') { + const fs = await import('fs'); + const path = await import('path'); + const filePath = path.join( + '..', + 'local_lambda_responses', + `${context.functionName}.json`, + ); + fs.writeFileSync(filePath, JSON.stringify(response, null, 2)); + } + + return response; +}; diff --git a/test/osls-esbuild-esm/services/testTsEsModule/package.json b/test/osls-esbuild-esm/services/testTsEsModule/package.json new file mode 100644 index 0000000..c2b49e2 --- /dev/null +++ b/test/osls-esbuild-esm/services/testTsEsModule/package.json @@ -0,0 +1,11 @@ +{ + "name": "sls-esbuild-test-ts-esmodule", + "version": "1.0.0", + "type": "module", + "devDependencies": { + "@tsconfig/node20": "^20.1.4" + }, + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + } +} diff --git a/test/osls-esbuild-esm/services/testTsEsModule/tsconfig.json b/test/osls-esbuild-esm/services/testTsEsModule/tsconfig.json new file mode 100755 index 0000000..fca5c83 --- /dev/null +++ b/test/osls-esbuild-esm/services/testTsEsModule/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node" + } +} diff --git a/test/osls-esbuild-esm/tsconfig.json b/test/osls-esbuild-esm/tsconfig.json new file mode 100755 index 0000000..fca5c83 --- /dev/null +++ b/test/osls-esbuild-esm/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node" + } +} From 9f2efe0a4ab48d3671ff900da8eab531c1ac5042 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:28:17 +0100 Subject: [PATCH 12/17] chore: Add logs --- package.json | 3 ++- prepareForTest.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b5dc034..41570da 100755 --- a/package.json +++ b/package.json @@ -148,9 +148,10 @@ "test/cdk-config", "test/sls-basic", "test/sls-esbuild", + "test/sls-esbuild-cjs", "test/osls-basic", "test/osls-esbuild", - "test/sls-esbuild-cjs", + "test/osls-esbuild-cjs", "test/sam-basic", "test/sam-alt", "test/terraform-basic" diff --git a/prepareForTest.js b/prepareForTest.js index 40313f6..3682624 100644 --- a/prepareForTest.js +++ b/prepareForTest.js @@ -16,7 +16,10 @@ async function modifyPackageJson(testCase) { // Write the modified package.json back to the file await writeFile(filePath, JSON.stringify(packageJson, null, 2), 'utf-8'); - console.log(`Modified ${filePath} successfully!`); + console.log( + `Modified ${filePath} successfully!`, + JSON.stringify(packageJson, null, 2), + ); } // Run the function with the provided file path and argument From ba4efe21bcee0e31f667c071c7fb9988f099aed3 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:29:46 +0100 Subject: [PATCH 13/17] fix: build --- package-lock.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 9442210..ed3cbaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,9 +35,10 @@ "test/cdk-config", "test/sls-basic", "test/sls-esbuild", + "test/sls-esbuild-cjs", "test/osls-basic", "test/osls-esbuild", - "test/sls-esbuild-cjs", + "test/osls-esbuild-cjs", "test/sam-basic", "test/sam-alt", "test/terraform-basic" @@ -14156,6 +14157,10 @@ "resolved": "test/osls-basic", "link": true }, + "node_modules/osls-esbuild": { + "resolved": "test/osls-esbuild-cjs", + "link": true + }, "node_modules/osls/node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -18859,6 +18864,19 @@ "osls": "^3.41.0" } }, + "test/osls-esbuild-cjs": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-sts": "^3.577.0" + }, + "devDependencies": { + "@tsconfig/node20": "^20.1.4", + "esbuild": "^0.20.2", + "osls": "^3.41.0", + "serverless-esbuild": "^1.52.1" + } + }, "test/sam-alt": { "version": "0.0.1", "dependencies": { @@ -18890,6 +18908,7 @@ } }, "test/sls-esbuild-cjs": { + "name": "sls-esbuild", "version": "1.0.0", "license": "ISC", "dependencies": { From 7959b7b1a5a71c8b001e3c5fc97e8f676d0de0be Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:31:45 +0100 Subject: [PATCH 14/17] fix: prettier --- package.json | 2 +- prepareForTest.js | 10 +++++++--- test/osls-esbuild-cjs/package.json | 2 +- test/osls-esbuild-esm/package.json | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 41570da..336a56b 100755 --- a/package.json +++ b/package.json @@ -156,4 +156,4 @@ "test/sam-alt", "test/terraform-basic" ] -} \ No newline at end of file +} diff --git a/prepareForTest.js b/prepareForTest.js index 3682624..fb937e4 100644 --- a/prepareForTest.js +++ b/prepareForTest.js @@ -1,6 +1,11 @@ import { readFile, writeFile } from 'fs/promises'; import { argv } from 'process'; +/** + * Prepare the package.json file for testing. + * Remove everything that is not needed for testing. + * @param {*} testCase + */ async function modifyPackageJson(testCase) { const filePath = 'package.json'; @@ -11,10 +16,10 @@ async function modifyPackageJson(testCase) { delete packageJson.scripts; delete packageJson.devDependencies; - // Replace workspaces node with specified values + // Replace workspaces node with the test and the test case workspaces + // With this all the necessary npm packages will be installed packageJson.workspaces = ['test', `test/${testCase}`]; - // Write the modified package.json back to the file await writeFile(filePath, JSON.stringify(packageJson, null, 2), 'utf-8'); console.log( `Modified ${filePath} successfully!`, @@ -22,7 +27,6 @@ async function modifyPackageJson(testCase) { ); } -// Run the function with the provided file path and argument const [testCase] = argv.slice(1); if (!testCase) { console.error('Usage: node prepareForTest.js '); diff --git a/test/osls-esbuild-cjs/package.json b/test/osls-esbuild-cjs/package.json index 35bc802..44e909f 100644 --- a/test/osls-esbuild-cjs/package.json +++ b/test/osls-esbuild-cjs/package.json @@ -20,4 +20,4 @@ "dependencies": { "@aws-sdk/client-sts": "^3.577.0" } -} \ No newline at end of file +} diff --git a/test/osls-esbuild-esm/package.json b/test/osls-esbuild-esm/package.json index df2489c..5d512fa 100644 --- a/test/osls-esbuild-esm/package.json +++ b/test/osls-esbuild-esm/package.json @@ -21,4 +21,4 @@ "@tsconfig/node20": "^20.1.4", "@aws-sdk/client-sts": "^3.577.0" } -} \ No newline at end of file +} From 998388b8beae5ffb519e3aadf5a0bff6dcb62299 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:37:37 +0100 Subject: [PATCH 15/17] wip --- eslint.config.js | 1 - prepareForTest.js | 11 ++++------- tsconfig.json | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index c70a734..495a4b4 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -14,7 +14,6 @@ export default [ '**/.aws-sam/**', 'src/extension/aws/*.js', '.vitepress/cache/**', - 'prepareForTest.js', ], }, { diff --git a/prepareForTest.js b/prepareForTest.js index fb937e4..4a1c84e 100644 --- a/prepareForTest.js +++ b/prepareForTest.js @@ -21,16 +21,13 @@ async function modifyPackageJson(testCase) { packageJson.workspaces = ['test', `test/${testCase}`]; await writeFile(filePath, JSON.stringify(packageJson, null, 2), 'utf-8'); - console.log( - `Modified ${filePath} successfully!`, - JSON.stringify(packageJson, null, 2), - ); + console.log(`Modified ${filePath} successfully!`); } -const [testCase] = argv.slice(1); +const [testCase] = argv.slice(2); if (!testCase) { - console.error('Usage: node prepareForTest.js '); + console.error('Usage: node prepareForTest.js '); process.exit(1); } -modifyPackageJson(testCase); +void modifyPackageJson(testCase).catch(console.error); diff --git a/tsconfig.json b/tsconfig.json index 4ea5d2b..b3f4705 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,5 +6,5 @@ "outDir": "./dist" }, "include": ["src/**/*", "test/**/*", "*.*", ".vitepress/**/*"], - "exclude": ["node_modules", "dist", "prepareForTest.js"] + "exclude": ["node_modules", "dist"] } From 2fcc3a062a8bfd49dbd625f3f747b32fd7bcaac4 Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 18:53:36 +0100 Subject: [PATCH 16/17] wip --- .github/workflows/common-test.yml | 100 ++++++++++++++++++++++++++++++ test/cdk-basic/package.json | 2 +- test/cdk-esm/package.json | 2 +- 3 files changed, 102 insertions(+), 2 deletions(-) diff --git a/.github/workflows/common-test.yml b/.github/workflows/common-test.yml index a1d4ebc..10030de 100644 --- a/.github/workflows/common-test.yml +++ b/.github/workflows/common-test.yml @@ -323,6 +323,106 @@ jobs: - name: Test - observability mode run: OBSERVABLE_MODE=true npx vitest --retry 1 test/osls-basic.test.ts + test-osls-esbuild-cjs: + runs-on: ubuntu-latest + concurrency: + group: test-osls-esbuild-cjs + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.node_version }} + registry-url: 'https://registry.npmjs.org' + - name: Install dependencies + run: | + node prepareForTest.js osls-esbuild-cjs + npm i + - name: Download build artifact + uses: actions/download-artifact@v4 + if: ${{ inputs.mode == 'build' }} + with: + name: dist + path: dist + - name: Install lambda-live-debugger globally + if: ${{ inputs.mode == 'global' }} + run: | + npm i lambda-live-debugger -g + npm i osls@3.41.0 -g + working-directory: test + - name: Install lambda-live-debugger locally + if: ${{ inputs.mode == 'local' }} + run: | + npm i lambda-live-debugger + working-directory: test + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-region: eu-west-1 + role-to-assume: ${{ secrets.AWS_ROLE }} + role-session-name: GitHubActions + - name: Destroy + run: npm run destroy + working-directory: test/osls-esbuild-cjs + continue-on-error: true + - name: Deploy + run: npm run deploy + working-directory: test/osls-esbuild-cjs + - name: Test + run: npx vitest --retry 1 test/osls-esbuild-cjs.test.ts + - name: Test - observability mode + run: OBSERVABLE_MODE=true npx vitest --retry 1 test/osls-esbuild-cjs.test.ts + + test-osls-esbuild-esm: + runs-on: ubuntu-latest + concurrency: + group: test-osls-esbuild-esm + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.node_version }} + registry-url: 'https://registry.npmjs.org' + - name: Install dependencies + run: | + node prepareForTest.js osls-esbuild-esm + npm i + - name: Download build artifact + uses: actions/download-artifact@v4 + if: ${{ inputs.mode == 'build' }} + with: + name: dist + path: dist + - name: Install lambda-live-debugger globally + if: ${{ inputs.mode == 'global' }} + run: | + npm i lambda-live-debugger -g + npm i osls@3.41.0 -g + working-directory: test + - name: Install lambda-live-debugger locally + if: ${{ inputs.mode == 'local' }} + run: | + npm i lambda-live-debugger + working-directory: test + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-region: eu-west-1 + role-to-assume: ${{ secrets.AWS_ROLE }} + role-session-name: GitHubActions + - name: Destroy + run: npm run destroy + working-directory: test/osls-esbuild-esm + continue-on-error: true + - name: Deploy + run: npm run deploy + working-directory: test/osls-esbuild-esm + - name: Test + run: npx vitest --retry 1 test/osls-esbuild-esm.test.ts + - name: Test - observability mode + run: OBSERVABLE_MODE=true npx vitest --retry 1 test/osls-esbuild-esm.test.ts + test-sam-basic: runs-on: ubuntu-latest concurrency: diff --git a/test/cdk-basic/package.json b/test/cdk-basic/package.json index 50a05a5..2f14197 100644 --- a/test/cdk-basic/package.json +++ b/test/cdk-basic/package.json @@ -7,7 +7,7 @@ "scripts": { "deploy": "cdk deploy --all -c environment=test --require-approval never --outputs-file cdk-outputs.json", "build": "cdk synth -c environment=test", - "destroy": "cdk destroy -c environment=test --force" + "destroy": "cdk destroy --all -c environment=test --force" }, "devDependencies": { "@types/node": "20.11.30", diff --git a/test/cdk-esm/package.json b/test/cdk-esm/package.json index 788a5d7..c95455a 100644 --- a/test/cdk-esm/package.json +++ b/test/cdk-esm/package.json @@ -8,7 +8,7 @@ "scripts": { "deploy": "cdk deploy --all -c environment=test --require-approval never --outputs-file cdk-outputs.json", "build": "cdk synth -c environment=test", - "destroy": "cdk destroy -c environment=test --force" + "destroy": "cdk destroy --all -c environment=test --force" }, "devDependencies": { "@tsconfig/node20": "^20.1.4", From 7b26987f51ea0ece9ac15729987e934b43343e1c Mon Sep 17 00:00:00 2001 From: "Marko (ServerlessLife)" Date: Thu, 14 Nov 2024 19:01:44 +0100 Subject: [PATCH 17/17] final fix --- src/frameworks/slsFramework.ts | 162 ++++++++++++++++++++------------- 1 file changed, 99 insertions(+), 63 deletions(-) diff --git a/src/frameworks/slsFramework.ts b/src/frameworks/slsFramework.ts index d18c69f..1d559f7 100755 --- a/src/frameworks/slsFramework.ts +++ b/src/frameworks/slsFramework.ts @@ -62,72 +62,38 @@ export class SlsFramework implements IFramework { let resolveVariablesMeta: any; let sources: any; let Serverless: any; + let error1: any | undefined; try { - // lazy load modules - resolveConfigurationPath = ( - await import( - //@ts-ignore - 'serverless/lib/cli/resolve-configuration-path.js' - ) - ).default; - readConfiguration = ( - await import( - //@ts-ignore - 'serverless/lib/configuration/read.js' - ) - ).default; - resolveVariables = ( - await import( - //@ts-ignore - 'serverless/lib/configuration/variables/resolve.js' - ) - ).default; - resolveVariablesMeta = ( - await import( - //@ts-ignore - 'serverless/lib/configuration/variables/resolve-meta.js' - ) - ).default; - const env = await import( - //@ts-ignore - 'serverless/lib/configuration/variables/sources/env.js' - ); - const file = await import( - //@ts-ignore - 'serverless/lib/configuration/variables/sources/file.js' - ); - const opt = await import( - //@ts-ignore - 'serverless/lib/configuration/variables/sources/opt.js' - ); - const self = await import( - //@ts-ignore - 'serverless/lib/configuration/variables/sources/self.js' - ); - const strToBool = await import( - //@ts-ignore - 'serverless/lib/configuration/variables/sources/str-to-bool.js' - ); - const sls = await import( - //@ts-ignores - 'serverless/lib/configuration/variables/sources/instance-dependent/get-sls.js' - ); - - sources = { - env: env.default, - file: file.default, - opt: opt.default, - self: self.default, - strToBool: strToBool.default, - sls: sls.default(), - }; - - Serverless = (await import('serverless')).default; - } catch (error: any) { - Logger.error('Error loading serverless modules', error); + try { + const frameworkFunctions = await loadFramework('serverless'); + resolveConfigurationPath = frameworkFunctions.resolveConfigurationPath; + readConfiguration = frameworkFunctions.readConfiguration; + resolveVariables = frameworkFunctions.resolveVariables; + resolveVariablesMeta = frameworkFunctions.resolveVariablesMeta; + sources = frameworkFunctions.sources; + Serverless = frameworkFunctions.Serverless; + + Logger.verbose(`[SLS] Npm module 'serverless' loaded`); + } catch (error: any) { + Logger.verbose(`[SLS] Failed to load npm module 'serverless'`, error); + + error1 = error; + const frameworkFunctions = await loadFramework('osls'); + resolveConfigurationPath = frameworkFunctions.resolveConfigurationPath; + readConfiguration = frameworkFunctions.readConfiguration; + resolveVariables = frameworkFunctions.resolveVariables; + resolveVariablesMeta = frameworkFunctions.resolveVariablesMeta; + sources = frameworkFunctions.sources; + Serverless = frameworkFunctions.Serverless; + + Logger.verbose(`[SLS] Npm module 'osls' loaded`); + } + } catch (error2: any) { + const error = error1 ?? error2; + Logger.error('Error loading serverless (or osls) module', error); Logger.log( - 'If you are running Lambda Live Debugger from a global installation, install Serverless Framework globally as well. If you are using monorepo, install Serverless Framework also in the project root folder.', + 'If you are running Lambda Live Debugger from a global installation, install Serverless Framework globally as well. If you are using monorepo, install Serverless Framework also in the project root folder. The fork of Serverless Framework https://github.com/oss-serverless/serverless is also supported.', ); throw new Error(`Error loading serverless modules. ${error.message}`, { cause: error, @@ -315,3 +281,73 @@ export class SlsFramework implements IFramework { } export const slsFramework = new SlsFramework(); +async function loadFramework(npmName: string) { + // lazy load modules + const resolveConfigurationPath = ( + await import( + //@ts-ignore + `${npmName}/lib/cli/resolve-configuration-path.js` + ) + ).default; + const readConfiguration = ( + await import( + //@ts-ignore + `${npmName}/lib/configuration/read.js` + ) + ).default; + const resolveVariables = ( + await import( + //@ts-ignore + `${npmName}/lib/configuration/variables/resolve.js` + ) + ).default; + const resolveVariablesMeta = ( + await import( + //@ts-ignore + `${npmName}/lib/configuration/variables/resolve-meta.js` + ) + ).default; + const env = await import( + //@ts-ignore + `${npmName}/lib/configuration/variables/sources/env.js` + ); + const file = await import( + //@ts-ignore + `${npmName}/lib/configuration/variables/sources/file.js` + ); + const opt = await import( + //@ts-ignore + `${npmName}/lib/configuration/variables/sources/opt.js` + ); + const self = await import( + //@ts-ignore + `${npmName}/lib/configuration/variables/sources/self.js` + ); + const strToBool = await import( + //@ts-ignore + `${npmName}/lib/configuration/variables/sources/str-to-bool.js` + ); + const sls = await import( + //@ts-ignores + `${npmName}/lib/configuration/variables/sources/instance-dependent/get-sls.js` + ); + + const sources = { + env: env.default, + file: file.default, + opt: opt.default, + self: self.default, + strToBool: strToBool.default, + sls: sls.default(), + }; + + const Serverless = (await import(npmName)).default; + return { + resolveConfigurationPath, + readConfiguration, + resolveVariablesMeta, + resolveVariables, + sources, + Serverless, + }; +}