{"version":3,"sources":["../src/route-importer.ts","../src/route-generator.ts","../src/utils/lambda-is-running.ts","../src/route-decorator.ts"],"sourcesContent":["import * as path from \"path\";\nimport url from \"url\";\n\nimport { globSync } from \"glob\";\n\nimport { GeneratorConfigFileData } from \"./import-config-file\";\nimport { ServerlessGenerator } from \"./route-generator\";\nimport { lambdaIsRunning } from \"./utils/lambda-is-running\";\n\nasync function importAllHandlers(data: GeneratorConfigFileData) {\n\ttry {\n\t\tconsole.log(\"Importing all handlers...\");\n\n\t\tif (!data || !data.projectRoot || !data.pathPattern) {\n\t\t\tthrow new Error(\"Missing projectRoot or pathPattern in config file\");\n\t\t}\n\n\t\tconst projectRoot = path.join(process.cwd(), data.projectRoot);\n\n\t\tif (!projectRoot) {\n\t\t\tthrow new Error(\"Could not find project root\");\n\t\t}\n\n\t\tconsole.log(\"Project root: \", projectRoot);\n\n\t\tconst handlersPath = path.join(\n\t\t\tdata.projectRoot.concat(\"/\").concat(data.pathPattern),\n\t\t);\n\n\t\tconst handlers = globSync(handlersPath);\n\n\t\tfor (const handler of handlers) {\n\t\t\tconst handlerUrl = url.pathToFileURL(handler).href;\n\t\t\tawait import(handlerUrl);\n\t\t}\n\t} catch (error) {\n\t\tconsole.log(\"Error importing all handlers: \", error);\n\t\tthrow new Error(error);\n\t}\n}\n\nexport async function generate(configFile: GeneratorConfigFileData) {\n\ttry {\n\t\tif (lambdaIsRunning()) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait importAllHandlers(configFile);\n\n\t\tconst fileName = configFile?.generatedFileName ?? \"serverless-routes\";\n\n\t\tconst projectRoot = process.cwd();\n\t\tconst srcPath = path.join(projectRoot, configFile.projectRoot);\n\t\tconst serverlessPath = path.join(\n\t\t\tprojectRoot,\n\t\t\t`${fileName}.${configFile?.generatedFileExtension ?? \"js\"}`,\n\t\t);\n\n\t\tconst generator = new ServerlessGenerator(\n\t\t\tsrcPath,\n\t\t\tserverlessPath,\n\t\t\tconfigFile,\n\t\t);\n\n\t\tgenerator.generate();\n\n\t\tconsole.log(\"Route generation completed successfully!\");\n\t\tprocess.exit(0);\n\t} catch (error) {\n\t\tconst err = error as Error;\n\n\t\tconsole.error(\"Error generating routes: \", err.message);\n\t\tconsole.error(err.stack);\n\t\tconsole.error(JSON.stringify(err, null, 2));\n\t\tconsole.error(\"Route generation failed!\");\n\n\t\tthrow err;\n\t}\n}\n","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","export enum LAMBDA_NAMES {\n\tAWS = \"AWS_LAMBDA_FUNCTION_NAME\",\n\tAZURE = \"AZURE_FUNCTIONS_ENVIRONMENT\",\n\tGOOGLE = \"GOOGLE_CLOUD_FUNCTION_NAME\",\n}\n\nexport const lambdaIsRunning = () => {\n\tif (\n\t\tprocess.env[LAMBDA_NAMES.AWS] ||\n\t\tprocess.env[LAMBDA_NAMES.AZURE] ||\n\t\tprocess.env[LAMBDA_NAMES.GOOGLE]\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\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":"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","names":["path","url","globSync","fs","path","lambdaIsRunning","process","env","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","importAllHandlers","data","console","log","projectRoot","pathPattern","Error","join","process","cwd","handlersPath","concat","handlers","globSync","handler","handlerUrl","url","pathToFileURL","href","error","generate","configFile","lambdaIsRunning","fileName","generatedFileName","srcPath","serverlessPath","generatedFileExtension","generator","ServerlessGenerator","exit","err","message","stack","JSON","stringify"]}