Skip to content

Commit

Permalink
fix: get artifact and metafile paths from sls function object
Browse files Browse the repository at this point in the history
Gets the paths to the metadata file and the zipped artifact from the
FunctionDefinitionHandler object exposed by the Serverless API. This
makes the plugin work correctly when e.g. the handler path is something
like `src/myFunctionHandler.main`.

Previously this was failing for me where e.g. the function name in
Serverless was 'myFunction' but the file path was
`myFunctionHandler.ts`.
  • Loading branch information
smbkr committed Feb 9, 2022
1 parent aa01146 commit 81dc636
Showing 1 changed file with 25 additions and 12 deletions.
37 changes: 25 additions & 12 deletions plugin/bundleVisualizer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { exec } from 'child_process';
import { readdirSync, statSync } from 'fs';
import { join } from 'path';
import { join, parse } from 'path';
import { FunctionDefinitionHandler } from 'serverless';

import type { ServerlessAnalyzeBundlePlugin } from './serverlessAnalyzeBundle';

Expand Down Expand Up @@ -36,19 +37,15 @@ const getAllFiles = function (dirPath: string, arrayOfFilesInput: string[] = [])
return arrayOfFiles;
};

const TMP_FOLDER = '/tmp/serverless-esbuild-bundle-analyzer';

async function bundleVisualizer(this: ServerlessAnalyzeBundlePlugin): Promise<void> {
const { analyze: functionName } = this.options;
if (functionName === undefined) {
return;
}
const slsFunction = this.serverless.service.getFunction(functionName);

const functionZipName = this.serverless.service
.getAllFunctionsNames()
.find(fullFunctionName => fullFunctionName.endsWith(functionName));

if (functionZipName === undefined) {
const fullZipPath = slsFunction.package?.artifact;
if (fullZipPath === undefined) {
this.serverless.cli.log(
`🤯 Analyze failed: function ${functionName} was not found`,
'ServerlessAnalyzeBundlePlugin',
Expand All @@ -57,6 +54,7 @@ async function bundleVisualizer(this: ServerlessAnalyzeBundlePlugin): Promise<vo

return;
}
const functionZipName = parse(fullZipPath).base;

this.serverless.cli.log(`⏳ Analyzing function ${functionName}`, 'ServerlessAnalyzeBundlePlugin');

Expand All @@ -65,10 +63,23 @@ async function bundleVisualizer(this: ServerlessAnalyzeBundlePlugin): Promise<vo

await pExec(`unzip .serverless/${functionZipName} -d ${TEMP_DIR_LOCATION}`);

const test = getAllFiles(`${TEMP_DIR_LOCATION}`);
const metafileName = test.filter(
fileName => fileName.includes(`/${functionName}/`) && fileName.endsWith('-meta.json'),
)[0];
const allFiles = getAllFiles(`${TEMP_DIR_LOCATION}`);
const metafileName = allFiles.filter(fileName => {
const handlerPath = (slsFunction as FunctionDefinitionHandler).handler.split('.')[0];

return fileName.includes(handlerPath) && fileName.endsWith('-meta.json');
})[0];

if (!metafileName) {
this.serverless.cli.log(
`🤯 Analyze failed: function ${functionName} metadata was not found`,
'ServerlessAnalyzeBundlePlugin',
{ color: 'red' },
);

return;
}

await pExec(
[
'node_modules/.bin/esbuild-visualizer',
Expand All @@ -81,4 +92,6 @@ async function bundleVisualizer(this: ServerlessAnalyzeBundlePlugin): Promise<vo
);
}

const TMP_FOLDER = '/tmp/serverless-esbuild-bundle-analyzer';

export default bundleVisualizer;

0 comments on commit 81dc636

Please sign in to comment.