apibara 2.1.0-beta.4 → 2.1.0-beta.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/chunks/add.mjs +16 -8
  2. package/dist/chunks/add.mjs.map +1 -0
  3. package/dist/chunks/build.mjs +4 -2
  4. package/dist/chunks/build.mjs.map +1 -0
  5. package/dist/chunks/dev.mjs +55 -21
  6. package/dist/chunks/dev.mjs.map +1 -0
  7. package/dist/chunks/init.mjs +11 -7
  8. package/dist/chunks/init.mjs.map +1 -0
  9. package/dist/chunks/prepare.mjs +4 -2
  10. package/dist/chunks/prepare.mjs.map +1 -0
  11. package/dist/chunks/start.mjs +16 -4
  12. package/dist/chunks/start.mjs.map +1 -0
  13. package/dist/chunks/write-project-info.mjs +51 -0
  14. package/dist/chunks/write-project-info.mjs.map +1 -0
  15. package/dist/cli/index.mjs +3 -1
  16. package/dist/cli/index.mjs.map +1 -0
  17. package/dist/common/index.d.mts +33 -0
  18. package/dist/common/index.d.ts +33 -0
  19. package/dist/common/index.mjs +91 -0
  20. package/dist/common/index.mjs.map +1 -0
  21. package/dist/config/index.mjs +1 -0
  22. package/dist/config/index.mjs.map +1 -0
  23. package/dist/core/index.mjs +134 -69
  24. package/dist/core/index.mjs.map +1 -0
  25. package/dist/create/index.d.mts +2 -1
  26. package/dist/create/index.d.ts +2 -1
  27. package/dist/create/index.mjs +168 -139
  28. package/dist/create/index.mjs.map +1 -0
  29. package/dist/hooks/index.mjs +6 -1
  30. package/dist/hooks/index.mjs.map +1 -0
  31. package/dist/indexer/index.d.ts +1 -0
  32. package/dist/indexer/index.mjs +1 -0
  33. package/dist/indexer/plugins.d.ts +1 -0
  34. package/dist/indexer/plugins.mjs +1 -0
  35. package/dist/indexer/testing.d.ts +1 -0
  36. package/dist/indexer/testing.mjs +1 -0
  37. package/dist/indexer/vcr.d.ts +1 -0
  38. package/dist/indexer/vcr.mjs +1 -0
  39. package/dist/rolldown/index.d.mts +7 -0
  40. package/dist/rolldown/index.d.ts +7 -0
  41. package/dist/rolldown/index.mjs +141 -0
  42. package/dist/rolldown/index.mjs.map +1 -0
  43. package/dist/runtime/dev.mjs +39 -17
  44. package/dist/runtime/internal/app.d.ts +14 -1
  45. package/dist/runtime/internal/app.mjs +26 -21
  46. package/dist/runtime/project-info.d.ts +3 -0
  47. package/dist/runtime/project-info.mjs +67 -0
  48. package/dist/runtime/start.mjs +78 -11
  49. package/dist/shared/apibara.730bb1e4.mjs +18 -0
  50. package/dist/shared/apibara.730bb1e4.mjs.map +1 -0
  51. package/dist/types/index.d.mts +24 -20
  52. package/dist/types/index.d.ts +24 -20
  53. package/dist/types/index.mjs +1 -0
  54. package/dist/types/index.mjs.map +1 -0
  55. package/package.json +33 -16
  56. package/src/cli/commands/add.ts +16 -7
  57. package/src/cli/commands/build.ts +5 -2
  58. package/src/cli/commands/dev.ts +64 -20
  59. package/src/cli/commands/init.ts +12 -7
  60. package/src/cli/commands/prepare.ts +4 -3
  61. package/src/cli/commands/start.ts +18 -3
  62. package/src/cli/commands/write-project-info.ts +56 -0
  63. package/src/cli/index.ts +2 -0
  64. package/src/common/cli.ts +40 -0
  65. package/src/common/constants.ts +6 -0
  66. package/src/common/helper.ts +86 -0
  67. package/src/common/index.ts +3 -0
  68. package/src/core/apibara.ts +7 -2
  69. package/src/core/build/build.ts +13 -5
  70. package/src/core/build/dev.ts +46 -23
  71. package/src/core/build/error.ts +9 -14
  72. package/src/core/build/prepare.ts +5 -3
  73. package/src/core/build/prod.ts +25 -16
  74. package/src/core/build/types.ts +11 -1
  75. package/src/core/config/defaults.ts +3 -0
  76. package/src/core/config/loader.ts +15 -7
  77. package/src/core/config/resolvers/runtime.resolver.ts +44 -0
  78. package/src/core/config/update.ts +6 -2
  79. package/src/core/scan.ts +1 -1
  80. package/src/create/add.ts +14 -20
  81. package/src/create/constants.ts +5 -7
  82. package/src/create/init.ts +8 -5
  83. package/src/create/templates.ts +144 -116
  84. package/src/create/types.ts +3 -0
  85. package/src/create/utils.ts +20 -7
  86. package/src/hooks/useRuntimeConfig.ts +4 -1
  87. package/src/indexer/index.ts +1 -0
  88. package/src/indexer/plugins.ts +1 -0
  89. package/src/indexer/testing.ts +1 -0
  90. package/src/indexer/vcr.ts +1 -0
  91. package/src/rolldown/config.ts +86 -0
  92. package/src/rolldown/index.ts +2 -0
  93. package/src/{rollup → rolldown}/plugins/indexers.ts +3 -3
  94. package/src/rolldown/plugins/instrumentation.ts +68 -0
  95. package/src/rolldown/plugins/static-config.ts +21 -0
  96. package/src/runtime/dev.ts +49 -19
  97. package/src/runtime/internal/app.ts +42 -29
  98. package/src/runtime/project-info.ts +90 -0
  99. package/src/runtime/start.ts +91 -11
  100. package/src/types/config.ts +27 -13
  101. package/src/types/hooks.ts +8 -5
  102. package/src/types/index.ts +1 -1
  103. package/src/types/rolldown.ts +5 -0
  104. package/src/types/virtual/indexers.d.ts +4 -1
  105. package/src/types/virtual/instrumentation.d.ts +4 -0
  106. package/src/types/virtual/static-config.d.ts +4 -0
  107. package/dist/rollup/index.d.mts +0 -6
  108. package/dist/rollup/index.d.ts +0 -6
  109. package/dist/rollup/index.mjs +0 -150
  110. package/dist/shared/apibara.1b515d04.mjs +0 -8
  111. package/src/cli/common.ts +0 -8
  112. package/src/core/config/resolvers/preset.resolver.ts +0 -9
  113. package/src/core/config/resolvers/runtime-config.resolver.ts +0 -6
  114. package/src/rollup/config.ts +0 -87
  115. package/src/rollup/index.ts +0 -2
  116. package/src/rollup/plugins/config.ts +0 -12
  117. package/src/rollup/plugins/esm-shim.ts +0 -69
  118. package/src/types/rollup.ts +0 -8
  119. package/src/types/virtual/config.d.ts +0 -3
@@ -1,29 +1,24 @@
1
- import type esbuild from "esbuild";
2
1
  import { isAbsolute, relative } from "pathe";
3
- import type rollup from "rollup";
2
+ import type * as rolldown from "rolldown";
4
3
 
5
- export function formatRollupError(
6
- _error: rollup.RollupError | esbuild.OnResolveResult,
7
- ) {
4
+ export function formatRolldownError(_error: rolldown.RollupError) {
8
5
  try {
9
6
  const logs: string[] = [_error.toString()];
10
7
  // biome-ignore lint/suspicious/noExplicitAny: <explanation>
11
- const errors = (_error as any)?.errors || [_error as rollup.RollupError];
8
+ const errors = (_error as any)?.errors || [_error as rolldown.RollupError];
12
9
  for (const error of errors) {
13
- const id = error.path || error.id || (_error as rollup.RollupError).id;
10
+ const id = error.path || error.id || (_error as rolldown.RollupError).id;
14
11
  let path = isAbsolute(id) ? relative(process.cwd(), id) : id;
15
- const location =
16
- (error as rollup.RollupError).loc ||
17
- (error as esbuild.PartialMessage).location;
12
+ const location = (error as rolldown.RollupError).loc;
18
13
  if (location) {
19
14
  path += `:${location.line}:${location.column}`;
20
15
  }
21
- const text =
22
- (error as esbuild.PartialMessage).text ||
23
- (error as rollup.RollupError).frame;
16
+ const text = (error as rolldown.RollupError).frame;
24
17
 
25
18
  logs.push(
26
- `Rollup error while processing \`${path}\`` + text ? "\n\n" + text : "",
19
+ `Rolldown error while processing \`${path}\`` + text
20
+ ? "\n\n" + text
21
+ : "",
27
22
  );
28
23
  }
29
24
  return logs.join("\n");
@@ -7,9 +7,11 @@ export async function prepare(apibara: Apibara) {
7
7
  await prepareDir(apibara.options.buildDir);
8
8
  await prepareDir(apibara.options.outputDir);
9
9
 
10
- apibara.logger.success(
11
- `Output directory ${prettyPath(apibara.options.outputDir)} cleaned`,
12
- );
10
+ if (!apibara.options.disableLogs) {
11
+ apibara.logger.success(
12
+ `Output directory ${prettyPath(apibara.options.outputDir)} cleaned`,
13
+ );
14
+ }
13
15
  }
14
16
 
15
17
  async function prepareDir(dir: string) {
@@ -1,34 +1,43 @@
1
- import type { Apibara, RollupConfig } from "apibara/types";
1
+ import type { Apibara } from "apibara/types";
2
2
  import { colors } from "consola/utils";
3
- import { type OutputOptions, rollup } from "rollup";
3
+ import * as rolldown from "rolldown";
4
4
 
5
5
  export async function buildProduction(
6
6
  apibara: Apibara,
7
- rollupConfig: RollupConfig,
7
+ rolldownConfig: rolldown.RolldownOptions,
8
8
  ) {
9
- apibara.logger.start(
10
- `Building ${colors.cyan(apibara.indexers.length)} indexers`,
11
- );
9
+ if (!apibara.options.disableLogs) {
10
+ apibara.logger.start(
11
+ `Building ${colors.cyan(apibara.indexers.length)} indexers`,
12
+ );
13
+ }
14
+
15
+ const startTime = Date.now();
12
16
 
13
17
  try {
14
- const bundle = await rollup(rollupConfig);
18
+ const bundle = await rolldown.rolldown(rolldownConfig);
15
19
 
16
- if (Array.isArray(rollupConfig.output)) {
17
- for (const outputOptions of rollupConfig.output) {
20
+ if (Array.isArray(rolldownConfig.output)) {
21
+ for (const outputOptions of rolldownConfig.output) {
18
22
  await bundle.write(outputOptions);
19
23
  }
20
- } else if (rollupConfig.output) {
21
- await bundle.write(rollupConfig.output as OutputOptions);
24
+ } else if (rolldownConfig.output) {
25
+ await bundle.write(rolldownConfig.output as rolldown.OutputOptions);
22
26
  } else {
23
- throw new Error("No output options specified in Rollup config");
27
+ throw new Error("No output options specified in Rolldown config");
24
28
  }
25
29
 
26
30
  await bundle.close();
27
31
 
28
- apibara.logger.success("Build succeeded!");
29
- apibara.logger.info(
30
- `You can start the indexers with ${colors.cyan("apibara start")}`,
31
- );
32
+ const endTime = Date.now();
33
+ const duration = endTime - startTime;
34
+
35
+ if (!apibara.options.disableLogs) {
36
+ apibara.logger.success(`Build succeeded in ${duration}ms`);
37
+ apibara.logger.info(
38
+ `You can start the indexers with ${colors.cyan("apibara start")}`,
39
+ );
40
+ }
32
41
  } catch (error) {
33
42
  apibara.logger.error("Build failed", error);
34
43
  throw error;
@@ -5,6 +5,14 @@ import { type JSValue, generateTypes, resolveSchema } from "untyped";
5
5
  import { prettyPath } from "../path";
6
6
 
7
7
  export async function writeTypes(apibara: Apibara) {
8
+ // Check if the config file has a TypeScript extension so we assume it's a TypeScript project
9
+ const isTypeScript = apibara.options._c12.configFile?.endsWith(".ts");
10
+
11
+ if (!isTypeScript) {
12
+ // If it's not a TypeScript project, we don't need to generate the types
13
+ return;
14
+ }
15
+
8
16
  const typesDir = resolve(apibara.options.buildDir, "types");
9
17
 
10
18
  const config = [
@@ -47,5 +55,7 @@ declare module "apibara/types" {`,
47
55
  }),
48
56
  );
49
57
 
50
- apibara.logger.success(`Types written to ${prettyPath(typesDir)}`);
58
+ if (!apibara.options.disableLogs) {
59
+ apibara.logger.success(`Types written to ${prettyPath(typesDir)}`);
60
+ }
51
61
  }
@@ -14,4 +14,7 @@ export const ApibaraDefaults: ApibaraConfig = {
14
14
  generateRuntimeConfigTypes: true,
15
15
  internalPaths: false,
16
16
  },
17
+
18
+ node: true,
19
+ exportConditions: ["node"],
17
20
  };
@@ -7,14 +7,10 @@ import { loadConfig, watchConfig } from "c12";
7
7
  import { klona } from "klona/full";
8
8
  import { ApibaraDefaults } from "./defaults";
9
9
  import { resolvePathOptions } from "./resolvers/paths.resolver";
10
- import { presetResolver } from "./resolvers/preset.resolver";
11
- import { resolveRuntimeConfigOptions } from "./resolvers/runtime-config.resolver";
10
+ import { runtimeConfigResolver } from "./resolvers/runtime.resolver";
12
11
 
13
- const configResolvers = [
14
- resolvePathOptions,
15
- resolveRuntimeConfigOptions,
16
- presetResolver,
17
- ] as const;
12
+ // runtimeConfigResolver handles assigning runtime values to env
13
+ const configResolvers = [resolvePathOptions, runtimeConfigResolver] as const;
18
14
 
19
15
  export async function loadOptions(
20
16
  configOverrides: ApibaraConfig = {},
@@ -22,9 +18,21 @@ export async function loadOptions(
22
18
  dev = false,
23
19
  ): Promise<ApibaraOptions> {
24
20
  const options = await _loadUserConfig(configOverrides, opts, dev);
21
+
22
+ // Check if the runtimeConfig is serializable
23
+ try {
24
+ JSON.stringify(options.runtimeConfig);
25
+ } catch (error) {
26
+ throw new Error(
27
+ "Non-serializable runtimeConfig. Please ensure the config is serializable.",
28
+ { cause: error },
29
+ );
30
+ }
31
+
25
32
  for (const resolver of configResolvers) {
26
33
  await resolver(options);
27
34
  }
35
+
28
36
  return options;
29
37
  }
30
38
 
@@ -0,0 +1,44 @@
1
+ import {
2
+ ENV_INTERNAL_APIBARA_PRESET,
3
+ ENV_INTERNAL_APIBARA_PRESETS,
4
+ ENV_INTERNAL_APIBARA_PROCESSED_RUNTIME,
5
+ ENV_INTERNAL_APIBARA_RUNTIME,
6
+ USER_ENV_APIBARA_RUNTIME_CONFIG,
7
+ getProcessedRuntimeConfig,
8
+ } from "apibara/common";
9
+ import type { ApibaraOptions } from "apibara/types";
10
+
11
+ export function runtimeConfigResolver(options: Partial<ApibaraOptions>) {
12
+ try {
13
+ const { runtimeConfig, preset, presets } = options;
14
+
15
+ if (runtimeConfig) {
16
+ process.env[ENV_INTERNAL_APIBARA_RUNTIME] = JSON.stringify(runtimeConfig);
17
+ }
18
+ if (preset) {
19
+ process.env[ENV_INTERNAL_APIBARA_PRESET] = preset;
20
+ }
21
+
22
+ if (presets) {
23
+ process.env[ENV_INTERNAL_APIBARA_PRESETS] = JSON.stringify(presets);
24
+ }
25
+
26
+ const userEnvRuntimeConfig = JSON.parse(
27
+ process.env[USER_ENV_APIBARA_RUNTIME_CONFIG] ?? "{}",
28
+ );
29
+
30
+ // This is final processed runtime config that will be used by the indexer and useRuntimeConfig hook
31
+ process.env[ENV_INTERNAL_APIBARA_PROCESSED_RUNTIME] = JSON.stringify(
32
+ getProcessedRuntimeConfig({
33
+ preset,
34
+ presets,
35
+ runtimeConfig,
36
+ userEnvRuntimeConfig,
37
+ }),
38
+ );
39
+ } catch (error) {
40
+ throw new Error("Failed to process & set runtime environment variables", {
41
+ cause: error,
42
+ });
43
+ }
44
+ }
@@ -1,9 +1,13 @@
1
1
  import type { Apibara, ApibaraDynamicConfig } from "apibara/types";
2
+ import { runtimeConfigResolver } from "./resolvers/runtime.resolver";
2
3
 
3
4
  export async function updateApibaraConfig(
4
5
  apibara: Apibara,
5
- _config: ApibaraDynamicConfig,
6
+ newConfig: ApibaraDynamicConfig,
6
7
  ) {
7
- await apibara.hooks.callHook("rollup:reload");
8
+ // applies new config values to env again during hot reload
9
+ runtimeConfigResolver(newConfig);
8
10
  apibara.logger.success("Apibara config hot reloaded!");
11
+ // we simply stop indexers and restart them with updated runtime values
12
+ await apibara.hooks.callHook("dev:reload");
9
13
  }
package/src/core/scan.ts CHANGED
@@ -2,7 +2,7 @@ import type { Apibara } from "apibara/types";
2
2
  import fse from "fs-extra";
3
3
  import { basename, join } from "pathe";
4
4
 
5
- const INDEXER_EXTENSIONS = [".indexer.ts", ".indexer.js"];
5
+ const INDEXER_EXTENSIONS = [".indexer.ts", ".indexer.js", ".indexer.mjs"];
6
6
 
7
7
  export async function scanIndexers(apibara: Apibara) {
8
8
  apibara.logger.debug("Scanning indexers");
package/src/create/add.ts CHANGED
@@ -37,6 +37,7 @@ type Options = {
37
37
  argNetwork?: string;
38
38
  argStorage?: string;
39
39
  argDnaUrl?: string;
40
+ argRootDir?: string;
40
41
  };
41
42
 
42
43
  export async function addIndexer({
@@ -45,8 +46,10 @@ export async function addIndexer({
45
46
  argNetwork,
46
47
  argStorage,
47
48
  argDnaUrl,
49
+ argRootDir,
48
50
  }: Options) {
49
- const configExists = hasApibaraConfig(process.cwd());
51
+ const cwd = path.join(process.cwd(), argRootDir ?? ".");
52
+ const configExists = hasApibaraConfig(cwd);
50
53
 
51
54
  if (!configExists) {
52
55
  consola.error("No apibara.config found in the current directory.");
@@ -74,7 +77,7 @@ export async function addIndexer({
74
77
  }
75
78
  }
76
79
 
77
- const language = getApibaraConfigLanguage(process.cwd());
80
+ const { language, extension } = getApibaraConfigLanguage(cwd);
78
81
 
79
82
  validateIndexerId(argIndexerId, true);
80
83
  validateChain(argChain, true);
@@ -92,14 +95,10 @@ export async function addIndexer({
92
95
  validate: (id) =>
93
96
  validateIndexerId(id)
94
97
  ? checkFileExists(
95
- path.join(
96
- process.cwd(),
97
- "indexers",
98
- `${id}.indexer.${language === "typescript" ? "ts" : "js"}`,
99
- ),
98
+ path.join(cwd, "indexers", `${id}.indexer.${extension}`),
100
99
  ).then(({ exists }) =>
101
100
  exists
102
- ? `Indexer ${cyan(`${id}.indexer.${language === "typescript" ? "ts" : "js"}`)} already exists`
101
+ ? `Indexer ${cyan(`${id}.indexer.${extension}`)} already exists`
103
102
  : true,
104
103
  )
105
104
  : "Invalid indexer ID, it cannot be empty and must be in kebab-case format",
@@ -197,7 +196,7 @@ export async function addIndexer({
197
196
  const pkgManager = getPackageManager();
198
197
 
199
198
  const options: IndexerOptions = {
200
- cwd: process.cwd(),
199
+ cwd: cwd,
201
200
  indexerFileId,
202
201
  indexerId: convertKebabToCamelCase(indexerFileId),
203
202
  chain: (argChain as Chain) ?? prompt_chain?.name!,
@@ -206,13 +205,12 @@ export async function addIndexer({
206
205
  dnaUrl: argDnaUrl ?? prompt_dnaUrl,
207
206
  language,
208
207
  packageManager: pkgManager.name,
208
+ extension,
209
209
  };
210
210
 
211
211
  await updateApibaraConfigFile(options);
212
212
 
213
- consola.success(
214
- `Updated ${cyan("apibara.config." + (language === "typescript" ? "ts" : "js"))}`,
215
- );
213
+ consola.success(`Updated ${cyan(`apibara.config.${extension}`)}`);
216
214
 
217
215
  await updatePackageJson(options);
218
216
 
@@ -220,19 +218,15 @@ export async function addIndexer({
220
218
 
221
219
  await createIndexerFile(options);
222
220
 
223
- consola.success(
224
- `Created ${cyan(`${indexerFileId}.indexer.${language === "typescript" ? "ts" : "js"}`)}`,
225
- );
221
+ consola.success(`Created ${cyan(`${indexerFileId}.indexer.${extension}`)}`);
226
222
 
227
223
  await createStorageRelatedFiles(options);
228
224
 
229
225
  console.log();
230
226
 
227
+ const baseCommand = `${options.packageManager} install`;
228
+ const tsCommand = `${baseCommand} && ${options.packageManager} run prepare`;
231
229
  consola.info(
232
- `Before running the indexer, run ${cyan(`${options.packageManager} run install`)}${
233
- language === "typescript"
234
- ? " & " + cyan(`${options.packageManager} run prepare`)
235
- : ""
236
- }`,
230
+ `Before running the indexer, run ${cyan(language === "typescript" ? tsCommand : baseCommand)}`,
237
231
  );
238
232
  }
@@ -67,7 +67,6 @@ export const storages: StorageDataType[] = [
67
67
  export const packageVersions = {
68
68
  // Required Dependencies
69
69
  apibara: "next",
70
- "@apibara/indexer": "next",
71
70
  "@apibara/protocol": "next",
72
71
  // Chain Dependencies
73
72
  "@apibara/evm": "next",
@@ -79,20 +78,19 @@ export const packageVersions = {
79
78
  "@apibara/plugin-sqlite": "next",
80
79
  // Postgres Dependencies
81
80
  "@electric-sql/pglite": "^0.2.17",
82
- "drizzle-orm": "^0.37.0",
81
+ "drizzle-orm": "^0.40.1",
83
82
  pg: "^8.13.1",
84
83
  "@types/pg": "^8.11.10",
85
84
  "drizzle-kit": "^0.29.0",
86
85
  // Typescript Dependencies
87
86
  typescript: "^5.6.2",
88
- "@rollup/plugin-typescript": "^11.1.6",
89
87
  "@types/node": "^20.5.2",
90
88
  };
91
89
 
92
90
  export const dnaUrls = {
93
- ethereum: "https://ethereum.preview.apibara.org",
94
- ethereumSepolia: "https://ethereum-sepolia.preview.apibara.org",
91
+ ethereum: "https://mainnet.ethereum.a5a.ch",
92
+ ethereumSepolia: "https://sepolia.ethereum.a5a.ch",
95
93
  beaconchain: "https://beaconchain.preview.apibara.org",
96
- starknet: "https://starknet.preview.apibara.org",
97
- starknetSepolia: "https://starknet-sepolia.preview.apibara.org",
94
+ starknet: "https://mainnet.starknet.a5a.ch",
95
+ starknetSepolia: "https://sepolia.starknet.a5a.ch",
98
96
  };
@@ -5,6 +5,7 @@ import prompts from "prompts";
5
5
  import { addIndexer } from "./add";
6
6
  import { cyan, green } from "./colors";
7
7
  import {
8
+ createGitIgnoreFile,
8
9
  generateApibaraConfig,
9
10
  generatePackageJson,
10
11
  generateTsConfig,
@@ -129,7 +130,7 @@ export async function initializeProject({
129
130
  JSON.stringify(packageJson, null, 2) + "\n",
130
131
  );
131
132
  await formatFile(packageJsonPath);
132
- consola.success("Created ", cyan("package.json"));
133
+ consola.success("Created", cyan("package.json"));
133
134
 
134
135
  // Generate tsconfig.json if TypeScript
135
136
  if (isTs) {
@@ -137,7 +138,7 @@ export async function initializeProject({
137
138
  const tsConfig = generateTsConfig();
138
139
  fs.writeFileSync(tsConfigPath, JSON.stringify(tsConfig, null, 2) + "\n");
139
140
  await formatFile(tsConfigPath);
140
- consola.success("Created ", cyan("tsconfig.json"));
141
+ consola.success("Created", cyan("tsconfig.json"));
141
142
  }
142
143
 
143
144
  const apibaraConfigPath = path.join(root, `apibara.config.${configExt}`);
@@ -145,7 +146,7 @@ export async function initializeProject({
145
146
  const apibaraConfig = generateApibaraConfig(isTs);
146
147
  fs.writeFileSync(apibaraConfigPath, apibaraConfig);
147
148
  await formatFile(apibaraConfigPath);
148
- consola.success("Created ", cyan(`apibara.config.${configExt}`));
149
+ consola.success("Created", cyan(`apibara.config.${configExt}`));
149
150
 
150
151
  // Create "indexers" directory if not exists
151
152
  const indexersDir = path.join(root, "indexers");
@@ -154,6 +155,8 @@ export async function initializeProject({
154
155
  consola.success(`Created ${cyan("indexers")} directory`);
155
156
  }
156
157
 
158
+ await createGitIgnoreFile(root);
159
+
157
160
  console.log("\n");
158
161
 
159
162
  consola.ready(green("Project initialized successfully"));
@@ -163,12 +166,12 @@ export async function initializeProject({
163
166
  if (!argNoCreateIndexer) {
164
167
  consola.info("Let's create an indexer\n");
165
168
 
166
- await addIndexer({});
169
+ await addIndexer({ argRootDir: argTargetDir });
167
170
  } else {
168
171
  const pkgManager = getPackageManager();
169
172
  consola.info(
170
173
  "Run ",
171
- green(`${pkgManager.name} run install`),
174
+ green(`${pkgManager.name} install`),
172
175
  " to install all dependencies",
173
176
  );
174
177
  }