apibara 2.1.0-beta.1 → 2.1.0-beta.11

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 (60) hide show
  1. package/dist/chunks/add.mjs +12 -7
  2. package/dist/chunks/dev.mjs +25 -6
  3. package/dist/chunks/init.mjs +3 -7
  4. package/dist/chunks/start.mjs +2 -1
  5. package/dist/core/index.mjs +85 -42
  6. package/dist/create/index.d.mts +2 -1
  7. package/dist/create/index.d.ts +2 -1
  8. package/dist/create/index.mjs +185 -121
  9. package/dist/hooks/index.mjs +3 -1
  10. package/dist/rolldown/index.d.mts +7 -0
  11. package/dist/rolldown/index.d.ts +7 -0
  12. package/dist/rolldown/index.mjs +126 -0
  13. package/dist/runtime/dev.mjs +3 -0
  14. package/dist/runtime/internal/app.d.ts +1 -1
  15. package/dist/runtime/internal/app.mjs +12 -11
  16. package/dist/runtime/start.mjs +5 -0
  17. package/dist/shared/apibara.af330c7d.mjs +15 -0
  18. package/dist/types/index.d.mts +18 -15
  19. package/dist/types/index.d.ts +18 -15
  20. package/package.json +13 -15
  21. package/src/cli/commands/add.ts +12 -6
  22. package/src/cli/commands/dev.ts +27 -5
  23. package/src/cli/commands/init.ts +3 -7
  24. package/src/cli/commands/start.ts +1 -0
  25. package/src/core/build/build.ts +13 -5
  26. package/src/core/build/dev.ts +44 -23
  27. package/src/core/build/error.ts +9 -14
  28. package/src/core/build/prod.ts +15 -10
  29. package/src/core/build/types.ts +8 -0
  30. package/src/core/config/defaults.ts +3 -0
  31. package/src/core/config/resolvers/runtime-config.resolver.ts +21 -2
  32. package/src/core/config/update.ts +1 -1
  33. package/src/create/add.ts +26 -12
  34. package/src/create/constants.ts +9 -10
  35. package/src/create/init.ts +28 -14
  36. package/src/create/templates.ts +154 -118
  37. package/src/create/utils.ts +10 -0
  38. package/src/hooks/useRuntimeConfig.ts +2 -1
  39. package/src/rolldown/config.ts +108 -0
  40. package/src/rolldown/index.ts +2 -0
  41. package/src/rolldown/plugins/config.ts +25 -0
  42. package/src/{rollup → rolldown}/plugins/indexers.ts +3 -3
  43. package/src/runtime/dev.ts +3 -0
  44. package/src/runtime/internal/app.ts +30 -13
  45. package/src/runtime/start.ts +5 -0
  46. package/src/types/config.ts +12 -7
  47. package/src/types/hooks.ts +8 -5
  48. package/src/types/index.ts +1 -1
  49. package/src/types/rolldown.ts +5 -0
  50. package/src/types/virtual/config.d.ts +4 -1
  51. package/src/types/virtual/indexers.d.ts +4 -1
  52. package/src/utils/helper.ts +15 -0
  53. package/dist/rollup/index.d.mts +0 -6
  54. package/dist/rollup/index.d.ts +0 -6
  55. package/dist/rollup/index.mjs +0 -150
  56. package/src/rollup/config.ts +0 -87
  57. package/src/rollup/index.ts +0 -2
  58. package/src/rollup/plugins/config.ts +0 -12
  59. package/src/rollup/plugins/esm-shim.ts +0 -69
  60. 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 () => {
@@ -37,7 +45,8 @@ const dev = defineCommand({
37
45
  }
38
46
  apibara = await createApibara(
39
47
  {
40
- rootDir
48
+ rootDir,
49
+ preset: args.preset
41
50
  },
42
51
  {
43
52
  watch: true,
@@ -62,18 +71,20 @@ const dev = defineCommand({
62
71
  await prepare(apibara);
63
72
  await writeTypes(apibara);
64
73
  await build(apibara);
65
- apibara.hooks.hook("dev:restart", () => {
74
+ apibara.hooks.hook("dev:restart", async () => {
66
75
  if (childProcess) {
67
76
  apibara.logger.info("Change detected, stopping indexers to restart");
68
- childProcess.kill();
77
+ await killProcess(childProcess);
69
78
  childProcess = void 0;
70
79
  }
71
80
  });
72
- apibara.hooks.hook("dev:reload", () => {
81
+ apibara.hooks.hook("dev:reload", async () => {
73
82
  if (childProcess) {
74
- childProcess.kill();
83
+ apibara.logger.info("Restarting indexers");
84
+ await killProcess(childProcess);
85
+ childProcess = void 0;
75
86
  } else {
76
- apibara.logger.success("Restarting indexers");
87
+ apibara.logger.info("Starting indexers");
77
88
  }
78
89
  const childArgs = [
79
90
  resolve(apibara.options.outputDir || "./.apibara/build", "dev.mjs"),
@@ -96,5 +107,13 @@ const dev = defineCommand({
96
107
  await reload();
97
108
  }
98
109
  });
110
+ async function killProcess(childProcess) {
111
+ if (childProcess) {
112
+ await new Promise((resolve2) => {
113
+ childProcess.once("exit", resolve2);
114
+ childProcess.kill();
115
+ });
116
+ }
117
+ }
99
118
 
100
119
  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
  });
@@ -26,7 +26,8 @@ const start = defineCommand({
26
26
  const { indexer, preset } = args;
27
27
  const rootDir = resolve(args.dir || args._dir || ".");
28
28
  const apibara = await createApibara({
29
- rootDir
29
+ rootDir,
30
+ preset
30
31
  });
31
32
  apibara.logger.start(
32
33
  `Starting indexer ${indexer}${preset ? ` with preset ${preset}` : ""}`
@@ -4,13 +4,13 @@ import { watchConfig, loadConfig } from 'c12';
4
4
  import { klona } from 'klona/full';
5
5
  import { resolve, join, basename, isAbsolute, relative, dirname } from 'pathe';
6
6
  import defu from 'defu';
7
+ import { s as serialize } from '../shared/apibara.af330c7d.mjs';
7
8
  import fse from 'fs-extra';
8
- import { getRollupConfig } from 'apibara/rollup';
9
+ import { getRolldownConfig } from 'apibara/rolldown';
10
+ import { colors } from 'consola/utils';
9
11
  import { watch } from 'chokidar';
10
12
  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';
13
+ import * as rolldown from 'rolldown';
14
14
  import fsp from 'node:fs/promises';
15
15
  import { generateTypes, resolveSchema } from 'untyped';
16
16
 
@@ -24,7 +24,9 @@ const ApibaraDefaults = {
24
24
  strict: false,
25
25
  generateRuntimeConfigTypes: true,
26
26
  internalPaths: false
27
- }
27
+ },
28
+ node: true,
29
+ exportConditions: ["node"]
28
30
  };
29
31
 
30
32
  async function resolvePathOptions(options) {
@@ -45,8 +47,21 @@ async function presetResolver(options) {
45
47
  }
46
48
 
47
49
  async function resolveRuntimeConfigOptions(options) {
48
- options.runtimeConfig = { ...options.runtimeConfig };
49
- process.env.APIBARA_RUNTIME_CONFIG = JSON.stringify(options.runtimeConfig);
50
+ const { preset, presets } = options;
51
+ let runtimeConfig = { ...options.runtimeConfig };
52
+ if (preset) {
53
+ if (presets === void 0) {
54
+ throw new Error(
55
+ `Specified preset "${preset}" but no presets were defined`
56
+ );
57
+ }
58
+ if (presets[preset] === void 0) {
59
+ throw new Error(`Specified preset "${preset}" but it was not defined`);
60
+ }
61
+ const presetValue = presets[preset];
62
+ runtimeConfig = { ...runtimeConfig, ...presetValue.runtimeConfig };
63
+ }
64
+ process.env.APIBARA_RUNTIME_CONFIG = serialize(runtimeConfig);
50
65
  }
51
66
 
52
67
  const configResolvers = [
@@ -83,7 +98,7 @@ async function _loadUserConfig(configOverrides = {}, opts = {}, dev = false) {
83
98
  }
84
99
 
85
100
  async function updateApibaraConfig(apibara, _config) {
86
- await apibara.hooks.callHook("rollup:reload");
101
+ await apibara.hooks.callHook("rolldown:reload");
87
102
  apibara.logger.success("Apibara config hot reloaded!");
88
103
  }
89
104
 
@@ -134,20 +149,20 @@ async function createApibara(config = {}, opts = {}, dev = false) {
134
149
  return apibara;
135
150
  }
136
151
 
137
- function formatRollupError(_error) {
152
+ function formatRolldownError(_error) {
138
153
  try {
139
154
  const logs = [_error.toString()];
140
155
  const errors = _error?.errors || [_error];
141
156
  for (const error of errors) {
142
157
  const id = error.path || error.id || _error.id;
143
158
  let path = isAbsolute(id) ? relative(process.cwd(), id) : id;
144
- const location = error.loc || error.location;
159
+ const location = error.loc;
145
160
  if (location) {
146
161
  path += `:${location.line}:${location.column}`;
147
162
  }
148
- const text = error.text || error.frame;
163
+ const text = error.frame;
149
164
  logs.push(
150
- `Rollup error while processing \`${path}\`` + text ? "\n\n" + text : ""
165
+ `Rolldown error while processing \`${path}\`` + text ? "\n\n" + text : ""
151
166
  );
152
167
  }
153
168
  return logs.join("\n");
@@ -156,45 +171,48 @@ function formatRollupError(_error) {
156
171
  }
157
172
  }
158
173
 
159
- async function watchDev(apibara, rollupConfig) {
160
- let rollupWatcher;
174
+ async function watchDev(apibara, rolldownConfig) {
175
+ let rolldownWatcher;
161
176
  async function load() {
162
- if (rollupWatcher) {
163
- await rollupWatcher.close();
177
+ apibara.logger.start("Setting up a dev server");
178
+ if (rolldownWatcher) {
179
+ await rolldownWatcher.close();
164
180
  }
165
- rollupWatcher = startRollupWatcher(apibara, rollupConfig);
181
+ rolldownWatcher = startRolldownWatcher(apibara, rolldownConfig);
166
182
  }
167
- const reload = debounce(load);
168
- const watchPatterns = [join(apibara.options.rootDir, "indexers")];
183
+ const reload = debounce(async () => await load());
184
+ const watchPatterns = getWatchPatterns(apibara);
169
185
  const watchReloadEvents = /* @__PURE__ */ new Set(["add", "addDir", "unlink", "unlinkDir"]);
170
186
  const reloadWatcher = watch(watchPatterns, { ignoreInitial: true }).on(
171
187
  "all",
172
- (event) => {
188
+ async (event) => {
173
189
  if (watchReloadEvents.has(event)) {
174
- reload();
190
+ await reload();
175
191
  }
176
192
  }
177
193
  );
178
194
  apibara.hooks.hook("close", () => {
179
- rollupWatcher.close();
195
+ rolldownWatcher.close();
180
196
  reloadWatcher.close();
181
197
  });
182
- apibara.hooks.hook("rollup:reload", () => reload());
198
+ apibara.hooks.hook("rolldown:reload", async () => await reload());
183
199
  await load();
184
200
  }
185
- function startRollupWatcher(apibara, rollupConfig) {
186
- const watcher = rollup.watch(
187
- defu(rollupConfig, {
201
+ function startRolldownWatcher(apibara, rolldownConfig) {
202
+ const ignorePatterns = getIgnorePatterns();
203
+ const watcher = rolldown.watch(
204
+ defu(rolldownConfig, {
188
205
  watch: {
189
- chokidar: apibara.options.watchOptions
206
+ exclude: ignorePatterns,
207
+ ...apibara.options.watchOptions ?? {}
190
208
  }
191
209
  })
192
210
  );
193
211
  let start;
194
- watcher.on("event", (event) => {
212
+ watcher.on("event", async (event) => {
195
213
  switch (event.code) {
196
214
  case "START": {
197
- apibara.hooks.callHook("dev:restart");
215
+ await apibara.hooks.callHook("dev:restart");
198
216
  return;
199
217
  }
200
218
  case "BUNDLE_START": {
@@ -207,34 +225,48 @@ function startRollupWatcher(apibara, rollupConfig) {
207
225
  "Indexers built",
208
226
  start ? `in ${Date.now() - start} ms` : ""
209
227
  );
210
- apibara.hooks.callHook("dev:reload");
228
+ await apibara.hooks.callHook("dev:reload");
211
229
  return;
212
230
  }
213
231
  case "ERROR": {
214
- apibara.logger.error(formatRollupError(event.error));
232
+ apibara.logger.error(formatRolldownError(event.error));
215
233
  }
216
234
  }
217
235
  });
218
236
  return watcher;
219
237
  }
238
+ const getWatchPatterns = (apibara) => [
239
+ join(apibara.options.rootDir, "indexers")
240
+ ];
241
+ const getIgnorePatterns = (apibara) => [
242
+ "**/.apibara/**",
243
+ "**/.git/**",
244
+ "**/.DS_Store",
245
+ "**/node_modules/**",
246
+ "**/dist/**",
247
+ "**/.turbo/**"
248
+ ];
220
249
 
221
- async function buildProduction(apibara, rollupConfig) {
250
+ async function buildProduction(apibara, rolldownConfig) {
222
251
  apibara.logger.start(
223
252
  `Building ${colors.cyan(apibara.indexers.length)} indexers`
224
253
  );
254
+ const startTime = Date.now();
225
255
  try {
226
- const bundle = await rollup$1(rollupConfig);
227
- if (Array.isArray(rollupConfig.output)) {
228
- for (const outputOptions of rollupConfig.output) {
256
+ const bundle = await rolldown.rolldown(rolldownConfig);
257
+ if (Array.isArray(rolldownConfig.output)) {
258
+ for (const outputOptions of rolldownConfig.output) {
229
259
  await bundle.write(outputOptions);
230
260
  }
231
- } else if (rollupConfig.output) {
232
- await bundle.write(rollupConfig.output);
261
+ } else if (rolldownConfig.output) {
262
+ await bundle.write(rolldownConfig.output);
233
263
  } else {
234
- throw new Error("No output options specified in Rollup config");
264
+ throw new Error("No output options specified in Rolldown config");
235
265
  }
236
266
  await bundle.close();
237
- apibara.logger.success("Build succeeded!");
267
+ const endTime = Date.now();
268
+ const duration = endTime - startTime;
269
+ apibara.logger.success(`Build succeeded in ${duration}ms`);
238
270
  apibara.logger.info(
239
271
  `You can start the indexers with ${colors.cyan("apibara start")}`
240
272
  );
@@ -245,9 +277,16 @@ async function buildProduction(apibara, rollupConfig) {
245
277
  }
246
278
 
247
279
  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);
280
+ const rolldownConfig = getRolldownConfig(apibara);
281
+ await apibara.hooks.callHook("rolldown:before", apibara, rolldownConfig);
282
+ if (apibara.options.rollupConfig) {
283
+ apibara.logger.error(
284
+ `
285
+ ${colors.cyan("apibara.config:")} rollupConfig is deprecated. Use rolldownConfig instead`
286
+ );
287
+ process.exit(1);
288
+ }
289
+ return apibara.options.dev ? await watchDev(apibara, rolldownConfig) : await buildProduction(apibara, rolldownConfig);
251
290
  }
252
291
 
253
292
  function prettyPath(path, highlight = true) {
@@ -268,6 +307,10 @@ async function prepareDir(dir) {
268
307
  }
269
308
 
270
309
  async function writeTypes(apibara) {
310
+ const isTypeScript = apibara.options._c12.configFile?.endsWith(".ts");
311
+ if (!isTypeScript) {
312
+ return;
313
+ }
271
314
  const typesDir = resolve(apibara.options.buildDir, "types");
272
315
  const config = [
273
316
  "// 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;