@zuplo/cli 6.49.0 → 6.49.3
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.
- package/dist/__tests__/archive-utils.test.js +2 -2
- package/dist/__tests__/archive-utils.test.js.map +1 -1
- package/dist/__tests__/engine.test.js +1 -1
- package/dist/__tests__/engine.test.js.map +1 -1
- package/dist/__tests__/import-openapi-utils.test.js +4 -4
- package/dist/__tests__/import-openapi-utils.test.js.map +1 -1
- package/dist/__tests__/import-openapi.test.js +4 -4
- package/dist/__tests__/import-openapi.test.js.map +1 -1
- package/dist/__tests__/outdated.test.js +1 -1
- package/dist/__tests__/outdated.test.js.map +1 -1
- package/dist/__tests__/tsconfig-upgrader.test.js +8 -4
- package/dist/__tests__/tsconfig-upgrader.test.js.map +1 -1
- package/dist/build/handler.d.ts.map +1 -1
- package/dist/build/handler.js +1 -1
- package/dist/build/handler.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/cmds/tunnel/list.js +1 -1
- package/dist/cmds/tunnel/list.js.map +1 -1
- package/dist/common/middleware/user-configuration.js +1 -1
- package/dist/common/middleware/user-configuration.js.map +1 -1
- package/dist/common/middleware/user-identification.js +2 -2
- package/dist/common/middleware/user-identification.js.map +1 -1
- package/dist/common/outdated.d.ts.map +1 -1
- package/dist/common/outdated.js +1 -1
- package/dist/common/outdated.js.map +1 -1
- package/dist/common/upgraders/tsconfig-upgrader.js +1 -1
- package/dist/common/upgraders/tsconfig-upgrader.js.map +1 -1
- package/dist/common/upgraders/vscode-settings-json-upgrader.js +1 -1
- package/dist/common/upgraders/vscode-settings-json-upgrader.js.map +1 -1
- package/dist/common/validators/file-system-validator.js +1 -1
- package/dist/common/validators/file-system-validator.js.map +1 -1
- package/dist/common/worker-output.d.ts +1 -1
- package/dist/common/worker-output.d.ts.map +1 -1
- package/dist/common/worker-output.js.map +1 -1
- package/dist/compile/handler.d.ts.map +1 -1
- package/dist/compile/handler.js +1 -1
- package/dist/compile/handler.js.map +1 -1
- package/dist/deploy/archive.js +2 -2
- package/dist/deploy/archive.js.map +1 -1
- package/dist/deploy/handler.js +1 -1
- package/dist/deploy/handler.js.map +1 -1
- package/dist/dev/handler.d.ts.map +1 -1
- package/dist/dev/handler.js +1 -1
- package/dist/dev/handler.js.map +1 -1
- package/dist/editor/server/cors-plugin.js +1 -1
- package/dist/editor/server/cors-plugin.js.map +1 -1
- package/dist/editor/server/server.d.ts.map +1 -1
- package/dist/editor/server/server.js +3 -3
- package/dist/editor/server/server.js.map +1 -1
- package/dist/link/populate.js +1 -1
- package/dist/link/populate.js.map +1 -1
- package/dist/login/tokens.js +1 -1
- package/dist/login/tokens.js.map +1 -1
- package/dist/project/import-openapi/handler.js +3 -3
- package/dist/project/import-openapi/handler.js.map +1 -1
- package/dist/test/invoke-test.d.ts.map +1 -1
- package/dist/test/invoke-test.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import fs, { readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
1
4
|
import fastifyStatic from "@fastify/static";
|
|
2
5
|
import chokidar from "chokidar";
|
|
3
6
|
import Fastify from "fastify";
|
|
4
7
|
import { FastifySSEPlugin } from "fastify-sse-v2";
|
|
5
|
-
import fs, { readFile, readdir } from "node:fs/promises";
|
|
6
|
-
import path from "node:path";
|
|
7
|
-
import { fileURLToPath } from "node:url";
|
|
8
8
|
import { captureEvent, shutdownAnalytics } from "../../common/analytics/lib.js";
|
|
9
9
|
import { logger } from "../../common/logger.js";
|
|
10
10
|
import { printDiagnosticsToConsole } from "../../common/output.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/editor/server/server.ts"],"names":[],"mappings":"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","sourcesContent":["import fastifyStatic from \"@fastify/static\";\nimport chokidar from \"chokidar\";\nimport Fastify, { FastifyBaseLogger, FastifyInstance } from \"fastify\";\nimport { FastifySSEPlugin } from \"fastify-sse-v2\";\nimport fs, { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { captureEvent, shutdownAnalytics } from \"../../common/analytics/lib.js\";\nimport { logger } from \"../../common/logger.js\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { corsPlugin } from \"./cors-plugin.js\";\nimport { dirExists, fileExists } from \"./xfs.js\";\n\nconst POLICIES_FILENAME = \"policies.json\";\nconst CONFIG_DIR = \"config\";\n\ninterface FunctionPickerMethod {\n name: string;\n isHandlerInvocable: boolean;\n}\n\ninterface FunctionPickerModule {\n name: string;\n filepath: string;\n methods: FunctionPickerMethod[];\n}\n\ninterface FileSaveBody {\n filePath: string;\n content: object;\n}\n\ninterface ServerOptions {\n cliArgs: unknown;\n workingDir: string;\n port: number;\n isStandalone: boolean;\n}\n\nexport class ApiServer {\n public fastify: FastifyInstance;\n private listenerHost: string;\n private watcher: chokidar.FSWatcher;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private sseContext: any;\n\n private cliArgs: unknown;\n private workingDir: string;\n private listenerPort: number;\n private isStandalone: boolean;\n\n constructor(\n options: ServerOptions = {\n cliArgs: {},\n workingDir: \".\",\n port: 9100,\n isStandalone: true,\n }\n ) {\n this.cliArgs = options.cliArgs;\n this.workingDir = options.workingDir;\n this.listenerPort = options.port;\n this.isStandalone = options.isStandalone;\n this.listenerHost = \"localhost\";\n this.watcher = chokidar.watch(path.join(this.workingDir, CONFIG_DIR));\n this.fastify = Fastify({\n logger: logger as FastifyBaseLogger,\n trustProxy: true,\n disableRequestLogging: true,\n bodyLimit: 104857600, // 100mb\n });\n }\n\n init = async (): Promise<void> => {\n const cliArgs = this.cliArgs;\n this.fastify.register(corsPlugin, { origin: true });\n this.fastify.register(FastifySSEPlugin);\n\n const editorRootPath = fileURLToPath(new URL(\"../\", import.meta.url));\n this.fastify.register(fastifyStatic, {\n root: editorRootPath,\n });\n\n this.fastify.register((instance, _options, done) => {\n instance.get(\"/\", {\n handler: async (_request, reply) => {\n await captureEvent({ argv: cliArgs, event: \"route-designer: /\" });\n let html = await readFile(\n path.join(editorRootPath, \"index.html\"),\n \"utf-8\"\n );\n html = html.replace(\n \"__SERVER_DATA__\",\n JSON.stringify({\n server_address: this.listenerHost,\n server_port: this.listenerPort,\n })\n );\n reply.type(\"text/html\").send(html);\n },\n });\n\n instance.get(\"/open-api-content\", {\n handler: async (request, reply) => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /open-api-content\",\n });\n\n const { path: filePath } = request.query as { path: string | null };\n if (filePath === null || filePath === undefined) {\n return reply.code(404).send(\"You must select a file to work with\");\n }\n\n const openApiFilePath = path.join(\n this.workingDir,\n \"config\",\n filePath\n );\n if (!(await fileExists(openApiFilePath))) {\n return reply\n .code(404)\n .send({ message: `Cannot find file named '${filePath}'` });\n }\n\n const policiesPath = path.join(\n this.workingDir,\n \"config\",\n POLICIES_FILENAME\n );\n if (!(await fileExists(policiesPath))) {\n return reply.code(404).send({\n message: `Cannot find a '${POLICIES_FILENAME}' file in the '${CONFIG_DIR}'`,\n });\n }\n\n // read & send\n const openApiFileContent = await fs.readFile(\n openApiFilePath,\n \"utf-8\"\n );\n const policiesContent = await fs.readFile(policiesPath, \"utf-8\");\n\n const payload = [\n {\n path: filePath,\n content: JSON.parse(openApiFileContent),\n },\n {\n path: POLICIES_FILENAME,\n content: JSON.parse(policiesContent),\n },\n ];\n reply.code(200).send(payload);\n },\n });\n\n instance.get(\"/open-api-files\", {\n handler: async (request, reply) => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /open-api-files\",\n });\n const projectConfigPath = path.join(this.workingDir, CONFIG_DIR);\n if (!(await dirExists(projectConfigPath))) {\n request.log.warn(\n `Cannot find the project '${CONFIG_DIR}' folder. Make sure '${this.workingDir}' has a '${CONFIG_DIR}' folder.`\n );\n return reply.code(404).send({\n message: `Cannot find the project '${CONFIG_DIR}' folder. Make sure '${this.workingDir}' has a '${CONFIG_DIR}' folder.`,\n });\n }\n\n const files = await readdir(projectConfigPath);\n const openApiFiles = files.filter((fileName) =>\n fileName.endsWith(\".oas.json\")\n );\n reply.code(200).send(openApiFiles);\n },\n });\n\n instance.route<{ Body: FileSaveBody[] }>({\n method: \"POST\",\n\n url: \"/save-open-api-updates\",\n handler: async (request, reply): Promise<void> => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /save-open-api-updates\",\n });\n\n const bodyContent = request.body;\n\n bodyContent.forEach(async (fileData) => {\n const openApiFilePath = path.join(\n this.workingDir,\n \"config\",\n fileData.filePath\n );\n if (!(await fileExists(openApiFilePath))) {\n return reply.code(404).send({\n message: `Cannot find file named '${fileData.filePath}'`,\n });\n }\n\n await fs.writeFile(\n openApiFilePath,\n JSON.stringify(fileData.content, null, 2) as string\n );\n });\n\n reply.code(200).send({ message: \"Changes were saved successfully\" });\n },\n });\n\n // SSE endpoint for real-time updates\n instance.get(\"/updates\", {\n handler: async (request, reply) => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /updates\",\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (this.watcher && this.watcher.closed === true) {\n // @NOTE - some UI interactions send a close event & we need to reenable\n // the watcher in the next event subscription request\n this.watcher = chokidar.watch(\n path.join(this.workingDir, CONFIG_DIR)\n );\n }\n\n this.watcher.on(\"change\", (filePath: string) => {\n const eventData = JSON.stringify({ type: \"update\", filePath });\n reply.sse({ id: Date.now().toString(), data: eventData });\n });\n\n request.raw.on(\"close\", async () => {\n await this.watcher.close();\n });\n\n // @NOTE - Initial reply to successfully initialize SSE connection\n reply.sse({\n id: Date.now().toString(),\n data: JSON.stringify({ filePath: POLICIES_FILENAME, type: \"init\" }),\n retry: 10,\n });\n this.sseContext = reply.sseContext;\n },\n });\n\n instance.get(\"/modules-data\", {\n handler: async (request, reply) => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /modules-data\",\n });\n\n const projectModulesPath = path.join(this.workingDir, \"modules\");\n if (!(await dirExists(projectModulesPath))) {\n request.log.warn(\n `Cannot find the project 'modules' folder. Make sure '${this.workingDir}' has a 'modules' folder.`\n );\n return reply.code(200).send([]);\n }\n\n const files = await readdir(projectModulesPath);\n const modulesFiles = files.filter((fileName) =>\n fileName.endsWith(\".ts\")\n );\n\n const results: FunctionPickerModule[] = [];\n\n // @NOTE - its either this or bundling 40mb of typescript in the cli\n for (const moduleFileName of modulesFiles) {\n const fullPath = path.join(projectModulesPath, moduleFileName);\n const fileContent = await fs.readFile(fullPath, \"utf-8\");\n const exports: FunctionPickerMethod[] = [];\n\n // Regular expression to find default export\n const defaultExportRegex = /(?:export\\s+(default))/g;\n if (defaultExportRegex.exec(fileContent)) {\n exports.push({ name: \"default\", isHandlerInvocable: true });\n }\n\n // Regular expression to match exported functions/classes\n const functionRegex =\n /(?:export\\s+(function|class))\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g;\n\n let match;\n while ((match = functionRegex.exec(fileContent))) {\n exports.push({ name: match[2], isHandlerInvocable: true });\n }\n\n results.push({\n name: moduleFileName,\n filepath: `./modules/${moduleFileName}`,\n methods: exports,\n });\n }\n\n reply.code(200).send(results);\n },\n });\n\n instance.get(\"/ping\", {\n handler: async (_request, reply) => {\n reply.code(200).send();\n },\n });\n\n done();\n });\n };\n\n start = async (): Promise<void> => {\n await this.init();\n\n // See https://github.com/fastify/help/issues/641\n this.fastify.log.level = \"silent\";\n const start = async () => {\n return new Promise<void>((resolve, reject) => {\n this.fastify.listen(\n { port: this.listenerPort, host: this.listenerHost },\n (err) => {\n if (err) {\n reject(err);\n }\n\n this.fastify.log.level = \"info\";\n\n if (this.isStandalone) {\n printDiagnosticsToConsole(\"Started route designer\");\n printDiagnosticsToConsole(\"Ctrl+C to exit\");\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(\n `📘 Route Designer: http://${this.listenerHost}:${this.listenerPort}`\n );\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(\"\");\n }\n\n resolve();\n }\n );\n });\n };\n\n await start();\n };\n\n ready = async (): Promise<void> => {\n return this.fastify.ready();\n };\n\n close = async (): Promise<void> => {\n if (this.isStandalone) {\n printDiagnosticsToConsole(\"Closing route designer\");\n }\n\n try {\n void shutdownAnalytics();\n\n if (this.sseContext) {\n this.sseContext.source.end();\n }\n\n if (this.watcher) {\n await this.watcher.close();\n }\n\n await this.fastify.close();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log(err);\n }\n process.exit();\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/editor/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,OAA+C,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC;AAyB5B,MAAM,OAAO,SAAS;IACb,OAAO,CAAkB;IACxB,YAAY,CAAS;IACrB,OAAO,CAAqB;IAE5B,UAAU,CAAM;IAEhB,OAAO,CAAU;IACjB,UAAU,CAAS;IACnB,YAAY,CAAS;IACrB,YAAY,CAAU;IAE9B,YACE,UAAyB;QACvB,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,GAAG;QACf,IAAI,EAAE,IAAI;QACV,YAAY,EAAE,IAAI;KACnB;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACrB,MAAM,EAAE,MAA2B;YACnC,UAAU,EAAE,IAAI;YAChB,qBAAqB,EAAE,IAAI;YAC3B,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,GAAG,KAAK,IAAmB,EAAE;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAExC,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE;YACnC,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YACjD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;gBAChB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACjC,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;oBAClE,IAAI,IAAI,GAAG,MAAM,QAAQ,CACvB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,EACvC,OAAO,CACR,CAAC;oBACF,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,iBAAiB,EACjB,IAAI,CAAC,SAAS,CAAC;wBACb,cAAc,EAAE,IAAI,CAAC,YAAY;wBACjC,WAAW,EAAE,IAAI,CAAC,YAAY;qBAC/B,CAAC,CACH,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;aACF,CAAC,CAAC;YAEH,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE;gBAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;oBAChC,MAAM,YAAY,CAAC;wBACjB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,mCAAmC;qBAC3C,CAAC,CAAC;oBAEH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAgC,CAAC;oBACpE,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAChD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;oBACrE,CAAC;oBAED,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,IAAI,CAAC,UAAU,EACf,QAAQ,EACR,QAAQ,CACT,CAAC;oBACF,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;wBACzC,OAAO,KAAK;6BACT,IAAI,CAAC,GAAG,CAAC;6BACT,IAAI,CAAC,EAAE,OAAO,EAAE,2BAA2B,QAAQ,GAAG,EAAE,CAAC,CAAC;oBAC/D,CAAC;oBAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,IAAI,CAAC,UAAU,EACf,QAAQ,EACR,iBAAiB,CAClB,CAAC;oBACF,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;wBACtC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BAC1B,OAAO,EAAE,kBAAkB,iBAAiB,kBAAkB,UAAU,GAAG;yBAC5E,CAAC,CAAC;oBACL,CAAC;oBAGD,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC1C,eAAe,EACf,OAAO,CACR,CAAC;oBACF,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;oBAEjE,MAAM,OAAO,GAAG;wBACd;4BACE,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;yBACxC;wBACD;4BACE,IAAI,EAAE,iBAAiB;4BACvB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;yBACrC;qBACF,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAChC,CAAC;aACF,CAAC,CAAC;YAEH,QAAQ,CAAC,GAAG,CAAC,iBAAiB,EAAE;gBAC9B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;oBAChC,MAAM,YAAY,CAAC;wBACjB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,iCAAiC;qBACzC,CAAC,CAAC;oBACH,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;oBACjE,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;wBAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CACd,4BAA4B,UAAU,wBAAwB,IAAI,CAAC,UAAU,YAAY,UAAU,WAAW,CAC/G,CAAC;wBACF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BAC1B,OAAO,EAAE,4BAA4B,UAAU,wBAAwB,IAAI,CAAC,UAAU,YAAY,UAAU,WAAW;yBACxH,CAAC,CAAC;oBACL,CAAC;oBAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;oBAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7C,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC/B,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrC,CAAC;aACF,CAAC,CAAC;YAEH,QAAQ,CAAC,KAAK,CAA2B;gBACvC,MAAM,EAAE,MAAM;gBAEd,GAAG,EAAE,wBAAwB;gBAC7B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAiB,EAAE;oBAC/C,MAAM,YAAY,CAAC;wBACjB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,wCAAwC;qBAChD,CAAC,CAAC;oBAEH,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;oBAEjC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;wBACrC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,IAAI,CAAC,UAAU,EACf,QAAQ,EACR,QAAQ,CAAC,QAAQ,CAClB,CAAC;wBACF,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;4BACzC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gCAC1B,OAAO,EAAE,2BAA2B,QAAQ,CAAC,QAAQ,GAAG;6BACzD,CAAC,CAAC;wBACL,CAAC;wBAED,MAAM,EAAE,CAAC,SAAS,CAChB,eAAe,EACf,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAW,CACpD,CAAC;oBACJ,CAAC,CAAC,CAAC;oBAEH,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC;gBACvE,CAAC;aACF,CAAC,CAAC;YAGH,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE;gBACvB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;oBAChC,MAAM,YAAY,CAAC;wBACjB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,0BAA0B;qBAClC,CAAC,CAAC;oBAIH,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;wBAGjD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CACvC,CAAC;oBACJ,CAAC;oBAED,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;wBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;wBAC/D,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC5D,CAAC,CAAC,CAAC;oBAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;wBACjC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBAC7B,CAAC,CAAC,CAAC;oBAGH,KAAK,CAAC,GAAG,CAAC;wBACR,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;wBACzB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wBACnE,KAAK,EAAE,EAAE;qBACV,CAAC,CAAC;oBACH,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;gBACrC,CAAC;aACF,CAAC,CAAC;YAEH,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE;gBAC5B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;oBAChC,MAAM,YAAY,CAAC;wBACjB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,+BAA+B;qBACvC,CAAC,CAAC;oBAEH,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;oBACjE,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;wBAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,CACd,wDAAwD,IAAI,CAAC,UAAU,2BAA2B,CACnG,CAAC;wBACF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAClC,CAAC;oBAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;oBAChD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7C,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CACzB,CAAC;oBAEF,MAAM,OAAO,GAA2B,EAAE,CAAC;oBAG3C,KAAK,MAAM,cAAc,IAAI,YAAY,EAAE,CAAC;wBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;wBAC/D,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBACzD,MAAM,OAAO,GAA2B,EAAE,CAAC;wBAG3C,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;wBACrD,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;4BACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC9D,CAAC;wBAGD,MAAM,aAAa,GACjB,6DAA6D,CAAC;wBAEhE,IAAI,KAAK,CAAC;wBACV,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;4BACjD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC7D,CAAC;wBAED,OAAO,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,cAAc;4BACpB,QAAQ,EAAE,aAAa,cAAc,EAAE;4BACvC,OAAO,EAAE,OAAO;yBACjB,CAAC,CAAC;oBACL,CAAC;oBAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAChC,CAAC;aACF,CAAC,CAAC;YAEH,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE;gBACpB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzB,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,GAAG,KAAK,IAAmB,EAAE;QAChC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAGlB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC;QAClC,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;YACvB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CACjB,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,EACpD,CAAC,GAAG,EAAE,EAAE;oBACN,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC;oBAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC;oBAEhC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBACtB,yBAAyB,CAAC,wBAAwB,CAAC,CAAC;wBACpD,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;wBAC5C,yBAAyB,CAAC,EAAE,CAAC,CAAC;wBAC9B,yBAAyB,CACvB,6BAA6B,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,CACtE,CAAC;wBACF,yBAAyB,CAAC,EAAE,CAAC,CAAC;wBAC9B,yBAAyB,CAAC,EAAE,CAAC,CAAC;oBAChC,CAAC;oBAED,OAAO,EAAE,CAAC;gBACZ,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,KAAK,GAAG,KAAK,IAAmB,EAAE;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,KAAK,GAAG,KAAK,IAAmB,EAAE;QAChC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,yBAAyB,CAAC,wBAAwB,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC;YACH,KAAK,iBAAiB,EAAE,CAAC;YAEzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAC/B,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAED,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YAEb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC,CAAC;CACH","sourcesContent":["import fs, { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport fastifyStatic from \"@fastify/static\";\nimport chokidar from \"chokidar\";\nimport Fastify, { FastifyBaseLogger, FastifyInstance } from \"fastify\";\nimport { FastifySSEPlugin } from \"fastify-sse-v2\";\nimport { captureEvent, shutdownAnalytics } from \"../../common/analytics/lib.js\";\nimport { logger } from \"../../common/logger.js\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { corsPlugin } from \"./cors-plugin.js\";\nimport { dirExists, fileExists } from \"./xfs.js\";\n\nconst POLICIES_FILENAME = \"policies.json\";\nconst CONFIG_DIR = \"config\";\n\ninterface FunctionPickerMethod {\n name: string;\n isHandlerInvocable: boolean;\n}\n\ninterface FunctionPickerModule {\n name: string;\n filepath: string;\n methods: FunctionPickerMethod[];\n}\n\ninterface FileSaveBody {\n filePath: string;\n content: object;\n}\n\ninterface ServerOptions {\n cliArgs: unknown;\n workingDir: string;\n port: number;\n isStandalone: boolean;\n}\n\nexport class ApiServer {\n public fastify: FastifyInstance;\n private listenerHost: string;\n private watcher: chokidar.FSWatcher;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private sseContext: any;\n\n private cliArgs: unknown;\n private workingDir: string;\n private listenerPort: number;\n private isStandalone: boolean;\n\n constructor(\n options: ServerOptions = {\n cliArgs: {},\n workingDir: \".\",\n port: 9100,\n isStandalone: true,\n }\n ) {\n this.cliArgs = options.cliArgs;\n this.workingDir = options.workingDir;\n this.listenerPort = options.port;\n this.isStandalone = options.isStandalone;\n this.listenerHost = \"localhost\";\n this.watcher = chokidar.watch(path.join(this.workingDir, CONFIG_DIR));\n this.fastify = Fastify({\n logger: logger as FastifyBaseLogger,\n trustProxy: true,\n disableRequestLogging: true,\n bodyLimit: 104857600, // 100mb\n });\n }\n\n init = async (): Promise<void> => {\n const cliArgs = this.cliArgs;\n this.fastify.register(corsPlugin, { origin: true });\n this.fastify.register(FastifySSEPlugin);\n\n const editorRootPath = fileURLToPath(new URL(\"../\", import.meta.url));\n this.fastify.register(fastifyStatic, {\n root: editorRootPath,\n });\n\n this.fastify.register((instance, _options, done) => {\n instance.get(\"/\", {\n handler: async (_request, reply) => {\n await captureEvent({ argv: cliArgs, event: \"route-designer: /\" });\n let html = await readFile(\n path.join(editorRootPath, \"index.html\"),\n \"utf-8\"\n );\n html = html.replace(\n \"__SERVER_DATA__\",\n JSON.stringify({\n server_address: this.listenerHost,\n server_port: this.listenerPort,\n })\n );\n reply.type(\"text/html\").send(html);\n },\n });\n\n instance.get(\"/open-api-content\", {\n handler: async (request, reply) => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /open-api-content\",\n });\n\n const { path: filePath } = request.query as { path: string | null };\n if (filePath === null || filePath === undefined) {\n return reply.code(404).send(\"You must select a file to work with\");\n }\n\n const openApiFilePath = path.join(\n this.workingDir,\n \"config\",\n filePath\n );\n if (!(await fileExists(openApiFilePath))) {\n return reply\n .code(404)\n .send({ message: `Cannot find file named '${filePath}'` });\n }\n\n const policiesPath = path.join(\n this.workingDir,\n \"config\",\n POLICIES_FILENAME\n );\n if (!(await fileExists(policiesPath))) {\n return reply.code(404).send({\n message: `Cannot find a '${POLICIES_FILENAME}' file in the '${CONFIG_DIR}'`,\n });\n }\n\n // read & send\n const openApiFileContent = await fs.readFile(\n openApiFilePath,\n \"utf-8\"\n );\n const policiesContent = await fs.readFile(policiesPath, \"utf-8\");\n\n const payload = [\n {\n path: filePath,\n content: JSON.parse(openApiFileContent),\n },\n {\n path: POLICIES_FILENAME,\n content: JSON.parse(policiesContent),\n },\n ];\n reply.code(200).send(payload);\n },\n });\n\n instance.get(\"/open-api-files\", {\n handler: async (request, reply) => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /open-api-files\",\n });\n const projectConfigPath = path.join(this.workingDir, CONFIG_DIR);\n if (!(await dirExists(projectConfigPath))) {\n request.log.warn(\n `Cannot find the project '${CONFIG_DIR}' folder. Make sure '${this.workingDir}' has a '${CONFIG_DIR}' folder.`\n );\n return reply.code(404).send({\n message: `Cannot find the project '${CONFIG_DIR}' folder. Make sure '${this.workingDir}' has a '${CONFIG_DIR}' folder.`,\n });\n }\n\n const files = await readdir(projectConfigPath);\n const openApiFiles = files.filter((fileName) =>\n fileName.endsWith(\".oas.json\")\n );\n reply.code(200).send(openApiFiles);\n },\n });\n\n instance.route<{ Body: FileSaveBody[] }>({\n method: \"POST\",\n\n url: \"/save-open-api-updates\",\n handler: async (request, reply): Promise<void> => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /save-open-api-updates\",\n });\n\n const bodyContent = request.body;\n\n bodyContent.forEach(async (fileData) => {\n const openApiFilePath = path.join(\n this.workingDir,\n \"config\",\n fileData.filePath\n );\n if (!(await fileExists(openApiFilePath))) {\n return reply.code(404).send({\n message: `Cannot find file named '${fileData.filePath}'`,\n });\n }\n\n await fs.writeFile(\n openApiFilePath,\n JSON.stringify(fileData.content, null, 2) as string\n );\n });\n\n reply.code(200).send({ message: \"Changes were saved successfully\" });\n },\n });\n\n // SSE endpoint for real-time updates\n instance.get(\"/updates\", {\n handler: async (request, reply) => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /updates\",\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (this.watcher && this.watcher.closed === true) {\n // @NOTE - some UI interactions send a close event & we need to reenable\n // the watcher in the next event subscription request\n this.watcher = chokidar.watch(\n path.join(this.workingDir, CONFIG_DIR)\n );\n }\n\n this.watcher.on(\"change\", (filePath: string) => {\n const eventData = JSON.stringify({ type: \"update\", filePath });\n reply.sse({ id: Date.now().toString(), data: eventData });\n });\n\n request.raw.on(\"close\", async () => {\n await this.watcher.close();\n });\n\n // @NOTE - Initial reply to successfully initialize SSE connection\n reply.sse({\n id: Date.now().toString(),\n data: JSON.stringify({ filePath: POLICIES_FILENAME, type: \"init\" }),\n retry: 10,\n });\n this.sseContext = reply.sseContext;\n },\n });\n\n instance.get(\"/modules-data\", {\n handler: async (request, reply) => {\n await captureEvent({\n argv: cliArgs,\n event: \"route-designer: /modules-data\",\n });\n\n const projectModulesPath = path.join(this.workingDir, \"modules\");\n if (!(await dirExists(projectModulesPath))) {\n request.log.warn(\n `Cannot find the project 'modules' folder. Make sure '${this.workingDir}' has a 'modules' folder.`\n );\n return reply.code(200).send([]);\n }\n\n const files = await readdir(projectModulesPath);\n const modulesFiles = files.filter((fileName) =>\n fileName.endsWith(\".ts\")\n );\n\n const results: FunctionPickerModule[] = [];\n\n // @NOTE - its either this or bundling 40mb of typescript in the cli\n for (const moduleFileName of modulesFiles) {\n const fullPath = path.join(projectModulesPath, moduleFileName);\n const fileContent = await fs.readFile(fullPath, \"utf-8\");\n const exports: FunctionPickerMethod[] = [];\n\n // Regular expression to find default export\n const defaultExportRegex = /(?:export\\s+(default))/g;\n if (defaultExportRegex.exec(fileContent)) {\n exports.push({ name: \"default\", isHandlerInvocable: true });\n }\n\n // Regular expression to match exported functions/classes\n const functionRegex =\n /(?:export\\s+(function|class))\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g;\n\n let match;\n while ((match = functionRegex.exec(fileContent))) {\n exports.push({ name: match[2], isHandlerInvocable: true });\n }\n\n results.push({\n name: moduleFileName,\n filepath: `./modules/${moduleFileName}`,\n methods: exports,\n });\n }\n\n reply.code(200).send(results);\n },\n });\n\n instance.get(\"/ping\", {\n handler: async (_request, reply) => {\n reply.code(200).send();\n },\n });\n\n done();\n });\n };\n\n start = async (): Promise<void> => {\n await this.init();\n\n // See https://github.com/fastify/help/issues/641\n this.fastify.log.level = \"silent\";\n const start = async () => {\n return new Promise<void>((resolve, reject) => {\n this.fastify.listen(\n { port: this.listenerPort, host: this.listenerHost },\n (err) => {\n if (err) {\n reject(err);\n }\n\n this.fastify.log.level = \"info\";\n\n if (this.isStandalone) {\n printDiagnosticsToConsole(\"Started route designer\");\n printDiagnosticsToConsole(\"Ctrl+C to exit\");\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(\n `📘 Route Designer: http://${this.listenerHost}:${this.listenerPort}`\n );\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(\"\");\n }\n\n resolve();\n }\n );\n });\n };\n\n await start();\n };\n\n ready = async (): Promise<void> => {\n return this.fastify.ready();\n };\n\n close = async (): Promise<void> => {\n if (this.isStandalone) {\n printDiagnosticsToConsole(\"Closing route designer\");\n }\n\n try {\n void shutdownAnalytics();\n\n if (this.sseContext) {\n this.sseContext.source.end();\n }\n\n if (this.watcher) {\n await this.watcher.close();\n }\n\n await this.fastify.close();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log(err);\n }\n process.exit();\n };\n}\n"]}
|
package/dist/link/populate.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { applyEdits, modify } from "jsonc-parser";
|
|
2
1
|
import { existsSync } from "node:fs";
|
|
3
2
|
import { readFile, writeFile } from "node:fs/promises";
|
|
4
3
|
import { join, relative } from "node:path";
|
|
4
|
+
import { applyEdits, modify } from "jsonc-parser";
|
|
5
5
|
import { format } from "prettier";
|
|
6
6
|
import { ZUPLO_FALLBACK_JSON_FILE, ZUPLO_PREFERRED_JSON_FILE, ZUPLO_SYSTEM_ENV_VAR, } from "../common/constants.js";
|
|
7
7
|
import { logger } from "../common/logger.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"populate.js","sourceRoot":"","sources":["../../src/link/populate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"populate.js","sourceRoot":"","sources":["../../src/link/populate.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { applyEdits, modify } from \"jsonc-parser\";\nimport { format } from \"prettier\";\nimport {\n ZUPLO_FALLBACK_JSON_FILE,\n ZUPLO_PREFERRED_JSON_FILE,\n ZUPLO_SYSTEM_ENV_VAR,\n} from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { Arguments } from \"../link/handler.js\";\n\nexport async function safeMergeConfig(dir: string, project: string) {\n const normalizedDir = join(relative(process.cwd(), dir));\n const zuploPreferredConfigFile = join(\n normalizedDir,\n ZUPLO_PREFERRED_JSON_FILE\n );\n const zuploFallbackConfigFile = join(normalizedDir, ZUPLO_FALLBACK_JSON_FILE);\n if (existsSync(zuploPreferredConfigFile)) {\n // Process the file, while respecting comments\n // Apply the edits sequentially\n const originalContents = await readFile(zuploPreferredConfigFile, \"utf-8\");\n const modifyProjectEdit = modify(originalContents, [\"project\"], project, {\n getInsertionIndex: () => 2,\n });\n const contentsPostProject = applyEdits(originalContents, modifyProjectEdit);\n const formatted = await format(contentsPostProject, {\n parser: \"json\",\n quoteProps: \"as-needed\",\n });\n await writeFile(zuploPreferredConfigFile, formatted);\n } else if (existsSync(zuploFallbackConfigFile)) {\n // Copy the file over\n const config = JSON.parse(await readFile(zuploFallbackConfigFile, \"utf-8\"));\n const formatted = await format(\n JSON.stringify({\n version: 1,\n project: project,\n compatibilityDate: config.compatibilityDate,\n }),\n {\n parser: \"json\",\n quoteProps: \"as-needed\",\n }\n );\n await writeFile(zuploPreferredConfigFile, formatted);\n } else {\n // Create new file\n const formatted = await format(\n JSON.stringify({\n version: 1,\n project: project,\n compatibilityDate: \"2023-03-14\",\n }),\n {\n parser: \"json\",\n quoteProps: \"as-needed\",\n }\n );\n await writeFile(zuploPreferredConfigFile, formatted);\n }\n}\n\nexport async function pullSystemConfig(\n argv: Pick<Arguments, \"dir\" | \"environment\" | \"authToken\">\n) {\n const normalizedDir = join(relative(process.cwd(), argv.dir));\n const zuploPreferredConfigFile = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n\n const environmentResponseFromDeveloperAPI = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments/${argv.environment}/configurations`,\n {\n headers: {\n authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (!environmentResponseFromDeveloperAPI.ok) {\n if (\n environmentResponseFromDeveloperAPI.status === 404 ||\n environmentResponseFromDeveloperAPI.status === 401\n ) {\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to link data from the environment. The environment you specified doesn't exist or you don't have access to it.\"\n );\n } else {\n logger.error(\n {\n status: environmentResponseFromDeveloperAPI.status,\n statusText: environmentResponseFromDeveloperAPI.statusText,\n },\n `Failed to link data from ${argv.environment}`\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to link data from the environment. Please try again later.\"\n );\n }\n }\n\n const payload = await environmentResponseFromDeveloperAPI.json();\n\n const content = `\n# This file is auto-generated from zuplo link. Please do not edit it manually.\n# It will be auto-generated afresh the next time you run zuplo link.\n# If you wish to add your own environment variables, create a separate .env file.\n\nZUPLO_ACCOUNT_NAME=${payload.accountName}\nZUPLO_PROJECT_NAME=${payload.projectName}\nZUPLO_ENVIRONMENT_TYPE=${payload.environmentType}\nZUPLO_SYSTEM_CONFIGURATIONS=${payload[\"systemConfigurations\"]}\n`;\n\n await writeFile(zuploPreferredConfigFile, content);\n}\n"]}
|
package/dist/login/tokens.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { decodeJwt } from "jose";
|
|
2
1
|
import { existsSync, mkdirSync } from "node:fs";
|
|
3
2
|
import { readFile, writeFile } from "node:fs/promises";
|
|
4
3
|
import { join } from "node:path";
|
|
4
|
+
import { decodeJwt } from "jose";
|
|
5
5
|
import { ZUPLO_AUTH_FILE_NAME } from "../common/constants.js";
|
|
6
6
|
import { logger } from "../common/logger.js";
|
|
7
7
|
import { printDiagnosticsToConsole } from "../common/output.js";
|
package/dist/login/tokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/login/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/login/tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { decodeJwt } from \"jose\";\nimport { ZUPLO_AUTH_FILE_NAME } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { printDiagnosticsToConsole } from \"../common/output.js\";\nimport { ZUPLO_XDG_STATE_HOME } from \"../common/xdg/lib.js\";\nimport { AUTH0_DOMAIN, CLIENT_ID } from \"./login.js\";\n\nexport interface OAuthResponse {\n refresh_token?: string;\n access_token: string;\n id_token: string;\n expires_in: number;\n token_type: string;\n scope: string;\n}\n\n/**\n * Refreshes the access token using the provided refresh token.\n * @param refreshToken The refresh token to use for obtaining a new access token.\n * @returns A promise resolving to the new authentication state.\n */\nexport async function refreshAccessToken(\n refreshToken: string\n): Promise<OAuthResponse> {\n const response = await fetch(`https://${AUTH0_DOMAIN}/oauth/token`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to refresh token: ${response.statusText}`);\n }\n\n return response.json();\n}\n\nexport async function getAuthToken(): Promise<string | undefined> {\n // The auth file doesn't exist.\n if (!existsSync(join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME))) {\n return;\n }\n\n const rawAuth = await readFile(\n join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME),\n \"utf-8\"\n );\n const authJson = JSON.parse(rawAuth);\n const jwt = decodeJwt(authJson.access_token);\n\n // The credentials have expired\n if (!jwt.exp || jwt.exp < Date.now() / 1000) {\n logger.debug(\"Access token expired, attempting to get a new one\");\n // If we have a refresh token try to refresh\n if (authJson.refresh_token) {\n try {\n const newAuth = await refreshAccessToken(authJson.refresh_token);\n await saveAuthState(newAuth);\n return newAuth.access_token;\n } catch (error) {\n logger.error(error, `Failed to refresh access token`);\n return;\n }\n }\n return;\n }\n return authJson.access_token;\n}\n\nexport async function saveAuthState(result: OAuthResponse): Promise<void> {\n try {\n if (!existsSync(ZUPLO_XDG_STATE_HOME)) {\n mkdirSync(ZUPLO_XDG_STATE_HOME, { recursive: true });\n }\n const tokenPath = join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME);\n await writeFile(tokenPath, JSON.stringify(result));\n } catch (error) {\n logger.error(error, \"Failed to save auth state\");\n printDiagnosticsToConsole(\"Failed to save authorization state.\");\n }\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { confirm } from "@inquirer/prompts";
|
|
2
|
-
import { mergeOpenApiDocuments } from "@zuplo/openapi-tools";
|
|
3
|
-
import jsYaml from "js-yaml";
|
|
4
1
|
import { existsSync, writeFileSync } from "node:fs";
|
|
5
2
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
6
3
|
import { tmpdir } from "node:os";
|
|
7
4
|
import path, { basename, dirname, extname, join, relative } from "node:path";
|
|
5
|
+
import { confirm } from "@inquirer/prompts";
|
|
6
|
+
import { mergeOpenApiDocuments } from "@zuplo/openapi-tools";
|
|
7
|
+
import jsYaml from "js-yaml";
|
|
8
8
|
import { format } from "prettier";
|
|
9
9
|
import { logger } from "../../common/logger.js";
|
|
10
10
|
import { printCriticalFailureToConsoleAndExit, printDiagnosticsToConsole, printResultToConsoleAndExitGracefully, } from "../../common/output.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/project/import-openapi/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { confirm } from \"@inquirer/prompts\";\nimport { mergeOpenApiDocuments } from \"@zuplo/openapi-tools\";\nimport jsYaml from \"js-yaml\";\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path, { basename, dirname, extname, join, relative } from \"node:path\";\nimport { format } from \"prettier\";\nimport { CommonArgs } from \"../../common/args.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../../common/output.js\";\nimport { ZuploOpenApiDocument } from \"./interfaces.js\";\nimport { addOperationIdsAsNecessary, parseOpenApiFile } from \"./utils.js\";\n\nexport interface Arguments extends CommonArgs {\n dir: string;\n prompt: boolean;\n source: string;\n destination: string;\n \"source-url\": string;\n \"merge-mode\"?: \"path-method\" | \"operation-id\";\n}\n\nexport const BASE_TEMPLATE = `\n{\n \"openapi\": \"3.1.0\",\n \"info\": {\n \"version\": \"1.0.0\",\n \"title\": \"My Zuplo API\"\n },\n \"paths\": {}\n}\n\n`;\n\n// import is a reserved keyword so importSpec was used instead\nexport async function importOpenApi(argv: Arguments) {\n let normalizedFilePath: string;\n // First see if this is a url\n let handleAsUrl = true;\n try {\n new URL(argv.source);\n } catch {\n handleAsUrl = false;\n }\n\n if (handleAsUrl) {\n const parsedUrl = new URL(argv.source);\n const tempDir = tmpdir();\n const guessedFileName =\n basename(parsedUrl.pathname).replace(/\\.[^/.]+$/, \"\") ||\n `imported-${Buffer.from(argv.source).toString(\"base64\")}`;\n normalizedFilePath = join(tempDir, guessedFileName);\n await mkdir(dirname(normalizedFilePath), { recursive: true });\n\n try {\n const response = await fetch(parsedUrl);\n if (!response.ok) {\n await printCriticalFailureToConsoleAndExit(\n `Failed to download the remote OpenAPI file. Server responded with ${response.status} ${response.statusText}`\n );\n }\n\n const text = await response.text();\n\n try {\n // 1a. See if this is json else try to parse as yaml\n JSON.parse(text);\n normalizedFilePath = normalizedFilePath + \".json\";\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch {\n try {\n // 1b. See if this is yaml\n jsYaml.load(text);\n normalizedFilePath = normalizedFilePath + \".yaml\";\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch {\n await printCriticalFailureToConsoleAndExit(\n `Failed to parse the remote OpenAPI file as either JSON or YAML.`\n );\n }\n }\n } catch (err) {\n logger.error(err);\n await printCriticalFailureToConsoleAndExit(\n `Failed to download the remote OpenAPI file.`\n );\n }\n } else {\n // 1c. This is a normal file so we use the file extension\n const filePath = argv.source;\n normalizedFilePath = join(relative(process.cwd(), filePath));\n\n if (!existsSync(normalizedFilePath)) {\n await printCriticalFailureToConsoleAndExit(\n `The file ${normalizedFilePath} to import does not exist.`\n );\n }\n }\n\n const rawOpenApiSpec = await readFile(normalizedFilePath);\n const extName = extname(normalizedFilePath);\n const fileContent = rawOpenApiSpec.toString();\n const parsedOpenApiSpec = await parseOpenApiFile(extName, fileContent);\n\n const destination = argv.destination;\n\n if (!destination.endsWith(\".oas.json\")) {\n await printCriticalFailureToConsoleAndExit(\n `Destination file name must end with '.oas.json'`\n );\n }\n\n const destinationFilePath = join(relative(process.cwd(), destination));\n\n let originalDocument: ZuploOpenApiDocument;\n if (!existsSync(destinationFilePath)) {\n // This is an initial import\n originalDocument = (await parseOpenApiFile(\n \".json\",\n BASE_TEMPLATE\n )) as ZuploOpenApiDocument;\n } else {\n const existingOpenApiSpec = await readFile(destinationFilePath);\n const existingFileContent = existingOpenApiSpec.toString();\n originalDocument = (await parseOpenApiFile(\n extName,\n existingFileContent\n )) as ZuploOpenApiDocument;\n }\n\n // Default to path-method merging\n const mergeMode = argv[\"merge-mode\"] || \"path-method\";\n\n const { created, merged, retained, mergedDocument } = mergeOpenApiDocuments(\n originalDocument,\n parsedOpenApiSpec,\n mergeMode\n );\n\n // Present the changes\n printDiagnosticsToConsole(\"This import will...\");\n printDiagnosticsToConsole(\"\");\n\n if (created.size > 0) {\n printDiagnosticsToConsole(\n `Create ${created.size} new ${\n created.size > 1 ? \"operations\" : \"operation\"\n }`\n );\n printDiagnosticsToConsole(\"\");\n created.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (merged.size > 0) {\n printDiagnosticsToConsole(\n `Merge ${merged.size} ${merged.size > 1 ? \"operations\" : \"operation\"}`\n );\n printDiagnosticsToConsole(\"\");\n merged.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (retained.size > 0) {\n printDiagnosticsToConsole(\n `Retain ${retained.size} ${\n retained.size > 1 ? \"operations\" : \"operation\"\n }`\n );\n printDiagnosticsToConsole(\"\");\n retained.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (argv.prompt) {\n printDiagnosticsToConsole(\"\");\n const answer = await confirm({ message: \"Proceed?\", default: true });\n if (!answer) {\n await printResultToConsoleAndExitGracefully(\"Import cancelled.\");\n }\n }\n\n addOperationIdsAsNecessary(mergedDocument);\n\n const formattedOpenApi = await format(JSON.stringify(mergedDocument), {\n parser: \"json-stringify\",\n });\n\n // Create folder structure if needed\n if (!existsSync(destinationFilePath)) {\n // Get the directory path of the file\n const dir = path.dirname(destinationFilePath);\n\n // Ensure that the directory exists (creates parent directories if necessary)\n await mkdir(dir, { recursive: true });\n }\n\n writeFileSync(destinationFilePath, formattedOpenApi, {\n flag: \"w\",\n });\n\n await printResultToConsoleAndExitGracefully(\n `Import successful. File written to ${destinationFilePath}`\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/project/import-openapi/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,oCAAoC,EACpC,yBAAyB,EACzB,qCAAqC,GACtC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAW1E,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;CAU5B,CAAC;AAGF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAe;IACjD,IAAI,kBAA0B,CAAC;IAE/B,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;QACzB,MAAM,eAAe,GACnB,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YACrD,YAAY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACpD,MAAM,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,oCAAoC,CACxC,qEAAqE,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC9G,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,IAAI,CAAC;gBAEH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjB,kBAAkB,GAAG,kBAAkB,GAAG,OAAO,CAAC;gBAClD,MAAM,SAAS,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC;oBAEH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClB,kBAAkB,GAAG,kBAAkB,GAAG,OAAO,CAAC;oBAClD,MAAM,SAAS,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,oCAAoC,CACxC,iEAAiE,CAClE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,oCAAoC,CACxC,6CAA6C,CAC9C,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QAEN,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,MAAM,oCAAoC,CACxC,YAAY,kBAAkB,4BAA4B,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IAC9C,MAAM,iBAAiB,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEvE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAErC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,MAAM,oCAAoC,CACxC,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAEvE,IAAI,gBAAsC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAErC,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,CACxC,OAAO,EACP,aAAa,CACd,CAAyB,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,mBAAmB,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,QAAQ,EAAE,CAAC;QAC3D,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,CACxC,OAAO,EACP,mBAAmB,CACpB,CAAyB,CAAC;IAC7B,CAAC;IAGD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC;IAEtD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,qBAAqB,CACzE,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,CACV,CAAC;IAGF,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;IACjD,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAE9B,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,yBAAyB,CACvB,UAAU,OAAO,CAAC,IAAI,QACpB,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WACpC,EAAE,CACH,CAAC;QACF,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC5B,yBAAyB,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACpB,yBAAyB,CACvB,SAAS,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,EAAE,CACvE,CAAC;QACF,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC3B,yBAAyB,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtB,yBAAyB,CACvB,UAAU,QAAQ,CAAC,IAAI,IACrB,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WACrC,EAAE,CACH,CAAC;QACF,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC9B,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC7B,yBAAyB,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,qCAAqC,CAAC,mBAAmB,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,0BAA0B,CAAC,cAAc,CAAC,CAAC;IAE3C,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE;QACpE,MAAM,EAAE,gBAAgB;KACzB,CAAC,CAAC;IAGH,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAErC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAG9C,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,mBAAmB,EAAE,gBAAgB,EAAE;QACnD,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;IAEH,MAAM,qCAAqC,CACzC,sCAAsC,mBAAmB,EAAE,CAC5D,CAAC;AACJ,CAAC","sourcesContent":["import { existsSync, writeFileSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path, { basename, dirname, extname, join, relative } from \"node:path\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { mergeOpenApiDocuments } from \"@zuplo/openapi-tools\";\nimport jsYaml from \"js-yaml\";\nimport { format } from \"prettier\";\nimport { CommonArgs } from \"../../common/args.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../../common/output.js\";\nimport { ZuploOpenApiDocument } from \"./interfaces.js\";\nimport { addOperationIdsAsNecessary, parseOpenApiFile } from \"./utils.js\";\n\nexport interface Arguments extends CommonArgs {\n dir: string;\n prompt: boolean;\n source: string;\n destination: string;\n \"source-url\": string;\n \"merge-mode\"?: \"path-method\" | \"operation-id\";\n}\n\nexport const BASE_TEMPLATE = `\n{\n \"openapi\": \"3.1.0\",\n \"info\": {\n \"version\": \"1.0.0\",\n \"title\": \"My Zuplo API\"\n },\n \"paths\": {}\n}\n\n`;\n\n// import is a reserved keyword so importSpec was used instead\nexport async function importOpenApi(argv: Arguments) {\n let normalizedFilePath: string;\n // First see if this is a url\n let handleAsUrl = true;\n try {\n new URL(argv.source);\n } catch {\n handleAsUrl = false;\n }\n\n if (handleAsUrl) {\n const parsedUrl = new URL(argv.source);\n const tempDir = tmpdir();\n const guessedFileName =\n basename(parsedUrl.pathname).replace(/\\.[^/.]+$/, \"\") ||\n `imported-${Buffer.from(argv.source).toString(\"base64\")}`;\n normalizedFilePath = join(tempDir, guessedFileName);\n await mkdir(dirname(normalizedFilePath), { recursive: true });\n\n try {\n const response = await fetch(parsedUrl);\n if (!response.ok) {\n await printCriticalFailureToConsoleAndExit(\n `Failed to download the remote OpenAPI file. Server responded with ${response.status} ${response.statusText}`\n );\n }\n\n const text = await response.text();\n\n try {\n // 1a. See if this is json else try to parse as yaml\n JSON.parse(text);\n normalizedFilePath = normalizedFilePath + \".json\";\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch {\n try {\n // 1b. See if this is yaml\n jsYaml.load(text);\n normalizedFilePath = normalizedFilePath + \".yaml\";\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch {\n await printCriticalFailureToConsoleAndExit(\n `Failed to parse the remote OpenAPI file as either JSON or YAML.`\n );\n }\n }\n } catch (err) {\n logger.error(err);\n await printCriticalFailureToConsoleAndExit(\n `Failed to download the remote OpenAPI file.`\n );\n }\n } else {\n // 1c. This is a normal file so we use the file extension\n const filePath = argv.source;\n normalizedFilePath = join(relative(process.cwd(), filePath));\n\n if (!existsSync(normalizedFilePath)) {\n await printCriticalFailureToConsoleAndExit(\n `The file ${normalizedFilePath} to import does not exist.`\n );\n }\n }\n\n const rawOpenApiSpec = await readFile(normalizedFilePath);\n const extName = extname(normalizedFilePath);\n const fileContent = rawOpenApiSpec.toString();\n const parsedOpenApiSpec = await parseOpenApiFile(extName, fileContent);\n\n const destination = argv.destination;\n\n if (!destination.endsWith(\".oas.json\")) {\n await printCriticalFailureToConsoleAndExit(\n `Destination file name must end with '.oas.json'`\n );\n }\n\n const destinationFilePath = join(relative(process.cwd(), destination));\n\n let originalDocument: ZuploOpenApiDocument;\n if (!existsSync(destinationFilePath)) {\n // This is an initial import\n originalDocument = (await parseOpenApiFile(\n \".json\",\n BASE_TEMPLATE\n )) as ZuploOpenApiDocument;\n } else {\n const existingOpenApiSpec = await readFile(destinationFilePath);\n const existingFileContent = existingOpenApiSpec.toString();\n originalDocument = (await parseOpenApiFile(\n extName,\n existingFileContent\n )) as ZuploOpenApiDocument;\n }\n\n // Default to path-method merging\n const mergeMode = argv[\"merge-mode\"] || \"path-method\";\n\n const { created, merged, retained, mergedDocument } = mergeOpenApiDocuments(\n originalDocument,\n parsedOpenApiSpec,\n mergeMode\n );\n\n // Present the changes\n printDiagnosticsToConsole(\"This import will...\");\n printDiagnosticsToConsole(\"\");\n\n if (created.size > 0) {\n printDiagnosticsToConsole(\n `Create ${created.size} new ${\n created.size > 1 ? \"operations\" : \"operation\"\n }`\n );\n printDiagnosticsToConsole(\"\");\n created.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (merged.size > 0) {\n printDiagnosticsToConsole(\n `Merge ${merged.size} ${merged.size > 1 ? \"operations\" : \"operation\"}`\n );\n printDiagnosticsToConsole(\"\");\n merged.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (retained.size > 0) {\n printDiagnosticsToConsole(\n `Retain ${retained.size} ${\n retained.size > 1 ? \"operations\" : \"operation\"\n }`\n );\n printDiagnosticsToConsole(\"\");\n retained.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (argv.prompt) {\n printDiagnosticsToConsole(\"\");\n const answer = await confirm({ message: \"Proceed?\", default: true });\n if (!answer) {\n await printResultToConsoleAndExitGracefully(\"Import cancelled.\");\n }\n }\n\n addOperationIdsAsNecessary(mergedDocument);\n\n const formattedOpenApi = await format(JSON.stringify(mergedDocument), {\n parser: \"json-stringify\",\n });\n\n // Create folder structure if needed\n if (!existsSync(destinationFilePath)) {\n // Get the directory path of the file\n const dir = path.dirname(destinationFilePath);\n\n // Ensure that the directory exists (creates parent directories if necessary)\n await mkdir(dir, { recursive: true });\n }\n\n writeFileSync(destinationFilePath, formattedOpenApi, {\n flag: \"w\",\n });\n\n await printResultToConsoleAndExitGracefully(\n `Import successful. File written to ${destinationFilePath}`\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke-test.d.ts","sourceRoot":"","sources":["../../src/test/invoke-test.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"invoke-test.d.ts","sourceRoot":"","sources":["../../src/test/invoke-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAS,MAAM,OAAO,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzC,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAkCpD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke-test.js","sourceRoot":"","sources":["../../src/test/invoke-test.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"invoke-test.js","sourceRoot":"","sources":["../../src/test/invoke-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,MAAM,0BAA2B,SAAQ,KAAK;IAC5C;QACE,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAe;IAGf,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1E,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,sBAAsB,EAAE,sBAAsB,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QAID,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,WAAW,GACf,WAAW,IAAI,EAAE;YACf,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,eAAe,gBAAgB;YAChD,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvB,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAChD,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YACjC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YAGb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,0BAA0B,EAAE,CAAC;IACzC,CAAC;AACH,CAAC","sourcesContent":["import { ExecaReturnBase, execa } from \"execa\";\nimport { TEST_OUT_FOLDER } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { Arguments } from \"./handler.js\";\n\nclass MissingNodeExecutableError extends Error {\n constructor() {\n super(\"Missing executable: Cannot locate node executable\");\n Object.setPrototypeOf(this, MissingNodeExecutableError.prototype);\n }\n}\n\nexport async function runTests(\n argv: Arguments\n): Promise<Pick<ExecaReturnBase<string>, \"exitCode\">> {\n // Assume that \"node\" is in the path\n const nodeExecutable = process.platform === \"win32\" ? \"node.exe\" : \"node\";\n if (nodeExecutable) {\n const args = [\"--test\", \"--test-reporter=spec\", \"--enable-source-maps\"];\n if (argv.filter) {\n args.push(\"--test-name-pattern\", argv.filter);\n }\n\n // Check Node.js version to determine glob pattern\n // See https://github.com/nodejs/node/pull/47653#issuecomment-1692984053\n const nodeVersion = parseInt(process.versions.node.split(\".\")[0], 10);\n const globPattern =\n nodeVersion >= 21\n ? `${argv.dir}/${TEST_OUT_FOLDER}/**/*.test.mjs`\n : `${argv.dir}/${TEST_OUT_FOLDER}`;\n\n args.push(globPattern);\n\n const nodeProcess = execa(nodeExecutable, args);\n nodeProcess.stdout?.pipe(process.stdout);\n nodeProcess.stderr?.pipe(process.stderr);\n try {\n const result = await nodeProcess;\n return result;\n } catch (err) {\n // We do not want to output the err by default since it could be a test failure\n // Test failures are already reported by piping stdout and stderr above\n logger.debug(err);\n return { exitCode: err.exitCode };\n }\n } else {\n throw new MissingNodeExecutableError();\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zuplo/cli",
|
|
3
|
-
"version": "6.49.
|
|
3
|
+
"version": "6.49.3",
|
|
4
4
|
"repository": "https://github.com/zuplo/zuplo",
|
|
5
5
|
"author": "Zuplo, Inc.",
|
|
6
6
|
"type": "module",
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"@opentelemetry/api": "^1.8.0",
|
|
30
30
|
"@sentry/node": "^9.10.0",
|
|
31
31
|
"@swc/core": "1.10.18",
|
|
32
|
-
"@zuplo/core": "^6.49.
|
|
33
|
-
"@zuplo/openapi-tools": "^6.49.
|
|
34
|
-
"@zuplo/runtime": "^6.49.
|
|
32
|
+
"@zuplo/core": "^6.49.3",
|
|
33
|
+
"@zuplo/openapi-tools": "^6.49.3",
|
|
34
|
+
"@zuplo/runtime": "^6.49.3",
|
|
35
35
|
"as-table": "^1.0.55",
|
|
36
36
|
"chalk": "^5.3.0",
|
|
37
37
|
"chokidar": "^3.5.3",
|