Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions change/apibara-e6e30cda-092c-494d-b47b-f3c452f6e898.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "cli: add .gitignore template",
"packageName": "apibara",
"email": "jadejajaipal5@gmail.com",
"dependentChangeType": "patch"
}
9 changes: 6 additions & 3 deletions packages/cli/src/create/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import prompts from "prompts";
import { addIndexer } from "./add";
import { cyan, green } from "./colors";
import {
createGitIgnoreFile,
generateApibaraConfig,
generatePackageJson,
generateTsConfig,
Expand Down Expand Up @@ -129,23 +130,23 @@ export async function initializeProject({
JSON.stringify(packageJson, null, 2) + "\n",
);
await formatFile(packageJsonPath);
consola.success("Created ", cyan("package.json"));
consola.success("Created", cyan("package.json"));

// Generate tsconfig.json if TypeScript
if (isTs) {
const tsConfigPath = path.join(root, "tsconfig.json");
const tsConfig = generateTsConfig();
fs.writeFileSync(tsConfigPath, JSON.stringify(tsConfig, null, 2) + "\n");
await formatFile(tsConfigPath);
consola.success("Created ", cyan("tsconfig.json"));
consola.success("Created", cyan("tsconfig.json"));
}

const apibaraConfigPath = path.join(root, `apibara.config.${configExt}`);
// Generate apibara.config
const apibaraConfig = generateApibaraConfig(isTs);
fs.writeFileSync(apibaraConfigPath, apibaraConfig);
await formatFile(apibaraConfigPath);
consola.success("Created ", cyan(`apibara.config.${configExt}`));
consola.success("Created", cyan(`apibara.config.${configExt}`));

// Create "indexers" directory if not exists
const indexersDir = path.join(root, "indexers");
Expand All @@ -154,6 +155,8 @@ export async function initializeProject({
consola.success(`Created ${cyan("indexers")} directory`);
}

await createGitIgnoreFile(root);

console.log("\n");

consola.ready(green("Project initialized successfully"));
Expand Down
101 changes: 101 additions & 0 deletions packages/cli/src/create/templates.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import fs from "node:fs";
import path from "node:path";
import { consola } from "consola";
import prompts from "prompts";
import { type ObjectLiteralExpression, Project, SyntaxKind } from "ts-morph";
import { cyan, green, magenta, yellow } from "./colors";
import { packageVersions } from "./constants";
Expand Down Expand Up @@ -466,3 +467,103 @@ export async function createStorageRelatedFiles(options: IndexerOptions) {
await createDrizzleStorageFiles(options);
}
}

const gitIgnoreItems: {
isRecommended: boolean;
description?: string;
value: string;
}[] = [
{
isRecommended: false,
value: "node_modules",
},
{
isRecommended: false,
value: "dist",
},
{
isRecommended: true,
description: "build and dev files of apibara",
value: ".apibara",
},
{
isRecommended: false,
value: ".env",
},
{
isRecommended: false,
description: "for mac users",
value: ".DS_Store",
},
];

export async function createGitIgnoreFile(cwd: string) {
const gitIgnorePath = path.join(cwd, ".gitignore");

if (fs.existsSync(gitIgnorePath)) {
const result = await prompts([
{
type: "select",
name: "overwrite",
message: `${cyan(".gitignore")} already exists. Please choose how to proceed:`,
initial: 0,
choices: [
{
title: "Choose items to append in your .gitignore",
value: "append",
},
{
title: "Keep original",
value: "ignore",
},
{
title: "Overwrite",
value: "overwrite",
},
],
},
{
type: (overwrite: "append" | "ignore" | "overwrite") =>
overwrite === "append" ? "multiselect" : null,
name: "ignoreItems",
message: "Choose items to append in your .gitignore",
choices: gitIgnoreItems.map((item) => ({
title: `${yellow(item.value)}${
item.description ? ` - ${item.description}` : ""
}${item.isRecommended ? ` ${green("(recommended)")}` : ""}`,
value: item.value,
})),
},
]);

const { overwrite, ignoreItems } = result as {
overwrite: "append" | "ignore" | "overwrite";
ignoreItems: string[];
};

if (overwrite === "append" && ignoreItems.length > 0) {
const gitIgnoreContent = fs.readFileSync(gitIgnorePath, "utf8");
fs.writeFileSync(
gitIgnorePath,
`${gitIgnoreContent}\n${result.ignoreItems.join("\n")}`,
);
consola.success(`Updated ${cyan(".gitignore")}`);
return;
}

if (overwrite === "overwrite") {
fs.writeFileSync(
gitIgnorePath,
gitIgnoreItems.map((item) => item.value).join("\n"),
);
consola.success(`Updated ${cyan(".gitignore")}`);
return;
}
}

fs.writeFileSync(
gitIgnorePath,
gitIgnoreItems.map((item) => item.value).join("\n"),
);
consola.success(`Created ${cyan(".gitignore")}`);
}