UNPKG

@lit-protocol/vincent-scaffold-sdk

Version:

Shared build configuration and utilities for Vincent tools and policies

184 lines (158 loc) 4.68 kB
const fs = require("fs"); const path = require("path"); const { polyfillNode } = require("esbuild-plugin-polyfill-node"); const Hash = require("ipfs-only-hash"); function aliasFetch() { const shim = path.resolve(__dirname, "deno-fetch-shim.js"); return { name: "alias-fetch", setup(build) { build.onResolve({ filter: /^node-fetch$/ }, () => ({ path: shim })); build.onResolve({ filter: /^cross-fetch(\/.*)?$/ }, () => ({ path: shim, })); }, }; } const ensureDirectoryExistence = (filePath) => { const dirname = path.dirname(filePath); if (!fs.existsSync(dirname)) { fs.mkdirSync(dirname, { recursive: true }); } }; function litActionModuleCode({ ipfsCid, content }) { return `/** * DO NOT EDIT THIS FILE. IT IS GENERATED ON BUILD. * @type {string} - anonymous function (() => { ... }) */ const code = ${JSON.stringify(content)}; module.exports = { "code": code, "ipfsCid": "${ipfsCid}", }; `; } function metadataJsonFile({ ipfsCid }) { return `{ "ipfsCid": "${ipfsCid}" } `; } function getBundledCode(type) { const capitalizedType = type.charAt(0).toUpperCase() + type.slice(1); return `/** * DO NOT EDIT THIS FILE. IT IS GENERATED ON BUILD. */ import { asBundledVincent${capitalizedType} } from '@lit-protocol/vincent-tool-sdk'; import { vincent${capitalizedType} } from '../lib/vincent-${type}'; import metadata from './vincent-${type}-metadata.json'; if(!metadata.ipfsCid) { throw new Error('ipfsCid is not defined in metadata JSON file'); } export const bundledVincent${capitalizedType} = asBundledVincent${capitalizedType}(vincent${capitalizedType}, metadata.ipfsCid); `; } const wrapIIFEInStringPlugin = { name: "wrap-iife-in-string", setup(build) { build.initialOptions.write = false; build.onEnd(async (result) => { if (result.errors.length > 0) { console.error("Build failed with errors:", result.errors); return; } const outputFile = result.outputFiles[0]; const content = outputFile.text; const ipfsCid = await Hash.of(content); const wrapped = litActionModuleCode({ content, ipfsCid }); const outputPath = path.resolve(outputFile.path); ensureDirectoryExistence(outputPath); fs.writeFileSync(outputPath, wrapped); }); }, }; function createBundledFilePlugin(type) { const capitalizedType = type.charAt(0).toUpperCase() + type.slice(1); return { name: `create-vincent-bundled-${type}-file`, setup(build) { build.initialOptions.write = false; const sourceDir = path.dirname(build.initialOptions.entryPoints[0]); console.log(sourceDir); build.onEnd(async (result) => { if (result.errors.length > 0) { console.error("Build failed with errors:", result.errors); return; } const outputFile = result.outputFiles[0]; const content = outputFile.text; const ipfsCid = await Hash.of(content); // Write bundled wrapper const bundledSource = getBundledCode(type); const bundledPath = path.join( sourceDir, `../generated/vincent-bundled-${type}.ts` ); fs.writeFileSync(bundledPath, bundledSource); // Write metadata JSON const outputPath = path.dirname(path.resolve(outputFile.path)); const metadataPath = path.join( outputPath, `vincent-${type}-metadata.json` ); const metadataContent = metadataJsonFile({ ipfsCid }); fs.writeFileSync(metadataPath, metadataContent); }); }, }; } const baseConfig = { tsconfig: "./tsconfig.json", bundle: true, minify: false, sourcemap: false, treeShaking: true, metafile: true, platform: "browser", write: false, }; function getPlugins(type) { return [ aliasFetch(), polyfillNode({ globals: { Buffer: true, process: true, }, modules: { crypto: true, http: true, https: true, stream: true, zlib: true, url: true, util: true, }, }), wrapIIFEInStringPlugin, createBundledFilePlugin(type), ]; } function logBuildResults(result) { result.outputFiles.forEach((file) => { const bytes = file.text.length; const mbInBinary = (bytes / (1024 * 1024)).toFixed(4); const mbInDecimal = (bytes / 1_000_000).toFixed(4); console.log( `✅ ./src/generated/${file.path .split("/") .pop()}\n- ${mbInDecimal} MB (in decimal)\n- ${mbInBinary} MB (in binary)` ); }); } module.exports = { baseConfig, getPlugins, ensureDirectoryExistence, logBuildResults, };