UNPKG

novu

Version:

Novu CLI. Run Novu Studio and sync workflows with Novu Cloud

163 lines (162 loc) 7.99 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.installTemplate = exports.SRC_DIR_NAMES = exports.getTemplateFile = void 0; const fast_glob_1 = require("fast-glob"); const os_1 = __importDefault(require("os")); const promises_1 = __importDefault(require("fs/promises")); const path_1 = __importDefault(require("path")); const picocolors_1 = require("picocolors"); const async_sema_1 = require("async-sema"); const copy_1 = require("../helpers/copy"); const install_1 = require("../helpers/install"); const types_1 = require("./types"); const getTemplateFile = ({ template, mode, file, }) => { return path_1.default.join(__dirname, template, mode, file); }; exports.getTemplateFile = getTemplateFile; exports.SRC_DIR_NAMES = ["app", "pages", "styles"]; const installTemplate = async ({ appName, root, packageManager, isOnline, template, mode, eslint, srcDir, importAlias, secretKey, applicationId, userId, }) => { console.log((0, picocolors_1.bold)(`Using ${packageManager}.`)); console.log("\nInitializing project with template:", template, "\n"); const templatePath = path_1.default.join(__dirname, template, mode); const copySource = ["**"]; if (!eslint) copySource.push("!eslintrc.json"); if (!template.includes("react")) { copySource.push(mode === "ts" ? "tailwind.config.ts" : "!tailwind.config.js", "!postcss.config.cjs"); } await (0, copy_1.copy)(copySource, root, { parents: true, cwd: templatePath, rename(name) { switch (name) { case "gitignore": case "eslintrc.json": { return `.${name}`; } case "README-template.md": { return "README.md"; } default: { return name; } } }, }); const tsconfigFile = path_1.default.join(root, "tsconfig.json"); await promises_1.default.writeFile(tsconfigFile, (await promises_1.default.readFile(tsconfigFile, "utf8")) .replace(`"@/*": ["./*"]`, srcDir ? `"@/*": ["./src/*"]` : `"@/*": ["./*"]`) .replace(`"@/*":`, `"${importAlias}":`)); if (importAlias !== "@/*") { const files = await (0, fast_glob_1.async)("**/*", { cwd: root, dot: true, stats: false, ignore: ["tsconfig.json", "jsconfig.json", ".git/**/*"], }); const writeSema = new async_sema_1.Sema(8, { capacity: files.length }); await Promise.all(files.map(async (file) => { await writeSema.acquire(); const filePath = path_1.default.join(root, file); if ((await promises_1.default.stat(filePath)).isFile()) { await promises_1.default.writeFile(filePath, (await promises_1.default.readFile(filePath, "utf8")).replace(`@/`, `${importAlias.replace(/\*/g, "")}`)); } writeSema.release(); })); } if (srcDir) { await promises_1.default.mkdir(path_1.default.join(root, "src"), { recursive: true }); await Promise.all(exports.SRC_DIR_NAMES.map(async (file) => { await promises_1.default .rename(path_1.default.join(root, file), path_1.default.join(root, "src", file)) .catch((err) => { if (err.code !== "ENOENT") { throw err; } }); })); const isAppTemplate = template.startsWith("app"); const indexPageFile = path_1.default.join("src", isAppTemplate ? "app" : "pages", `${isAppTemplate ? "page" : "index"}.${mode === "ts" ? "tsx" : "js"}`); await promises_1.default.writeFile(indexPageFile, (await promises_1.default.readFile(indexPageFile, "utf8")).replace(isAppTemplate ? "app/page" : "pages/index", isAppTemplate ? "src/app/page" : "src/pages/index")); if (template === types_1.TemplateTypeEnum.APP_REACT_EMAIL) { const tailwindConfigFile = path_1.default.join(root, mode === "ts" ? "tailwind.config.ts" : "tailwind.config.js"); await promises_1.default.writeFile(tailwindConfigFile, (await promises_1.default.readFile(tailwindConfigFile, "utf8")).replace(/\.\/(\w+)\/\*\*\/\*\.\{js,ts,jsx,tsx,mdx\}/g, "./src/$1/**/*.{js,ts,jsx,tsx,mdx}")); } } const val = Object.entries({ NOVU_SECRET_KEY: secretKey, NEXT_PUBLIC_NOVU_APPLICATION_IDENTIFIER: applicationId, NEXT_PUBLIC_NOVU_SUBSCRIBER_ID: userId, }).reduce((acc, [key, value]) => { return `${acc}${key}=${value}${os_1.default.EOL}`; }, ""); await promises_1.default.writeFile(path_1.default.join(root, ".env.local"), val); await (0, copy_1.copy)(copySource, `${root}/.github`, { parents: true, cwd: path_1.default.join(__dirname, `./github`), }); const version = "14.2.3"; const packageJson = { name: appName, version: "0.1.0", private: true, scripts: { dev: `next dev --port=4000`, build: "next build", start: "next start", lint: "next lint", }, dependencies: { react: "^18", "react-dom": "^18", next: version, "@novu/framework": "latest", "@novu/nextjs": "^2.5.0", }, devDependencies: {}, }; if (mode === "ts") { packageJson.devDependencies = Object.assign(Object.assign({}, packageJson.devDependencies), { typescript: "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18" }); } if (template === types_1.TemplateTypeEnum.APP_REACT_EMAIL) { packageJson.devDependencies = Object.assign(Object.assign({}, packageJson.devDependencies), { postcss: "^8", tailwindcss: "^3.4.1" }); packageJson.dependencies = Object.assign(Object.assign({}, packageJson.dependencies), { "@react-email/components": "0.0.18", "@react-email/tailwind": "0.0.18" }); packageJson.dependencies = Object.assign(Object.assign({}, packageJson.dependencies), { zod: "^3.23.8", "zod-to-json-schema": "^3.23.1" }); } if (eslint) { packageJson.devDependencies = Object.assign(Object.assign({}, packageJson.devDependencies), { eslint: "^8", "eslint-config-next": version }); } const devDeps = Object.keys(packageJson.devDependencies).length; if (!devDeps) delete packageJson.devDependencies; await promises_1.default.writeFile(path_1.default.join(root, "package.json"), JSON.stringify(packageJson, null, 2) + os_1.default.EOL); console.log("\nInstalling dependencies:"); for (const dependency in packageJson.dependencies) console.log(`- ${(0, picocolors_1.cyan)(dependency)}`); if (devDeps) { console.log("\nInstalling devDependencies:"); for (const dependency in packageJson.devDependencies) console.log(`- ${(0, picocolors_1.cyan)(dependency)}`); } console.log(); await (0, install_1.install)(packageManager, isOnline); }; exports.installTemplate = installTemplate; __exportStar(require("./types"), exports);