{"version":3,"sources":["../src/route-generator.ts","../src/route-decorator.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\n\nimport { GeneratorConfigFileData } from \"./import-config-file\";\nimport { getRouteConfigs } from \"./route-decorator\";\n\nexport class ServerlessGenerator {\n\tconstructor(\n\t\tprivate readonly basePath: string,\n\t\tprivate readonly outputPath: string,\n\t\tprivate readonly config: GeneratorConfigFileData,\n\t) {}\n\n\tprivate generateFunctionConfig(): Record<string, unknown> {\n\t\tconst routes = getRouteConfigs();\n\n\t\tconst functions: Record<string, unknown> = {};\n\n\t\troutes.forEach((route) => {\n\t\t\tconst { name, events, context, handlerRoutePath, ...rest } = route;\n\n\t\t\tconst routeContext = route.context.indexOf(this.config.projectRoot);\n\n\t\t\tlet relativePath: string;\n\n\t\t\tif (routeContext !== -1) {\n\t\t\t\trelativePath = context.substring(routeContext);\n\t\t\t}\n\n\t\t\tif (!relativePath) {\n\t\t\t\tthrow new Error(\"Could not find relative path for route\");\n\t\t\t}\n\n\t\t\tconst handlerPath = path.relative(\n\t\t\t\tthis.basePath,\n\t\t\t\tpath.join(this.basePath, relativePath, handlerRoutePath),\n\t\t\t);\n\n\t\t\tfunctions[name] = {\n\t\t\t\thandler: handlerPath,\n\t\t\t\tevents: events,\n\t\t\t\t...rest,\n\t\t\t};\n\t\t});\n\n\t\treturn functions;\n\t}\n\n\tprivate generateFunctionConfigJS(): string {\n\t\tconst functions = this.generateFunctionConfig();\n\n\t\treturn `\n    module.exports = {\n      functions: ${JSON.stringify(functions, null, 2)}\n    };`;\n\t}\n\n\tprivate generateFunctionConfigTS(): string {\n\t\tconst functions = this.generateFunctionConfig();\n\n\t\treturn `export const functions = ${JSON.stringify(functions, null, 2)};`;\n\t}\n\n\tpublic generate(): void {\n\t\tlet config: string;\n\n\t\tif (this.config.generatedFileExtension === \"ts\") {\n\t\t\tconfig = this.generateFunctionConfigTS();\n\t\t} else {\n\t\t\tconfig = this.generateFunctionConfigJS();\n\t\t}\n\n\t\tfs.writeFileSync(this.outputPath, config);\n\t\tconsole.log(`Serverless config generated at ${this.outputPath}`);\n\t}\n}\n","import path from \"path\";\nimport { HttpRouteConfig } from \"./types/function\";\nimport { lambdaIsRunning } from \"./utils/lambda-is-running\";\n\ntype RouteConfig = HttpRouteConfig;\n\nconst routeConfigs = new Map<string, RouteConfig & { context: string }>();\n\nfunction getContext(match: RegExpMatchArray) {\n\tif (match && match[1]) {\n\t\tconst fullPath = match[1];\n\n\t\tconst directory = path.dirname(fullPath);\n\t\treturn directory;\n\t}\n\n\treturn null;\n}\n\nconst defineConfig = (\n\tconfig: RouteConfig & {\n\t\tcontext: string;\n\t},\n) => {\n\tlet functionName: string | undefined;\n\n\tif (config.name) {\n\t\tfunctionName = config.name;\n\t}\n\n\tif (!functionName && config.events.find((event) => \"http\" in event)) {\n\t\tconst path = (\n\t\t\tconfig.events.find((event) => \"http\" in event) as {\n\t\t\t\thttp: { path: string };\n\t\t\t}\n\t\t).http.path;\n\n\t\t// functionName = path.replace(/\\//g, \"-\");\n\t\tfunctionName = path.split(\"/\")[path.split(\"/\").length - 1];\n\t}\n\n\tif (!functionName) {\n\t\tthrow new Error(\"Could not find function name for route\");\n\t}\n\n\treturn {\n\t\t...config,\n\t\tname: functionName,\n\t};\n};\n\nexport const createHandler = (\n\tconfig: RouteConfig,\n\thandler: (...args: any[]) => any,\n) => {\n\tif (lambdaIsRunning()) {\n\t\treturn handler;\n\t}\n\n\t// Registra a configuração usando o nome do arquivo + nome da função como chave\n\tconst matchPath = new Error()\n\t\t.stack!.split(\"\\n\")[2]\n\t\t.match(/\\(([^:]+):\\d+:\\d+\\)/);\n\n\tif (!matchPath) {\n\t\tthrow new Error(\"Could not find handler path\");\n\t}\n\n\tconst context = getContext(matchPath);\n\n\tif (!context) {\n\t\tthrow new Error(\"Could not find handler context\");\n\t}\n\n\tconst fileName =\n\t\tnew Error().stack!.split(\"\\n\")[2].match(/[/\\\\]([\\w\\-. ]+)\\.[jt]s/)?.[1] ||\n\t\t\"unknown\";\n\n\tconst key = `${fileName}.${defineConfig({ ...config, context }).name}`;\n\n\trouteConfigs.set(key, { ...config, context });\n\n\treturn handler;\n};\n\nexport const getRouteConfigs = () => {\n\treturn Array.from(routeConfigs.entries()).map(\n\t\t([handlerRoutePath, config]) => ({\n\t\t\thandlerRoutePath,\n\t\t\t...defineConfig(config),\n\t\t}),\n\t);\n};\n"],"mappings":";;;;;;AAAA,YAAYA,QAAQ;AACpB,YAAYC,UAAU;;;ACKtB,IAAMC,eAAe,oBAAIC,IAAAA;AAazB,IAAMC,eAAe,wBACpBC,WAAAA;AAIA,MAAIC;AAEJ,MAAID,OAAOE,MAAM;AAChBD,mBAAeD,OAAOE;EACvB;AAEA,MAAI,CAACD,gBAAgBD,OAAOG,OAAOC,KAAK,CAACC,UAAU,UAAUA,KAAAA,GAAQ;AACpE,UAAMC,QACLN,OAAOG,OAAOC,KAAK,CAACC,UAAU,UAAUA,KAAAA,EAGvCE,KAAKD;AAGPL,mBAAeK,MAAKE,MAAM,GAAA,EAAKF,MAAKE,MAAM,GAAA,EAAKC,SAAS,CAAA;EACzD;AAEA,MAAI,CAACR,cAAc;AAClB,UAAM,IAAIS,MAAM,wCAAA;EACjB;AAEA,SAAO;IACN,GAAGV;IACHE,MAAMD;EACP;AACD,GA9BqB;AAkEd,IAAMU,kBAAkB,6BAAA;AAC9B,SAAOC,MAAMC,KAAKC,aAAaC,QAAO,CAAA,EAAIC,IACzC,CAAC,CAACC,kBAAkBC,MAAAA,OAAa;IAChCD;IACA,GAAGE,aAAaD,MAAAA;EACjB,EAAA;AAEF,GAP+B;;;AD/ExB,IAAME,uBAAN,MAAMA,qBAAAA;EACZC,YACkBC,UACAC,YACAC,QAChB;;;;SAHgBF,WAAAA;SACAC,aAAAA;SACAC,SAAAA;EACf;EAEKC,yBAAkD;AACzD,UAAMC,SAASC,gBAAAA;AAEf,UAAMC,YAAqC,CAAC;AAE5CF,WAAOG,QAAQ,CAACC,UAAAA;AACf,YAAM,EAAEC,MAAMC,QAAQC,SAASC,kBAAkB,GAAGC,KAAAA,IAASL;AAE7D,YAAMM,eAAeN,MAAMG,QAAQI,QAAQ,KAAKb,OAAOc,WAAW;AAElE,UAAIC;AAEJ,UAAIH,iBAAiB,IAAI;AACxBG,uBAAeN,QAAQO,UAAUJ,YAAAA;MAClC;AAEA,UAAI,CAACG,cAAc;AAClB,cAAM,IAAIE,MAAM,wCAAA;MACjB;AAEA,YAAMC,cAAmBC,cACxB,KAAKrB,UACAsB,UAAK,KAAKtB,UAAUiB,cAAcL,gBAAAA,CAAAA;AAGxCN,gBAAUG,IAAAA,IAAQ;QACjBc,SAASH;QACTV;QACA,GAAGG;MACJ;IACD,CAAA;AAEA,WAAOP;EACR;EAEQkB,2BAAmC;AAC1C,UAAMlB,YAAY,KAAKH,uBAAsB;AAE7C,WAAO;;mBAEUsB,KAAKC,UAAUpB,WAAW,MAAM,CAAA,CAAA;;EAElD;EAEQqB,2BAAmC;AAC1C,UAAMrB,YAAY,KAAKH,uBAAsB;AAE7C,WAAO,4BAA4BsB,KAAKC,UAAUpB,WAAW,MAAM,CAAA,CAAA;EACpE;EAEOsB,WAAiB;AACvB,QAAI1B;AAEJ,QAAI,KAAKA,OAAO2B,2BAA2B,MAAM;AAChD3B,eAAS,KAAKyB,yBAAwB;IACvC,OAAO;AACNzB,eAAS,KAAKsB,yBAAwB;IACvC;AAEAM,IAAGC,iBAAc,KAAK9B,YAAYC,MAAAA;AAClC8B,YAAQC,IAAI,kCAAkC,KAAKhC,UAAU,EAAE;EAChE;AACD;AArEaH;AAAN,IAAMA,sBAAN;","names":["fs","path","routeConfigs","Map","defineConfig","config","functionName","name","events","find","event","path","http","split","length","Error","getRouteConfigs","Array","from","routeConfigs","entries","map","handlerRoutePath","config","defineConfig","ServerlessGenerator","constructor","basePath","outputPath","config","generateFunctionConfig","routes","getRouteConfigs","functions","forEach","route","name","events","context","handlerRoutePath","rest","routeContext","indexOf","projectRoot","relativePath","substring","Error","handlerPath","relative","join","handler","generateFunctionConfigJS","JSON","stringify","generateFunctionConfigTS","generate","generatedFileExtension","fs","writeFileSync","console","log"]}