You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.9 KiB
118 lines
2.9 KiB
import { init } from "./init";
|
|
import { modifyPackageJson, savePackageJson } from "./util/modifyPackageJson";
|
|
import { generateReadme } from "./generateReadme";
|
|
import path from "path";
|
|
import prompts from "prompts";
|
|
import type { PackageJson } from "type-fest";
|
|
import loading from "loading-cli";
|
|
import { promises as fs } from "fs";
|
|
import { renderFile } from "ejs";
|
|
|
|
export async function create(directory: string) {
|
|
// Init the NPM Package
|
|
const responses = await prompts([
|
|
{
|
|
type: "text",
|
|
name: "name",
|
|
message: "Package name:",
|
|
initial: path.basename(directory),
|
|
},
|
|
{
|
|
type: "text",
|
|
name: "version",
|
|
message: "Version:",
|
|
initial: "1.0.0",
|
|
},
|
|
{
|
|
type: "text",
|
|
name: "description",
|
|
message: "Description:",
|
|
},
|
|
{
|
|
type: "list",
|
|
name: "keywords",
|
|
message: "Keywords (comma separated):",
|
|
separator: ",",
|
|
},
|
|
{
|
|
type: "text",
|
|
name: "author",
|
|
message: "Author:",
|
|
},
|
|
{
|
|
type: "text",
|
|
name: "license",
|
|
message: "License:",
|
|
initial: "MIT",
|
|
},
|
|
{
|
|
type: "text",
|
|
name: "repository",
|
|
message: "Git repository (optional):",
|
|
},
|
|
]);
|
|
|
|
const load = loading("Generating package.json");
|
|
|
|
const packageJson: PackageJson = {
|
|
name: responses.name,
|
|
version: responses.version,
|
|
description: responses.description,
|
|
keywords: responses.keywords,
|
|
author: responses.author,
|
|
license: responses.license,
|
|
main: "./index.js",
|
|
};
|
|
|
|
if (responses.repository) {
|
|
packageJson.repository = {
|
|
type: "git",
|
|
url: responses.repository,
|
|
};
|
|
packageJson.bugs = {
|
|
url: `${responses.repository.replace(/\.git$/, "")}/issues`,
|
|
};
|
|
packageJson.homepage = `${responses.repository.replace(
|
|
/\.git$/,
|
|
"",
|
|
)}#readme`;
|
|
}
|
|
|
|
await savePackageJson(directory, packageJson);
|
|
|
|
// Init LDO
|
|
load.text = "Initializing LDO";
|
|
await init({ directory });
|
|
|
|
// Add prepublish script
|
|
await modifyPackageJson(directory, async (packageJson) => {
|
|
if (!packageJson.scripts) packageJson.scripts = {};
|
|
packageJson.scripts.prepublish =
|
|
"npm run build:ldo & npm run generate-readme";
|
|
packageJson.scripts[
|
|
"genenerate-readme"
|
|
] = `ldo generate-readme --project ./ --shapes ./.shapes --ldo ./.ldo`;
|
|
return packageJson;
|
|
});
|
|
|
|
// Create index.js
|
|
load.text = "Generating index.js";
|
|
const ldoDir = await fs.readdir(path.join(directory, "./.ldo"), {
|
|
withFileTypes: true,
|
|
});
|
|
const indexText = await renderFile(
|
|
path.join(__dirname, "./templates/readme/projectIndex.ejs"),
|
|
{ fileNames: ldoDir.map((file) => file.name) },
|
|
);
|
|
await fs.writeFile(path.join(directory, "index.js"), indexText);
|
|
|
|
// Generate ReadMe
|
|
load.text = "Generating README";
|
|
await generateReadme({
|
|
project: directory,
|
|
shapes: path.join(directory, ".shapes"),
|
|
ldo: path.join(directory, ".ldo"),
|
|
});
|
|
|
|
load.stop();
|
|
}
|
|
|