99 lines
2.8 KiB
JavaScript
99 lines
2.8 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import vitePluginVue from "@vitejs/plugin-vue";
|
|
import vitePluginVueJsx from "@vitejs/plugin-vue-jsx";
|
|
import { visualizer as rollupPluginVisualizer } from "rollup-plugin-visualizer";
|
|
import { defineConfig } from "vite";
|
|
import packageJson from "./package.json" with { type: "json" };
|
|
import { getPackageDependencies } from "./scripts/collect-dependencies.mjs";
|
|
|
|
const IS_PRODUCTION = process.env.NODE_ENV === "production";
|
|
const IS_CI = Boolean(process.env.CI);
|
|
const OUT_DIRECTORY = "./static/playground/";
|
|
const cdnDependencies = {
|
|
exclude: new Set(["@docusaurus/preset-classic"]),
|
|
overrideDependencies: new Map([
|
|
// We don't need deps from `vue`
|
|
["vue", []],
|
|
]),
|
|
ignoreDependencies: (name) => name.startsWith("@types/"),
|
|
};
|
|
|
|
// Local develop requires `vue` for HMR
|
|
if (!IS_PRODUCTION) {
|
|
cdnDependencies.exclude.add("vue");
|
|
}
|
|
|
|
export default defineConfig(async () => {
|
|
const alias = await buildCdnAlias();
|
|
|
|
return {
|
|
base: IS_PRODUCTION ? "/playground/" : undefined,
|
|
publicDir: IS_PRODUCTION ? undefined : "./static/",
|
|
plugins: [
|
|
vitePluginVue(),
|
|
vitePluginVueJsx(),
|
|
IS_CI || !IS_PRODUCTION
|
|
? undefined
|
|
: rollupPluginVisualizer({
|
|
filename: `${OUT_DIRECTORY}bundle-report.html`,
|
|
}),
|
|
].filter(Boolean),
|
|
resolve: {
|
|
alias,
|
|
},
|
|
build: {
|
|
outDir: OUT_DIRECTORY,
|
|
minify: IS_CI,
|
|
},
|
|
};
|
|
});
|
|
|
|
async function buildCdnAlias() {
|
|
if (!IS_PRODUCTION) {
|
|
return;
|
|
}
|
|
|
|
return Object.fromEntries(
|
|
await Promise.all(
|
|
Object.keys(packageJson.dependencies)
|
|
.filter((name) => !cdnDependencies.exclude.has(name))
|
|
.map(async (name) => [name, await getPackageCdnUrl(name)]),
|
|
),
|
|
);
|
|
}
|
|
|
|
async function getPackageCdnUrl(dependencyName) {
|
|
const { name, version, dependencies } = await getPackageDependencies({
|
|
name: dependencyName,
|
|
base: import.meta.url,
|
|
overrideDependencies: cdnDependencies.overrideDependencies,
|
|
ignoreDependencies: cdnDependencies.ignoreDependencies,
|
|
});
|
|
|
|
assertDependenciesUnique(name, dependencies);
|
|
const url = new URL(`https://esm.sh/${name}@${version}`);
|
|
const { searchParams } = url;
|
|
// searchParams.set("conditions", ["browser"]);
|
|
|
|
if (dependencies.length > 0) {
|
|
searchParams.set(
|
|
"deps",
|
|
dependencies.map(({ name, version }) => `${name}@${version}`).join(","),
|
|
);
|
|
}
|
|
|
|
return url.href;
|
|
}
|
|
|
|
function assertDependenciesUnique(name, dependencies) {
|
|
const versions = new Map();
|
|
|
|
for (const dependency of dependencies) {
|
|
assert.ok(
|
|
!versions.has(dependency.name),
|
|
`Multiple version of '${dependency.name}' in dependency tree of '${name}', '${versions.get(dependency.name)?.version}' and '${dependency.version}'.`,
|
|
);
|
|
versions.set(dependency.name, dependency);
|
|
}
|
|
}
|