mirror of
https://github.com/infinilabs/coco-app.git
synced 2025-12-14 18:47:42 +01:00
* 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>
157 lines
3.9 KiB
TypeScript
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);
|
|
}
|
|
}
|
|
}); |