UNPKG

vite-custom-functions-metadata

Version:

Vite plugin for generating and injecting Custom Functions metadata

1 lines 7.18 kB
{"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"]}