mirror of
https://github.com/hwchase17/langchain
synced 2024-10-31 15:20:26 +00:00
77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
|
/* eslint-disable prefer-template */
|
||
|
/* eslint-disable no-param-reassign */
|
||
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
||
|
const babel = require("@babel/core");
|
||
|
const path = require("path");
|
||
|
const fs = require("fs");
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @param {string|Buffer} content Content of the resource file
|
||
|
* @param {object} [map] SourceMap data consumable by https://github.com/mozilla/source-map
|
||
|
* @param {any} [meta] Meta data, could be anything
|
||
|
*/
|
||
|
async function webpackLoader(content, map, meta) {
|
||
|
const cb = this.async();
|
||
|
|
||
|
if (!this.resourcePath.endsWith(".ts")) {
|
||
|
cb(null, JSON.stringify({ content, imports: [] }), map, meta);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
const result = await babel.parseAsync(content, {
|
||
|
sourceType: "module",
|
||
|
filename: this.resourcePath,
|
||
|
});
|
||
|
|
||
|
const imports = [];
|
||
|
|
||
|
result.program.body.forEach((node) => {
|
||
|
if (node.type === "ImportDeclaration") {
|
||
|
const source = node.source.value;
|
||
|
|
||
|
if (!source.startsWith("langchain")) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
node.specifiers.forEach((specifier) => {
|
||
|
if (specifier.type === "ImportSpecifier") {
|
||
|
const local = specifier.local.name;
|
||
|
const imported = specifier.imported.name;
|
||
|
imports.push({ local, imported, source });
|
||
|
} else {
|
||
|
throw new Error("Unsupported import type");
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
imports.forEach((imp) => {
|
||
|
const { imported, source } = imp;
|
||
|
const moduleName = source.split("/").slice(1).join("_");
|
||
|
const docsPath = path.resolve(__dirname, "docs", "api", moduleName);
|
||
|
const available = fs.readdirSync(docsPath, { withFileTypes: true });
|
||
|
const found = available.find(
|
||
|
(dirent) =>
|
||
|
dirent.isDirectory() &&
|
||
|
fs.existsSync(path.resolve(docsPath, dirent.name, imported + ".md"))
|
||
|
);
|
||
|
if (found) {
|
||
|
imp.docs =
|
||
|
"/" + path.join("docs", "api", moduleName, found.name, imported);
|
||
|
} else {
|
||
|
throw new Error(
|
||
|
`Could not find docs for ${source}.${imported} in docs/api/`
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
cb(null, JSON.stringify({ content, imports }), map, meta);
|
||
|
} catch (err) {
|
||
|
cb(err);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = webpackLoader;
|