apibara 2.1.0-beta.1 → 2.1.0-beta.10

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 (51) hide show
  1. package/dist/chunks/add.mjs +12 -7
  2. package/dist/chunks/dev.mjs +23 -5
  3. package/dist/chunks/init.mjs +3 -7
  4. package/dist/core/index.mjs +69 -40
  5. package/dist/create/index.d.mts +2 -1
  6. package/dist/create/index.d.ts +2 -1
  7. package/dist/create/index.mjs +185 -121
  8. package/dist/rolldown/index.d.mts +7 -0
  9. package/dist/rolldown/index.d.ts +7 -0
  10. package/dist/rolldown/index.mjs +90 -0
  11. package/dist/runtime/dev.mjs +3 -0
  12. package/dist/runtime/internal/app.d.ts +1 -1
  13. package/dist/runtime/internal/app.mjs +11 -3
  14. package/dist/runtime/start.mjs +5 -0
  15. package/dist/types/index.d.mts +18 -15
  16. package/dist/types/index.d.ts +18 -15
  17. package/package.json +12 -15
  18. package/src/cli/commands/add.ts +12 -6
  19. package/src/cli/commands/dev.ts +26 -5
  20. package/src/cli/commands/init.ts +3 -7
  21. package/src/core/build/build.ts +13 -5
  22. package/src/core/build/dev.ts +44 -23
  23. package/src/core/build/error.ts +9 -14
  24. package/src/core/build/prod.ts +15 -10
  25. package/src/core/build/types.ts +8 -0
  26. package/src/core/config/defaults.ts +3 -0
  27. package/src/core/config/update.ts +1 -1
  28. package/src/create/add.ts +26 -12
  29. package/src/create/constants.ts +9 -10
  30. package/src/create/init.ts +28 -14
  31. package/src/create/templates.ts +154 -118
  32. package/src/create/utils.ts +10 -0
  33. package/src/rolldown/config.ts +83 -0
  34. package/src/rolldown/index.ts +2 -0
  35. package/src/{rollup → rolldown}/plugins/config.ts +2 -1
  36. package/src/{rollup → rolldown}/plugins/indexers.ts +3 -3
  37. package/src/runtime/dev.ts +3 -0
  38. package/src/runtime/internal/app.ts +13 -5
  39. package/src/runtime/start.ts +5 -0
  40. package/src/types/config.ts +12 -7
  41. package/src/types/hooks.ts +8 -5
  42. package/src/types/index.ts +1 -1
  43. package/src/types/rolldown.ts +5 -0
  44. package/src/types/virtual/indexers.d.ts +4 -1
  45. package/dist/rollup/index.d.mts +0 -6
  46. package/dist/rollup/index.d.ts +0 -6
  47. package/dist/rollup/index.mjs +0 -150
  48. package/src/rollup/config.ts +0 -87
  49. package/src/rollup/index.ts +0 -2
  50. package/src/rollup/plugins/esm-shim.ts +0 -69
  51. package/src/types/rollup.ts +0 -8
@@ -9,34 +9,39 @@ const add = defineCommand({
9
9
  args: {
10
10
  indexerId: {
11
11
  type: "positional",
12
- description: "Indexer ID",
12
+ description: "Indexer ID - must be in kebab-case",
13
13
  required: false
14
14
  },
15
15
  chain: {
16
16
  type: "string",
17
- description: "Chain"
17
+ description: "Blockchain - ethereum, beaconchain, starknet"
18
18
  },
19
19
  network: {
20
20
  type: "string",
21
- description: "Network"
21
+ description: "Network - mainnet, sepolia, other"
22
22
  },
23
23
  storage: {
24
24
  type: "string",
25
- description: "Storage"
25
+ description: "Storage - postgres, none"
26
26
  },
27
27
  dnaUrl: {
28
28
  type: "string",
29
- description: "DNA URL"
29
+ description: "DNA URL - https://custom-dna-url.apibara.org"
30
+ },
31
+ dir: {
32
+ type: "string",
33
+ description: "Root directory - apibara project root where apibara.config is located | default: current working directory"
30
34
  }
31
35
  },
32
36
  async run({ args }) {
33
- const { indexerId, chain, network, storage, dnaUrl } = args;
37
+ const { indexerId, chain, network, storage, dnaUrl, dir } = args;
34
38
  await addIndexer({
35
39
  argIndexerId: indexerId,
36
40
  argChain: chain,
37
41
  argNetwork: network,
38
42
  argStorage: storage,
39
- argDnaUrl: dnaUrl
43
+ argDnaUrl: dnaUrl,
44
+ argRootDir: dir
40
45
  });
41
46
  }
42
47
  });
@@ -21,10 +21,18 @@ const dev = defineCommand({
21
21
  preset: {
22
22
  type: "string",
23
23
  description: "Preset to use"
24
+ },
25
+ alwaysReindex: {
26
+ type: "boolean",
27
+ default: false,
28
+ description: "Reindex the indexers from the starting block on every restart (default: false)"
24
29
  }
25
30
  },
26
31
  async run({ args }) {
27
32
  const rootDir = resolve(args.dir || args._dir || ".");
33
+ if (args.alwaysReindex) {
34
+ process.env.APIBARA_ALWAYS_REINDEX = "true";
35
+ }
28
36
  let apibara;
29
37
  let childProcess;
30
38
  const reload = async () => {
@@ -62,18 +70,20 @@ const dev = defineCommand({
62
70
  await prepare(apibara);
63
71
  await writeTypes(apibara);
64
72
  await build(apibara);
65
- apibara.hooks.hook("dev:restart", () => {
73
+ apibara.hooks.hook("dev:restart", async () => {
66
74
  if (childProcess) {
67
75
  apibara.logger.info("Change detected, stopping indexers to restart");
68
- childProcess.kill();
76
+ await killProcess(childProcess);
69
77
  childProcess = void 0;
70
78
  }
71
79
  });
72
- apibara.hooks.hook("dev:reload", () => {
80
+ apibara.hooks.hook("dev:reload", async () => {
73
81
  if (childProcess) {
74
- childProcess.kill();
82
+ apibara.logger.info("Restarting indexers");
83
+ await killProcess(childProcess);
84
+ childProcess = void 0;
75
85
  } else {
76
- apibara.logger.success("Restarting indexers");
86
+ apibara.logger.info("Starting indexers");
77
87
  }
78
88
  const childArgs = [
79
89
  resolve(apibara.options.outputDir || "./.apibara/build", "dev.mjs"),
@@ -96,5 +106,13 @@ const dev = defineCommand({
96
106
  await reload();
97
107
  }
98
108
  });
109
+ async function killProcess(childProcess) {
110
+ if (childProcess) {
111
+ await new Promise((resolve2) => {
112
+ childProcess.once("exit", resolve2);
113
+ childProcess.kill();
114
+ });
115
+ }
116
+ }
99
117
 
100
118
  export { dev as default };
@@ -18,22 +18,18 @@ const init = defineCommand({
18
18
  default: "ts",
19
19
  alias: "l"
20
20
  },
21
- "no-create-indexer": {
21
+ noIndexer: {
22
22
  type: "boolean",
23
23
  description: "Do not create an indexer after initialization",
24
24
  default: false
25
25
  }
26
26
  },
27
27
  async run({ args }) {
28
- const {
29
- dir: targetDir,
30
- "no-create-indexer": noCreateIndexer,
31
- language
32
- } = args;
28
+ const { dir: targetDir, noIndexer, language } = args;
33
29
  await initializeProject({
34
30
  argTargetDir: targetDir,
35
31
  argLanguage: language,
36
- argNoCreateIndexer: noCreateIndexer
32
+ argNoCreateIndexer: noIndexer
37
33
  });
38
34
  }
39
35
  });
@@ -5,12 +5,11 @@ import { klona } from 'klona/full';
5
5
  import { resolve, join, basename, isAbsolute, relative, dirname } from 'pathe';
6
6
  import defu from 'defu';
7
7
  import fse from 'fs-extra';
8
- import { getRollupConfig } from 'apibara/rollup';
8
+ import { getRolldownConfig } from 'apibara/rolldown';
9
+ import { colors } from 'consola/utils';
9
10
  import { watch } from 'chokidar';
10
11
  import { debounce } from 'perfect-debounce';
11
- import * as rollup from 'rollup';
12
- import { rollup as rollup$1 } from 'rollup';
13
- import { colors } from 'consola/utils';
12
+ import * as rolldown from 'rolldown';
14
13
  import fsp from 'node:fs/promises';
15
14
  import { generateTypes, resolveSchema } from 'untyped';
16
15
 
@@ -24,7 +23,9 @@ const ApibaraDefaults = {
24
23
  strict: false,
25
24
  generateRuntimeConfigTypes: true,
26
25
  internalPaths: false
27
- }
26
+ },
27
+ node: true,
28
+ exportConditions: ["node"]
28
29
  };
29
30
 
30
31
  async function resolvePathOptions(options) {
@@ -83,7 +84,7 @@ async function _loadUserConfig(configOverrides = {}, opts = {}, dev = false) {
83
84
  }
84
85
 
85
86
  async function updateApibaraConfig(apibara, _config) {
86
- await apibara.hooks.callHook("rollup:reload");
87
+ await apibara.hooks.callHook("rolldown:reload");
87
88
  apibara.logger.success("Apibara config hot reloaded!");
88
89
  }
89
90
 
@@ -134,20 +135,20 @@ async function createApibara(config = {}, opts = {}, dev = false) {
134
135
  return apibara;
135
136
  }
136
137
 
137
- function formatRollupError(_error) {
138
+ function formatRolldownError(_error) {
138
139
  try {
139
140
  const logs = [_error.toString()];
140
141
  const errors = _error?.errors || [_error];
141
142
  for (const error of errors) {
142
143
  const id = error.path || error.id || _error.id;
143
144
  let path = isAbsolute(id) ? relative(process.cwd(), id) : id;
144
- const location = error.loc || error.location;
145
+ const location = error.loc;
145
146
  if (location) {
146
147
  path += `:${location.line}:${location.column}`;
147
148
  }
148
- const text = error.text || error.frame;
149
+ const text = error.frame;
149
150
  logs.push(
150
- `Rollup error while processing \`${path}\`` + text ? "\n\n" + text : ""
151
+ `Rolldown error while processing \`${path}\`` + text ? "\n\n" + text : ""
151
152
  );
152
153
  }
153
154
  return logs.join("\n");
@@ -156,45 +157,48 @@ function formatRollupError(_error) {
156
157
  }
157
158
  }
158
159
 
159
- async function watchDev(apibara, rollupConfig) {
160
- let rollupWatcher;
160
+ async function watchDev(apibara, rolldownConfig) {
161
+ let rolldownWatcher;
161
162
  async function load() {
162
- if (rollupWatcher) {
163
- await rollupWatcher.close();
163
+ apibara.logger.start("Setting up a dev server");
164
+ if (rolldownWatcher) {
165
+ await rolldownWatcher.close();
164
166
  }
165
- rollupWatcher = startRollupWatcher(apibara, rollupConfig);
167
+ rolldownWatcher = startRolldownWatcher(apibara, rolldownConfig);
166
168
  }
167
- const reload = debounce(load);
168
- const watchPatterns = [join(apibara.options.rootDir, "indexers")];
169
+ const reload = debounce(async () => await load());
170
+ const watchPatterns = getWatchPatterns(apibara);
169
171
  const watchReloadEvents = /* @__PURE__ */ new Set(["add", "addDir", "unlink", "unlinkDir"]);
170
172
  const reloadWatcher = watch(watchPatterns, { ignoreInitial: true }).on(
171
173
  "all",
172
- (event) => {
174
+ async (event) => {
173
175
  if (watchReloadEvents.has(event)) {
174
- reload();
176
+ await reload();
175
177
  }
176
178
  }
177
179
  );
178
180
  apibara.hooks.hook("close", () => {
179
- rollupWatcher.close();
181
+ rolldownWatcher.close();
180
182
  reloadWatcher.close();
181
183
  });
182
- apibara.hooks.hook("rollup:reload", () => reload());
184
+ apibara.hooks.hook("rolldown:reload", async () => await reload());
183
185
  await load();
184
186
  }
185
- function startRollupWatcher(apibara, rollupConfig) {
186
- const watcher = rollup.watch(
187
- defu(rollupConfig, {
187
+ function startRolldownWatcher(apibara, rolldownConfig) {
188
+ const ignorePatterns = getIgnorePatterns();
189
+ const watcher = rolldown.watch(
190
+ defu(rolldownConfig, {
188
191
  watch: {
189
- chokidar: apibara.options.watchOptions
192
+ exclude: ignorePatterns,
193
+ ...apibara.options.watchOptions ?? {}
190
194
  }
191
195
  })
192
196
  );
193
197
  let start;
194
- watcher.on("event", (event) => {
198
+ watcher.on("event", async (event) => {
195
199
  switch (event.code) {
196
200
  case "START": {
197
- apibara.hooks.callHook("dev:restart");
201
+ await apibara.hooks.callHook("dev:restart");
198
202
  return;
199
203
  }
200
204
  case "BUNDLE_START": {
@@ -207,34 +211,48 @@ function startRollupWatcher(apibara, rollupConfig) {
207
211
  "Indexers built",
208
212
  start ? `in ${Date.now() - start} ms` : ""
209
213
  );
210
- apibara.hooks.callHook("dev:reload");
214
+ await apibara.hooks.callHook("dev:reload");
211
215
  return;
212
216
  }
213
217
  case "ERROR": {
214
- apibara.logger.error(formatRollupError(event.error));
218
+ apibara.logger.error(formatRolldownError(event.error));
215
219
  }
216
220
  }
217
221
  });
218
222
  return watcher;
219
223
  }
224
+ const getWatchPatterns = (apibara) => [
225
+ join(apibara.options.rootDir, "indexers")
226
+ ];
227
+ const getIgnorePatterns = (apibara) => [
228
+ "**/.apibara/**",
229
+ "**/.git/**",
230
+ "**/.DS_Store",
231
+ "**/node_modules/**",
232
+ "**/dist/**",
233
+ "**/.turbo/**"
234
+ ];
220
235
 
221
- async function buildProduction(apibara, rollupConfig) {
236
+ async function buildProduction(apibara, rolldownConfig) {
222
237
  apibara.logger.start(
223
238
  `Building ${colors.cyan(apibara.indexers.length)} indexers`
224
239
  );
240
+ const startTime = Date.now();
225
241
  try {
226
- const bundle = await rollup$1(rollupConfig);
227
- if (Array.isArray(rollupConfig.output)) {
228
- for (const outputOptions of rollupConfig.output) {
242
+ const bundle = await rolldown.rolldown(rolldownConfig);
243
+ if (Array.isArray(rolldownConfig.output)) {
244
+ for (const outputOptions of rolldownConfig.output) {
229
245
  await bundle.write(outputOptions);
230
246
  }
231
- } else if (rollupConfig.output) {
232
- await bundle.write(rollupConfig.output);
247
+ } else if (rolldownConfig.output) {
248
+ await bundle.write(rolldownConfig.output);
233
249
  } else {
234
- throw new Error("No output options specified in Rollup config");
250
+ throw new Error("No output options specified in Rolldown config");
235
251
  }
236
252
  await bundle.close();
237
- apibara.logger.success("Build succeeded!");
253
+ const endTime = Date.now();
254
+ const duration = endTime - startTime;
255
+ apibara.logger.success(`Build succeeded in ${duration}ms`);
238
256
  apibara.logger.info(
239
257
  `You can start the indexers with ${colors.cyan("apibara start")}`
240
258
  );
@@ -245,9 +263,16 @@ async function buildProduction(apibara, rollupConfig) {
245
263
  }
246
264
 
247
265
  async function build(apibara) {
248
- const rollupConfig = getRollupConfig(apibara);
249
- await apibara.hooks.callHook("rollup:before", apibara, rollupConfig);
250
- return apibara.options.dev ? await watchDev(apibara, rollupConfig) : await buildProduction(apibara, rollupConfig);
266
+ const rolldownConfig = getRolldownConfig(apibara);
267
+ await apibara.hooks.callHook("rolldown:before", apibara, rolldownConfig);
268
+ if (apibara.options.rollupConfig) {
269
+ apibara.logger.error(
270
+ `
271
+ ${colors.cyan("apibara.config:")} rollupConfig is deprecated. Use rolldownConfig instead`
272
+ );
273
+ process.exit(1);
274
+ }
275
+ return apibara.options.dev ? await watchDev(apibara, rolldownConfig) : await buildProduction(apibara, rolldownConfig);
251
276
  }
252
277
 
253
278
  function prettyPath(path, highlight = true) {
@@ -268,6 +293,10 @@ async function prepareDir(dir) {
268
293
  }
269
294
 
270
295
  async function writeTypes(apibara) {
296
+ const isTypeScript = apibara.options._c12.configFile?.endsWith(".ts");
297
+ if (!isTypeScript) {
298
+ return;
299
+ }
271
300
  const typesDir = resolve(apibara.options.buildDir, "types");
272
301
  const config = [
273
302
  "// Generated by apibara",
@@ -4,8 +4,9 @@ type Options$1 = {
4
4
  argNetwork?: string;
5
5
  argStorage?: string;
6
6
  argDnaUrl?: string;
7
+ argRootDir?: string;
7
8
  };
8
- declare function addIndexer({ argIndexerId, argChain, argNetwork, argStorage, argDnaUrl, }: Options$1): Promise<void>;
9
+ declare function addIndexer({ argIndexerId, argChain, argNetwork, argStorage, argDnaUrl, argRootDir, }: Options$1): Promise<void>;
9
10
 
10
11
  type Options = {
11
12
  argTargetDir: string;
@@ -4,8 +4,9 @@ type Options$1 = {
4
4
  argNetwork?: string;
5
5
  argStorage?: string;
6
6
  argDnaUrl?: string;
7
+ argRootDir?: string;
7
8
  };
8
- declare function addIndexer({ argIndexerId, argChain, argNetwork, argStorage, argDnaUrl, }: Options$1): Promise<void>;
9
+ declare function addIndexer({ argIndexerId, argChain, argNetwork, argStorage, argDnaUrl, argRootDir, }: Options$1): Promise<void>;
9
10
 
10
11
  type Options = {
11
12
  argTargetDir: string;