@lit-protocol/vincent-scaffold-sdk
Version:
Shared build configuration and utilities for Vincent tools and policies
184 lines (158 loc) • 4.68 kB
JavaScript
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,
};