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
@@ -8,6 +8,7 @@ import {
8
8
  inMemoryPersistence,
9
9
  logger,
10
10
  } from "@apibara/indexer/plugins";
11
+ import consola from "consola";
11
12
  import { config } from "#apibara-internal-virtual/config";
12
13
  import { indexers } from "#apibara-internal-virtual/indexers";
13
14
  import { createLogger } from "./logger";
@@ -42,36 +43,52 @@ export function createIndexer(indexerName: string, preset?: string) {
42
43
  );
43
44
  }
44
45
 
46
+ const indexerModule = indexerDefinition.indexer?.default;
47
+ if (indexerModule === undefined) {
48
+ consola.warn(
49
+ `Specified indexer "${indexerName}" but it does not export a default. Ignoring.`,
50
+ );
51
+ return;
52
+ }
53
+
45
54
  const definition =
46
- typeof indexerDefinition.indexer === "function"
47
- ? indexerDefinition.indexer(runtimeConfig)
48
- : indexerDefinition.indexer;
55
+ typeof indexerModule === "function"
56
+ ? indexerModule(runtimeConfig)
57
+ : indexerModule;
49
58
 
50
- let reporter: ConsolaReporter = createLogger({
59
+ const reporter: ConsolaReporter = createLogger({
51
60
  indexer: indexerName,
52
61
  preset,
53
62
  indexers: availableIndexers,
54
63
  });
55
64
 
56
- if (config.logger) {
57
- reporter = config.logger({
58
- indexer: indexerName,
59
- preset,
60
- indexers: availableIndexers,
61
- });
62
- }
65
+ // TODO: Add support for custom logger
66
+ //
67
+ // Custom logger support is temporarily disabled to prevent bundling issues.
68
+ // Previously, when using the config object directly, Rollup would bundle everything
69
+ // referenced in apibara.config, including plugins. Now we serialize only the
70
+ // essential config properties (runtimeConfig, preset, presets) during build time,
71
+ // which prevents unwanted bundling but also means we can't access the logger
72
+ // configuration.
73
+ //
74
+ // if (config.logger) {
75
+ // reporter = config.logger({
76
+ // indexer: indexerName,
77
+ // preset,
78
+ // indexers: availableIndexers,
79
+ // });
80
+ // }
63
81
 
64
82
  // Put the in-memory persistence plugin first so that it can be overridden by any user-defined
65
83
  // persistence plugin.
66
- // Put the logger last since we want to override any user-defined logger.
67
84
  definition.plugins = [
68
85
  internalContext({
69
86
  indexerName,
70
87
  availableIndexers,
71
88
  } as InternalContext),
89
+ logger({ logger: reporter }),
72
90
  inMemoryPersistence(),
73
91
  ...(definition.plugins ?? []),
74
- logger({ logger: reporter }),
75
92
  ];
76
93
 
77
94
  return _createIndexer(definition);
@@ -1,6 +1,7 @@
1
1
  import { runWithReconnect } from "@apibara/indexer";
2
2
  import { createClient } from "@apibara/protocol";
3
3
  import { defineCommand, runMain } from "citty";
4
+ import consola from "consola";
4
5
  import { createIndexer } from "./internal/app";
5
6
 
6
7
  const startCommand = defineCommand({
@@ -23,6 +24,10 @@ const startCommand = defineCommand({
23
24
  const { indexer, preset } = args;
24
25
 
25
26
  const indexerInstance = createIndexer(indexer, preset);
27
+ if (!indexerInstance) {
28
+ consola.error(`Specified indexer "${indexer}" but it was not defined`);
29
+ process.exit(1);
30
+ }
26
31
 
27
32
  const client = createClient(
28
33
  indexerInstance.streamConfig,
@@ -1,16 +1,15 @@
1
1
  import type { ConsolaReporter } from "@apibara/indexer/plugins";
2
- import type { RollupCommonJSOptions } from "@rollup/plugin-commonjs";
3
2
  import type {
4
3
  C12InputConfig,
5
4
  ConfigWatcher,
6
5
  ResolvedConfig,
7
6
  WatchConfigOptions,
8
7
  } from "c12";
9
- import type { WatchOptions } from "chokidar";
10
8
  import type { NestedHooks } from "hookable";
9
+ import type { WatchOptions } from "rolldown";
10
+ import type { RolldownOptions } from "rolldown";
11
11
  import type { DeepPartial } from "./_utils";
12
12
  import type { ApibaraHooks } from "./hooks";
13
- import type { RollupConfig } from "./rollup";
14
13
 
15
14
  export type LoggerFactory = ({
16
15
  indexer,
@@ -71,7 +70,7 @@ export interface ApibaraOptions<
71
70
 
72
71
  // Dev
73
72
  dev: boolean;
74
- watchOptions: WatchOptions;
73
+ watchOptions: WatchOptions["watch"];
75
74
 
76
75
  // Hooks
77
76
  hooks: NestedHooks<ApibaraHooks>;
@@ -79,11 +78,17 @@ export interface ApibaraOptions<
79
78
  // Logging
80
79
  logger?: LoggerFactory;
81
80
 
82
- // Rollup
83
- rollupConfig?: Partial<RollupConfig>;
81
+ // Rolldown
82
+ rolldownConfig?: Partial<RolldownOptions>;
83
+
84
+ /**
85
+ * @deprecated Use rolldownConfig instead. This option will be removed in future releases.
86
+ */
87
+ rollupConfig?: unknown;
84
88
  sourceMap?: boolean;
85
89
  entry: string;
86
- commonJS?: RollupCommonJSOptions;
90
+ node: boolean;
91
+ exportConditions?: string[];
87
92
 
88
93
  // Advanced
89
94
  typescript: {
@@ -1,12 +1,15 @@
1
+ import type { RolldownOptions } from "rolldown";
1
2
  import type { Apibara } from "./apibara";
2
- import type { RollupConfig } from "./rollup";
3
3
 
4
4
  export interface ApibaraHooks {
5
- "rollup:before": (apibara: Apibara, rollupConfig: RollupConfig) => void;
5
+ "rolldown:before": (
6
+ apibara: Apibara,
7
+ rolldownConfig: RolldownOptions,
8
+ ) => void;
6
9
  compiled: (apibara: Apibara) => void;
7
- "dev:restart": () => void;
8
- "dev:reload": () => void;
9
- "rollup:reload": () => void;
10
+ "dev:restart": () => Promise<void>;
11
+ "dev:reload": () => Promise<void>;
12
+ "rolldown:reload": () => Promise<void>;
10
13
  restart: () => void;
11
14
  close: () => void;
12
15
  }
@@ -2,5 +2,5 @@ export * from "./apibara";
2
2
  export * from "./_utils";
3
3
  export * from "./config";
4
4
  export * from "./hooks";
5
- export * from "./rollup";
5
+ export * from "./rolldown";
6
6
  export * from "./runtime";
@@ -0,0 +1,5 @@
1
+ import type { InputOptions, OutputOptions } from "rolldown";
2
+
3
+ export type RolldownConfig = InputOptions & {
4
+ output: OutputOptions;
5
+ };
@@ -1,3 +1,6 @@
1
1
  import type { ApibaraConfig } from "apibara/types";
2
2
 
3
- export const config: ApibaraConfig = {};
3
+ export const config: Pick<
4
+ ApibaraConfig,
5
+ "runtimeConfig" | "preset" | "presets"
6
+ > = {};
@@ -7,4 +7,7 @@ export type IndexerConstructor =
7
7
  ) => IndexerWithStreamConfig<unknown, unknown, unknown>)
8
8
  | IndexerWithStreamConfig<unknown, unknown, unknown>;
9
9
 
10
- export const indexers: { name: string; indexer: IndexerConstructor }[] = [];
10
+ export const indexers: {
11
+ name: string;
12
+ indexer: { default?: IndexerConstructor | undefined };
13
+ }[] = [];
@@ -0,0 +1,15 @@
1
+ export function deserialize<T>(str: string): T {
2
+ return JSON.parse(str, (_, value) =>
3
+ typeof value === "string" && value.match(/^\d+n$/)
4
+ ? BigInt(value.slice(0, -1))
5
+ : value,
6
+ ) as T;
7
+ }
8
+
9
+ export function serialize<T extends Record<string, unknown>>(obj: T): string {
10
+ return JSON.stringify(
11
+ obj,
12
+ (_, value) => (typeof value === "bigint" ? `${value.toString()}n` : value),
13
+ "\t",
14
+ );
15
+ }
@@ -1,6 +0,0 @@
1
- import { Apibara, RollupConfig } from 'apibara/types';
2
- export { Plugin } from 'rollup';
3
-
4
- declare function getRollupConfig(apibara: Apibara): RollupConfig;
5
-
6
- export { getRollupConfig };
@@ -1,6 +0,0 @@
1
- import { Apibara, RollupConfig } from 'apibara/types';
2
- export { Plugin } from 'rollup';
3
-
4
- declare function getRollupConfig(apibara: Apibara): RollupConfig;
5
-
6
- export { getRollupConfig };
@@ -1,150 +0,0 @@
1
- import { builtinModules } from 'node:module';
2
- import commonjs from '@rollup/plugin-commonjs';
3
- import json from '@rollup/plugin-json';
4
- import { nodeResolve } from '@rollup/plugin-node-resolve';
5
- import { join } from 'pathe';
6
- import defu from 'defu';
7
- import virtual from '@rollup/plugin-virtual';
8
- import MagicString from 'magic-string';
9
- import { hash } from 'ohash';
10
-
11
- function appConfig(apibara) {
12
- return virtual({
13
- "#apibara-internal-virtual/config": `
14
- import * as projectConfig from '${apibara.options._c12.configFile}';
15
-
16
- export const config = projectConfig.default;
17
- `
18
- });
19
- }
20
-
21
- function esmShim() {
22
- const ESMShim = `
23
- // -- Shims --
24
- import cjsUrl from 'node:url';
25
- import cjsPath from 'node:path';
26
- const __filename = cjsUrl.fileURLToPath(import.meta.url);
27
- const __dirname = cjsPath.dirname(__filename);
28
- // -- End Shims --
29
- `;
30
- const CJSyntaxRegex = /__filename|__dirname/;
31
- return {
32
- name: "esm-shim",
33
- renderChunk(code, _chunk, opts) {
34
- if (opts.format === "es") {
35
- if (code.includes(ESMShim) || !CJSyntaxRegex.test(code)) {
36
- return null;
37
- }
38
- let endIndexOfLastImport = -1;
39
- for (const match of code.matchAll(/^import\s.*';$/gm)) {
40
- if (match.length === 0 || typeof match.index !== "number") {
41
- continue;
42
- }
43
- endIndexOfLastImport = match.index + match[0].length;
44
- }
45
- const s = new MagicString(code);
46
- s.appendRight(endIndexOfLastImport, ESMShim);
47
- const sourceMap = s.generateMap({
48
- includeContent: true
49
- });
50
- let sourcesContent;
51
- if (Array.isArray(sourceMap.sourcesContent)) {
52
- sourcesContent = [];
53
- for (let i = 0; i < sourceMap.sourcesContent.length; i++) {
54
- const content = sourceMap.sourcesContent[i];
55
- if (typeof content === "string") {
56
- sourcesContent.push(content);
57
- }
58
- }
59
- }
60
- return {
61
- code: s.toString(),
62
- map: {
63
- ...sourceMap,
64
- sourcesContent
65
- }
66
- };
67
- }
68
- return null;
69
- }
70
- };
71
- }
72
-
73
- function indexers(apibara) {
74
- const indexers2 = [...new Set(apibara.indexers)];
75
- return virtual({
76
- "#apibara-internal-virtual/indexers": `
77
- ${indexers2.map((i) => `import _${hash(i)} from '${i.indexer}';`).join("\n")}
78
-
79
- export const indexers = [
80
- ${indexers2.map((i) => `{ name: "${i.name}", indexer: _${hash(i)} }`).join(",\n")}
81
- ];
82
- `
83
- });
84
- }
85
-
86
- const runtimeDependencies = ["better-sqlite3", "@electric-sql/pglite"];
87
- function getRollupConfig(apibara) {
88
- const extensions = [
89
- ".ts",
90
- ".mjs",
91
- ".js",
92
- ".json",
93
- ".node",
94
- ".tsx",
95
- ".jsx"
96
- ];
97
- const rollupConfig = defu(
98
- // biome-ignore lint/suspicious/noExplicitAny: apibara.options.rollupConfig is typed
99
- apibara.options.rollupConfig,
100
- {
101
- input: apibara.options.entry,
102
- output: {
103
- dir: join(apibara.options.outputDir || "./.apibara/build"),
104
- format: "esm",
105
- exports: "auto",
106
- entryFileNames: "[name].mjs",
107
- chunkFileNames: "chunks/[name]-[hash].mjs",
108
- generatedCode: {
109
- constBindings: true
110
- },
111
- sourcemap: true,
112
- sourcemapExcludeSources: true,
113
- sourcemapIgnoreList(relativePath, sourcemapPath) {
114
- return relativePath.includes("node_modules");
115
- }
116
- },
117
- plugins: [],
118
- onwarn(warning, rollupWarn) {
119
- if (!["CIRCULAR_DEPENDENCY", "EVAL", "THIS_IS_UNDEFINED"].includes(
120
- warning.code || ""
121
- ) && !warning.message.includes("Unsupported source map comment") && !warning.message.includes("@__PURE__") && !warning.message.includes("/*#__PURE__*/")) {
122
- rollupWarn(warning);
123
- }
124
- },
125
- treeshake: true,
126
- external: [...builtinModules, ...runtimeDependencies]
127
- }
128
- );
129
- rollupConfig.plugins.push(esmShim());
130
- rollupConfig.plugins.push(json());
131
- rollupConfig.plugins.push(
132
- commonjs({
133
- strictRequires: true,
134
- requireReturnsDefault: "auto",
135
- ...apibara.options.commonJS
136
- })
137
- );
138
- rollupConfig.plugins.push(
139
- nodeResolve({
140
- extensions,
141
- preferBuiltins: true,
142
- mainFields: ["main"]
143
- })
144
- );
145
- rollupConfig.plugins.push(indexers(apibara));
146
- rollupConfig.plugins.push(appConfig(apibara));
147
- return rollupConfig;
148
- }
149
-
150
- export { getRollupConfig };
@@ -1,87 +0,0 @@
1
- import { builtinModules } from "node:module";
2
- import commonjs from "@rollup/plugin-commonjs";
3
- import json from "@rollup/plugin-json";
4
- import { nodeResolve } from "@rollup/plugin-node-resolve";
5
- import type { Apibara, RollupConfig } from "apibara/types";
6
- import { join } from "pathe";
7
- import type { OutputPluginOption } from "rollup";
8
-
9
- import defu from "defu";
10
- import { appConfig } from "./plugins/config";
11
- import { esmShim } from "./plugins/esm-shim";
12
- import { indexers } from "./plugins/indexers";
13
-
14
- const runtimeDependencies = ["better-sqlite3", "@electric-sql/pglite"];
15
-
16
- export function getRollupConfig(apibara: Apibara): RollupConfig {
17
- const extensions: string[] = [
18
- ".ts",
19
- ".mjs",
20
- ".js",
21
- ".json",
22
- ".node",
23
- ".tsx",
24
- ".jsx",
25
- ];
26
-
27
- const rollupConfig: RollupConfig & { plugins: OutputPluginOption[] } = defu(
28
- // biome-ignore lint/suspicious/noExplicitAny: apibara.options.rollupConfig is typed
29
- apibara.options.rollupConfig as any,
30
- <RollupConfig>{
31
- input: apibara.options.entry,
32
- output: {
33
- dir: join(apibara.options.outputDir || "./.apibara/build"),
34
- format: "esm",
35
- exports: "auto",
36
- entryFileNames: "[name].mjs",
37
- chunkFileNames: "chunks/[name]-[hash].mjs",
38
- generatedCode: {
39
- constBindings: true,
40
- },
41
- sourcemap: true,
42
- sourcemapExcludeSources: true,
43
- sourcemapIgnoreList(relativePath, sourcemapPath) {
44
- return relativePath.includes("node_modules");
45
- },
46
- },
47
- plugins: [],
48
- onwarn(warning, rollupWarn) {
49
- if (
50
- !["CIRCULAR_DEPENDENCY", "EVAL", "THIS_IS_UNDEFINED"].includes(
51
- warning.code || "",
52
- ) &&
53
- !warning.message.includes("Unsupported source map comment") &&
54
- !warning.message.includes("@__PURE__") &&
55
- !warning.message.includes("/*#__PURE__*/")
56
- ) {
57
- rollupWarn(warning);
58
- }
59
- },
60
- treeshake: true,
61
- external: [...builtinModules, ...runtimeDependencies],
62
- },
63
- );
64
-
65
- rollupConfig.plugins.push(esmShim());
66
- rollupConfig.plugins.push(json());
67
-
68
- rollupConfig.plugins.push(
69
- commonjs({
70
- strictRequires: true,
71
- requireReturnsDefault: "auto",
72
- ...apibara.options.commonJS,
73
- }),
74
- );
75
-
76
- rollupConfig.plugins.push(
77
- nodeResolve({
78
- extensions,
79
- preferBuiltins: true,
80
- mainFields: ["main"],
81
- }),
82
- );
83
- rollupConfig.plugins.push(indexers(apibara));
84
- rollupConfig.plugins.push(appConfig(apibara));
85
-
86
- return rollupConfig;
87
- }
@@ -1,2 +0,0 @@
1
- export * from "./config";
2
- export type { Plugin } from "rollup";
@@ -1,12 +0,0 @@
1
- import virtual from "@rollup/plugin-virtual";
2
- import type { Apibara } from "apibara/types";
3
-
4
- export function appConfig(apibara: Apibara) {
5
- return virtual({
6
- "#apibara-internal-virtual/config": `
7
- import * as projectConfig from '${apibara.options._c12.configFile}';
8
-
9
- export const config = projectConfig.default;
10
- `,
11
- });
12
- }
@@ -1,69 +0,0 @@
1
- import MagicString from "magic-string";
2
- import type { Plugin } from "rollup";
3
-
4
- /**
5
- * An alternative to @rollup/plugin-esm-shim
6
- */
7
- export function esmShim(): Plugin {
8
- const ESMShim = `
9
- // -- Shims --
10
- import cjsUrl from 'node:url';
11
- import cjsPath from 'node:path';
12
- const __filename = cjsUrl.fileURLToPath(import.meta.url);
13
- const __dirname = cjsPath.dirname(__filename);
14
- // -- End Shims --
15
- `;
16
-
17
- const CJSyntaxRegex = /__filename|__dirname/;
18
-
19
- return {
20
- name: "esm-shim",
21
-
22
- renderChunk(code, _chunk, opts) {
23
- if (opts.format === "es") {
24
- if (code.includes(ESMShim) || !CJSyntaxRegex.test(code)) {
25
- return null;
26
- }
27
-
28
- let endIndexOfLastImport = -1;
29
-
30
- // Find the last import statement and its ending index
31
- for (const match of code.matchAll(/^import\s.*';$/gm)) {
32
- if (match.length === 0 || typeof match.index !== "number") {
33
- continue;
34
- }
35
-
36
- endIndexOfLastImport = match.index + match[0].length;
37
- }
38
-
39
- const s = new MagicString(code);
40
- s.appendRight(endIndexOfLastImport, ESMShim);
41
-
42
- const sourceMap = s.generateMap({
43
- includeContent: true,
44
- });
45
-
46
- let sourcesContent: string[] | undefined;
47
- if (Array.isArray(sourceMap.sourcesContent)) {
48
- sourcesContent = [];
49
- for (let i = 0; i < sourceMap.sourcesContent.length; i++) {
50
- const content = sourceMap.sourcesContent[i];
51
- if (typeof content === "string") {
52
- sourcesContent.push(content);
53
- }
54
- }
55
- }
56
-
57
- return {
58
- code: s.toString(),
59
- map: {
60
- ...sourceMap,
61
- sourcesContent,
62
- },
63
- };
64
- }
65
-
66
- return null;
67
- },
68
- };
69
- }
@@ -1,8 +0,0 @@
1
- import type {
2
- InputOptions as RollupInputOptions,
3
- OutputOptions as RollupOutputOptions,
4
- } from "rollup";
5
-
6
- export type RollupConfig = RollupInputOptions & {
7
- output: RollupOutputOptions;
8
- };