novu
Version:
Novu CLI. Run Novu Studio and sync workflows with Novu Cloud
163 lines (162 loc) • 7.99 kB
JavaScript
;
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);