{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Plugin, ResolvedConfig } from \"vite\";\r\nimport { generateCustomFunctionsMetadata, IGenerateResult, IAssociate } from \"custom-functions-metadata\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\n\r\ninterface CustomFunctionsPluginOptions {\r\n  input: string | string[];\r\n  output: string;\r\n}\r\n\r\nclass CustomFunctionsMetadataPlugin {\r\n  public static generateResults: Record<string, IGenerateResult> = {};\r\n}\r\n\r\nfunction customFunctionsMetadataPlugin(options: CustomFunctionsPluginOptions): Plugin {\r\n  let config: ResolvedConfig;\r\n  let resolvedInputFiles: string[] = [];\r\n  let generateResult: IGenerateResult;\r\n\r\n  return {\r\n    name: \"vite:custom-functions-metadata\",\r\n\r\n    configResolved(resolvedConfig) {\r\n      config = resolvedConfig;\r\n      // Resolve input files to absolute paths\r\n      resolvedInputFiles = Array.isArray(options.input) ? options.input.map((file) => path.resolve(file)) : [path.resolve(options.input)];\r\n    },\r\n\r\n    async buildStart() {\r\n      try {\r\n        // Generate metadata before the build starts\r\n        generateResult = await generateCustomFunctionsMetadata(resolvedInputFiles, true);\r\n\r\n        if (generateResult.errors.length > 0) {\r\n          generateResult.errors.forEach((err) => {\r\n            this.error(new Error(`${options.input} ${err}`));\r\n          });\r\n        } else {\r\n          // Store the result for use in the transform hook\r\n          CustomFunctionsMetadataPlugin.generateResults[Array.isArray(options.input) ? options.input[0] : options.input] = generateResult;\r\n        }\r\n      } catch (error) {\r\n        this.error(new Error(`Failed to generate metadata: ${(error as Error).message}`));\r\n      }\r\n    },\r\n\r\n    async transform(code, id) {\r\n      // Check if the current file is one of our input files\r\n      const foundInputFile = resolvedInputFiles.find((file) => id.endsWith(file));\r\n      if (!foundInputFile) {\r\n        return null; // Not one of our target files, return null to skip transformation\r\n      }\r\n\r\n      // Get the original input option as a string for the lookup key\r\n      const inputKey = Array.isArray(options.input) ? options.input[0] : options.input;\r\n\r\n      if (!CustomFunctionsMetadataPlugin.generateResults[inputKey]) {\r\n        return code; // No results found, return unchanged code\r\n      }\r\n\r\n      // Find associations for this file\r\n      const associations = CustomFunctionsMetadataPlugin.generateResults[inputKey].associate.filter(\r\n        (item: IAssociate) => item.sourceFileName === foundInputFile\r\n      );\r\n\r\n      // Add associations to the end of the file\r\n      let transformedCode = code;\r\n      associations.forEach((item: IAssociate) => {\r\n        transformedCode += `\\nCustomFunctions.associate(\"${item.id}\", ${item.functionName});`;\r\n      });\r\n\r\n      return transformedCode;\r\n    },\r\n\r\n    async writeBundle() {\r\n      // Write the metadata JSON file during the bundle phase (for production builds)\r\n      if (generateResult && !generateResult.errors.length) {\r\n        const outputPath = path.resolve(config.build.outDir, options.output);\r\n        try {\r\n          // Ensure the directory exists\r\n          await fs.mkdir(path.dirname(outputPath), { recursive: true });\r\n          // Write the metadata file\r\n          await fs.writeFile(outputPath, generateResult.metadataJson);\r\n        } catch (error) {\r\n          this.error(`Failed to write metadata file: ${(error as Error).message}`);\r\n        }\r\n      }\r\n    },\r\n\r\n    configureServer(server) {\r\n      // For development mode: ensure metadata file is created when dev server starts\r\n      return () => {\r\n        server.middlewares.use(async (req, res, next) => {\r\n          // Only do this once when server starts\r\n          if (generateResult && !generateResult.errors.length && req.url?.endsWith(options.output)) {\r\n            const outputPath = path.resolve(server.config.root, options.output);\r\n            try {\r\n              // Ensure the directory exists\r\n              await fs.mkdir(path.dirname(outputPath), { recursive: true });\r\n              // Write the metadata file\r\n              await fs.writeFile(outputPath, generateResult.metadataJson);\r\n              // Serve the file directly\r\n              res.setHeader(\"Content-Type\", \"application/json\");\r\n              res.end(generateResult.metadataJson);\r\n              return;\r\n            } catch (error) {\r\n              console.error(`Failed to write metadata file: ${(error as Error).message}`);\r\n            }\r\n          }\r\n          next();\r\n        });\r\n      };\r\n    },\r\n  };\r\n}\r\n\r\nexport { customFunctionsMetadataPlugin };\r\nexport default customFunctionsMetadataPlugin;\r\n"],"mappings":"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","names":["path","fs"]}