Files
coco-app/tsup.config.ts
BiggerRain 9e682ceafc ci: add ci detection for web component packaging (#927)
* build: add web build ci

* chore: remove  test code

* Update .github/workflows/frontend-ci.yml

Co-authored-by: SteveLauC <stevelauc@outlook.com>

---------

Co-authored-by: SteveLauC <stevelauc@outlook.com>
2025-10-16 08:58:04 +08:00

157 lines
3.9 KiB
TypeScript

import { defineConfig } from 'tsup';
import { writeFileSync, readFileSync, readdirSync, statSync } from 'fs';
import { join, resolve } from 'path';
const projectPackageJson = JSON.parse(
readFileSync(join(__dirname, 'package.json'), 'utf-8')
);
function walk(dir: string): string[] {
const entries = readdirSync(dir);
const files: string[] = [];
for (const name of entries) {
const full = join(dir, name);
const stat = statSync(full);
if (stat.isDirectory()) {
files.push(...walk(full));
} else {
files.push(full);
}
}
return files;
}
function hasTauriRefs(content: string): boolean {
return /@tauri-apps|tauri-plugin/i.test(content);
}
export default defineConfig({
entry: ['src/pages/web/index.tsx'],
format: ['esm'],
dts: true,
splitting: true,
sourcemap: false,
clean: true,
treeshake: true,
minify: true,
env: {
BUILD_TARGET: 'web',
NODE_ENV: 'production',
},
external: [
'react',
'react-dom',
],
esbuildOptions(options) {
options.bundle = true;
options.platform = 'browser';
options.loader = {
'.css': 'css',
'.scss': 'css',
'.svg': 'dataurl',
'.png': 'dataurl',
'.jpg': 'dataurl',
},
options.alias = {
'@': resolve(__dirname, './src')
}
options.external = [
'@tauri-apps/api',
'@tauri-apps/plugin-*',
'tauri-plugin-*',
];
options.treeShaking = true;
options.define = {
'process.env.BUILD_TARGET': '"web"',
'process.env.NODE_ENV': '"production"',
'process.env.DEBUG': 'false',
'process.env.IS_DEV': 'false',
'process.env.VERSION': `"${projectPackageJson.version}"`,
};
options.pure = ['console.log'];
options.target = 'es2020';
options.legalComments = 'none';
options.ignoreAnnotations = false;
},
esbuildPlugins: [
{
name: 'jsx-import-source',
setup(build) {
build.initialOptions.jsx = 'automatic';
build.initialOptions.jsxImportSource = 'react';
},
},
],
outDir: 'out/search-chat',
async onSuccess() {
const outDir = join(__dirname, 'out/search-chat');
const files = walk(outDir).filter(f => /\.(m?js|cjs)$/i.test(f));
const tauriFiles = files.filter(f => {
const content = readFileSync(f, 'utf-8');
return hasTauriRefs(content);
});
if (tauriFiles.length) {
throw new Error(
`Build output contains Tauri references:\n${tauriFiles.map(f => ` - ${f}`).join('\n')}`
);
}
const projectPackageJson = JSON.parse(
readFileSync(join(__dirname, 'package.json'), 'utf-8')
);
const packageJson = {
name: "@infinilabs/search-chat",
version: "1.2.46",
main: "index.js",
module: "index.js",
type: "module",
types: "index.d.ts",
dependencies: projectPackageJson.dependencies,
peerDependencies: {
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
"sideEffects": [
"*.css",
"*.scss"
],
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org/"
}
};
const noNeedDeps = [
"dotenv",
"uuid",
"wavesurfer.js",
]
const tauriDeps = Object.keys(packageJson.dependencies).filter(dep =>
dep.includes('@tauri-apps') ||
dep.includes('tauri-plugin') ||
noNeedDeps.includes(dep)
);
tauriDeps.forEach(dep => {
delete packageJson.dependencies[dep];
});
writeFileSync(
join(__dirname, 'out/search-chat/package.json'),
JSON.stringify(packageJson, null, 2)
);
try {
const readmePath = join(__dirname, 'src/pages/web/README.md');
const readmeContent = readFileSync(readmePath, 'utf-8');
writeFileSync(
join(__dirname, 'out/search-chat/README.md'),
readmeContent
);
} catch (error) {
console.error('Failed to copy README.md:', error);
}
}
});