@reliverse/rse-sdk
Version:
@reliverse/rse-sdk allows you to create new plugins for @reliverse/rse CLI, interact with reliverse.org, and even extend your own CLI functionality (you may also try @reliverse/dler-sdk for this case).
106 lines (105 loc) • 3.61 kB
JavaScript
import fs from "@reliverse/relifso";
import path from "node:path";
import { addPackageDependency } from "../../utils/add-package-deps.js";
import { setupStarlight } from "./starlight-setup.js";
import { setupTauri } from "./tauri-setup.js";
export async function setupAddons(config) {
const { addons, frontend, projectDir } = config;
const hasReactWebFrontend = frontend.includes("react-router") || frontend.includes("tanstack-router") || frontend.includes("next");
const hasNuxtFrontend = frontend.includes("nuxt");
const hasSvelteFrontend = frontend.includes("svelte");
const hasSolidFrontend = frontend.includes("solid");
const hasNextFrontend = frontend.includes("next");
if (addons.includes("turborepo")) {
await addPackageDependency({
devDependencies: ["turbo"],
projectDir
});
}
if (addons.includes("pwa") && (hasReactWebFrontend || hasSolidFrontend)) {
await setupPwa(projectDir, frontend);
}
if (addons.includes("tauri") && (hasReactWebFrontend || hasNuxtFrontend || hasSvelteFrontend || hasSolidFrontend || hasNextFrontend)) {
await setupTauri(config);
}
if (addons.includes("biome")) {
await setupBiome(projectDir);
}
if (addons.includes("husky")) {
await setupHusky(projectDir);
}
if (addons.includes("starlight")) {
await setupStarlight(config);
}
}
function getWebAppDir(projectDir, frontends) {
if (frontends.some(
(f) => ["react-router", "tanstack-router", "nuxt", "svelte", "solid"].includes(
f
)
)) {
return path.join(projectDir, "apps/web");
}
return path.join(projectDir, "apps/web");
}
async function setupBiome(projectDir) {
await addPackageDependency({
devDependencies: ["@biomejs/biome"],
projectDir
});
const packageJsonPath = path.join(projectDir, "package.json");
if (await fs.pathExists(packageJsonPath)) {
const packageJson = await fs.readJson(packageJsonPath);
packageJson.scripts = {
...packageJson.scripts,
check: "biome check --write ."
};
await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
}
}
async function setupHusky(projectDir) {
await addPackageDependency({
devDependencies: ["husky", "lint-staged"],
projectDir
});
const packageJsonPath = path.join(projectDir, "package.json");
if (await fs.pathExists(packageJsonPath)) {
const packageJson = await fs.readJson(packageJsonPath);
packageJson.scripts = {
...packageJson.scripts,
prepare: "husky"
};
packageJson["lint-staged"] = {
"*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}": [
"biome check --write ."
]
};
await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
}
}
async function setupPwa(projectDir, frontends) {
const isCompatibleFrontend = frontends.some(
(f) => ["react-router", "tanstack-router", "solid"].includes(f)
);
if (!isCompatibleFrontend) return;
const clientPackageDir = getWebAppDir(projectDir, frontends);
if (!await fs.pathExists(clientPackageDir)) {
return;
}
await addPackageDependency({
dependencies: ["vite-plugin-pwa"],
devDependencies: ["@vite-pwa/assets-generator"],
projectDir: clientPackageDir
});
const clientPackageJsonPath = path.join(clientPackageDir, "package.json");
if (await fs.pathExists(clientPackageJsonPath)) {
const packageJson = await fs.readJson(
clientPackageJsonPath
);
packageJson.scripts = {
...packageJson.scripts,
"generate-pwa-assets": "pwa-assets-generator"
};
await fs.writeJson(clientPackageJsonPath, packageJson, { spaces: 2 });
}
}