Files
classroomio/apps/embeds/vite.config.ts
T
2026-04-27 11:40:38 +01:00

89 lines
2.8 KiB
TypeScript

import path from 'node:path';
import { fileURLToPath } from 'node:url';
import tailwindcss from '@tailwindcss/vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import { defineConfig } from 'vite';
import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js';
const dirname = path.dirname(fileURLToPath(import.meta.url));
const embedEntries = {
'question-type-picker': path.resolve(dirname, 'src/widgets/question-type-picker/bootstrap.ts'),
'course-widget': path.resolve(dirname, 'src/widgets/course-widget/bootstrap.ts')
} as const;
const embedDevEntrypoints = {
'/embeds/question-type-picker/question-type-picker.js': '/src/widgets/question-type-picker/bootstrap.ts',
'/embeds/course-widget/course-widget.js': '/src/widgets/course-widget/bootstrap.ts'
} as const;
function embedDevEntryPlugin() {
return {
name: 'embed-dev-entry-plugin',
configureServer(server: {
middlewares: { use: (handler: (req: { url?: string }, res: unknown, next: () => void) => void) => void };
}) {
server.middlewares.use((req, _res, next) => {
const requestUrl = req.url ?? '';
const [pathname, search = ''] = requestUrl.split('?');
const rewrittenPath = embedDevEntrypoints[pathname as keyof typeof embedDevEntrypoints];
if (rewrittenPath) {
req.url = search ? `${rewrittenPath}?${search}` : rewrittenPath;
}
next();
});
}
};
}
export default defineConfig(({ command, mode }) => {
const buildTarget = mode in embedEntries ? (mode as keyof typeof embedEntries) : null;
const buildEntry = buildTarget ? { [buildTarget]: embedEntries[buildTarget] } : embedEntries;
return {
root: dirname,
plugins: [embedDevEntryPlugin(), tailwindcss(), svelte(), cssInjectedByJsPlugin()],
resolve: {
alias: {
'@cio/ui': path.resolve(dirname, 'node_modules/@cio/ui/src'),
'@cio/ui/*': path.resolve(dirname, 'node_modules/@cio/ui/src/*'),
$src: path.resolve(dirname, 'node_modules/@cio/ui/src')
},
conditions: ['svelte', 'browser', 'import']
},
optimizeDeps: {
include: ['svelte-tiptap'],
exclude: ['@tiptap/core', '@tiptap/pm']
},
build:
command === 'build'
? {
outDir: buildTarget ? `dist/${buildTarget}` : 'dist',
emptyOutDir: false,
cssCodeSplit: false,
lib: {
entry: buildEntry,
name: 'CIOEmbeds',
formats: ['es'],
fileName: (_format, entryName) => `${entryName}.js`
},
rollupOptions: {
output: {
inlineDynamicImports: false,
chunkFileNames: '[name]-[hash].js'
}
}
}
: {},
server: {
port: 5180,
cors: true
},
preview: {
port: 4180,
cors: true
}
};
});