YANG QIA 4720244eb3
feat: ai integration (#6283)
* feat: ai

* fix: build

* fix: plugin

* fix: bug

* fix: version

* chore: add debug info

* chore: allows to enter a model name manually

* chore: update

* chore: optimize

* fix: bug

* fix: version

* fix: build

* fix: test
2025-03-04 16:54:11 +08:00

166 lines
5.2 KiB
TypeScript

import { defineConfig } from '@nocobase/build';
import fs from 'fs-extra';
import path from 'path';
async function generateIndexFiles(packageJsonPath: string) {
// Read and parse package.json
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));
const exports = packageJson.exports;
// Collect all export paths excluding package.json
const exportPaths = Object.entries(exports)
.filter(([key]) => key !== './package.json')
.map(([key, value]: [string, any]) => {
// Remove './' prefix from the key
const normalizedKey = key.startsWith('./') ? key.slice(2) : key;
// Get the paths for different formats
const paths = {
js: typeof value === 'object' ? value.import?.replace(/^\.\//, '') : value?.replace(/^\.\//, ''),
dts: typeof value === 'object' ? value.types?.import?.replace(/^\.\//, '') : null,
};
return { key: normalizedKey, paths };
});
// Generate JavaScript index content
const jsContent = `// This file is auto-generated from package.json exports
// Do not edit this file manually
${exportPaths.map(({ key, paths }) => `export * from './${paths.js.replace(/\.js$/, '')}';`).join('\n')}
`;
// Generate CommonJS index content
const cjsContent = `// This file is auto-generated from package.json exports
// Do not edit this file manually
${exportPaths.map(({ key, paths }) => `module.exports = require('../${paths.js.replace(/\.js$/, '')}');`).join('\n')}
`;
// Generate TypeScript declaration content
const dtsContent = `// This file is auto-generated from package.json exports
// Do not edit this file manually
${exportPaths
.map(({ key, paths }) => {
const dtsPath = paths.dts?.replace(/\.d\.ts$/, '') || paths.js.replace(/\.js$/, '');
return `export * from './${dtsPath}';`;
})
.join('\n')}
`;
// Generate CommonJS declaration content
const ctsContent = `// This file is auto-generated from package.json exports
// Do not edit this file manually
${exportPaths
.map(({ key, paths }) => {
const dtsPath = paths.dts?.replace(/\.d\.ts$/, '') || paths.js.replace(/\.js$/, '');
return `export * from './${dtsPath}';`;
})
.join('\n')}
`;
// Generate package.json exports for index files
const indexExports = {
'.': {
types: {
import: './index.d.ts',
require: './index.d.cts',
default: './index.d.ts',
},
import: './index.js',
require: './index.cjs',
},
...exports, // Keep existing exports
};
return {
js: jsContent,
cjs: cjsContent,
dts: dtsContent,
cts: ctsContent,
exports: indexExports,
};
}
async function writeIndexFiles(pkgPath: string) {
try {
const contents = await generateIndexFiles(pkgPath);
const outputDir = path.dirname(pkgPath);
// Write index.js
await fs.writeFile(path.join(outputDir, 'index.js'), contents.js);
await fs.writeFile(path.join(outputDir, 'dist', 'index.js'), contents.js);
console.log('Generated index.js');
// Write index.js
await fs.writeFile(path.join(outputDir, 'index.cjs'), contents.cjs);
await fs.writeFile(path.join(outputDir, 'dist', 'index.cjs'), contents.cjs);
console.log('Generated index.cjs');
// Write index.d.ts
await fs.writeFile(path.join(outputDir, 'index.d.ts'), contents.dts);
await fs.writeFile(path.join(outputDir, 'dist', 'index.d.ts'), contents.dts);
console.log('Generated index.d.ts');
// Write index.d.cts
await fs.writeFile(path.join(outputDir, 'index.d.cts'), contents.cts);
console.log('Generated index.d.cts');
// Update package.json with new exports
const packageJson = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));
packageJson.exports = contents.exports;
await fs.writeFile(pkgPath, JSON.stringify(packageJson, null, 2) + '\n');
console.log('Updated package.json exports');
} catch (error) {
console.error('Error generating index files:', error);
}
}
export default defineConfig({
beforeBuild: async (log) => {
await fs.promises.rm(path.resolve(__dirname, 'dist'), { recursive: true, force: true });
const pkgPath = path.resolve(process.cwd(), 'node_modules/@langchain/core/package.json');
await writeIndexFiles(pkgPath);
},
afterBuild: async (log) => {
log('copying deps');
const deps = [
'decamelize',
'zod',
'zod-to-json-schema',
'langsmith',
'p-retry',
'p-queue',
'p-timeout',
'p-finally',
'mustache',
// 'js-tiktoken/lite',
'@cfworker/json-schema',
];
for (const dep of deps) {
const depPath = path.resolve(process.cwd(), 'node_modules', dep);
await fs.promises.cp(depPath, path.resolve(__dirname, 'dist/node_modules/@langchain/core/node_modules', dep), {
recursive: true,
force: true,
});
}
log('copying js-tiktoken/lite');
const files = ['lite.d.ts', 'lite.js', 'lite.cjs'];
for (const file of files) {
const depPath = path.dirname(require.resolve('js-tiktoken/lite'));
const filePath = path.resolve(depPath, file);
await fs.promises.cp(
filePath,
path.resolve(__dirname, 'dist/node_modules/@langchain/core/node_modules/js-tiktoken', file),
{
recursive: true,
force: true,
},
);
}
},
});