From 3355715420f52833f158748ec2b9620439321d26 Mon Sep 17 00:00:00 2001 From: jaipaljadeja Date: Mon, 26 May 2025 15:37:09 +0530 Subject: [PATCH 1/2] cli: fix apibara cli not working with .mjs extensions --- .../{evm.indexer.js => evm.indexer.mjs} | 0 ...arknet.indexer.js => starknet.indexer.mjs} | 0 packages/cli/src/core/build/dev.ts | 2 +- packages/cli/src/core/scan.ts | 2 +- packages/cli/src/create/add.ts | 19 +++++-------- packages/cli/src/create/templates.ts | 22 ++++++++------- packages/cli/src/create/types.ts | 3 +++ packages/cli/src/create/utils.ts | 27 ++++++++++++++----- .../src/rolldown/plugins/instrumentation.ts | 2 +- 9 files changed, 44 insertions(+), 33 deletions(-) rename examples/cli-js/indexers/{evm.indexer.js => evm.indexer.mjs} (100%) rename examples/cli-js/indexers/{starknet.indexer.js => starknet.indexer.mjs} (100%) diff --git a/examples/cli-js/indexers/evm.indexer.js b/examples/cli-js/indexers/evm.indexer.mjs similarity index 100% rename from examples/cli-js/indexers/evm.indexer.js rename to examples/cli-js/indexers/evm.indexer.mjs diff --git a/examples/cli-js/indexers/starknet.indexer.js b/examples/cli-js/indexers/starknet.indexer.mjs similarity index 100% rename from examples/cli-js/indexers/starknet.indexer.js rename to examples/cli-js/indexers/starknet.indexer.mjs diff --git a/packages/cli/src/core/build/dev.ts b/packages/cli/src/core/build/dev.ts index ffe83826..5413997c 100644 --- a/packages/cli/src/core/build/dev.ts +++ b/packages/cli/src/core/build/dev.ts @@ -103,5 +103,5 @@ const getIgnorePatterns = (apibara: Apibara) => [ "**/dist/**", "**/.turbo/**", // changes to apibara.config is handled by c12 itself so we dont need rolldown to handle this - "**/apibara.config?(.ts|.js)", + "**/apibara.config?(.ts|.js|.mjs)", ]; diff --git a/packages/cli/src/core/scan.ts b/packages/cli/src/core/scan.ts index bba11051..5928163b 100644 --- a/packages/cli/src/core/scan.ts +++ b/packages/cli/src/core/scan.ts @@ -2,7 +2,7 @@ import type { Apibara } from "apibara/types"; import fse from "fs-extra"; import { basename, join } from "pathe"; -const INDEXER_EXTENSIONS = [".indexer.ts", ".indexer.js"]; +const INDEXER_EXTENSIONS = [".indexer.ts", ".indexer.js", ".indexer.mjs"]; export async function scanIndexers(apibara: Apibara) { apibara.logger.debug("Scanning indexers"); diff --git a/packages/cli/src/create/add.ts b/packages/cli/src/create/add.ts index 7b16738e..a7fd0578 100644 --- a/packages/cli/src/create/add.ts +++ b/packages/cli/src/create/add.ts @@ -77,7 +77,7 @@ export async function addIndexer({ } } - const language = getApibaraConfigLanguage(cwd); + const { language, extension } = getApibaraConfigLanguage(cwd); validateIndexerId(argIndexerId, true); validateChain(argChain, true); @@ -95,14 +95,10 @@ export async function addIndexer({ validate: (id) => validateIndexerId(id) ? checkFileExists( - path.join( - cwd, - "indexers", - `${id}.indexer.${language === "typescript" ? "ts" : "js"}`, - ), + path.join(cwd, "indexers", `${id}.indexer.${extension}`), ).then(({ exists }) => exists - ? `Indexer ${cyan(`${id}.indexer.${language === "typescript" ? "ts" : "js"}`)} already exists` + ? `Indexer ${cyan(`${id}.indexer.${extension}`)} already exists` : true, ) : "Invalid indexer ID, it cannot be empty and must be in kebab-case format", @@ -209,13 +205,12 @@ export async function addIndexer({ dnaUrl: argDnaUrl ?? prompt_dnaUrl, language, packageManager: pkgManager.name, + extension, }; await updateApibaraConfigFile(options); - consola.success( - `Updated ${cyan("apibara.config." + (language === "typescript" ? "ts" : "js"))}`, - ); + consola.success(`Updated ${cyan(`apibara.config.${extension}`)}`); await updatePackageJson(options); @@ -223,9 +218,7 @@ export async function addIndexer({ await createIndexerFile(options); - consola.success( - `Created ${cyan(`${indexerFileId}.indexer.${language === "typescript" ? "ts" : "js"}`)}`, - ); + consola.success(`Created ${cyan(`${indexerFileId}.indexer.${extension}`)}`); await createStorageRelatedFiles(options); diff --git a/packages/cli/src/create/templates.ts b/packages/cli/src/create/templates.ts index 0b6127af..cf20badb 100644 --- a/packages/cli/src/create/templates.ts +++ b/packages/cli/src/create/templates.ts @@ -143,7 +143,7 @@ export async function createIndexerFile(options: IndexerOptions) { const indexerFilePath = path.join( options.cwd, "indexers", - `${options.indexerFileId}.indexer.${options.language === "typescript" ? "ts" : "js"}`, + `${options.indexerFileId}.indexer.${options.extension}`, ); const { exists, overwrite } = await checkFileExists(indexerFilePath, { @@ -214,11 +214,9 @@ export async function updateApibaraConfigFile({ language, network, dnaUrl, + extension, }: IndexerOptions) { - const pathToConfig = path.join( - cwd, - `apibara.config.${language === "typescript" ? "ts" : "js"}`, - ); + const pathToConfig = path.join(cwd, `apibara.config.${extension}`); const runtimeConfigString = `{ startingBlock: 0, @@ -267,12 +265,16 @@ export async function updateApibaraConfigFile({ } export async function createDrizzleStorageFiles(options: IndexerOptions) { - const { cwd, language, storage, indexerId } = options; + const { + cwd, + language, + storage, + indexerId, + extension: fileExtension, + } = options; if (storage !== "postgres") return; - const fileExtension = language === "typescript" ? "ts" : "js"; - /** * * @@ -349,7 +351,7 @@ export {}; await formatFile(schemaPath); - consola.success(`Created ${cyan("lib/schema.ts")}`); + consola.success(`Created ${cyan(`lib/${schemaFileName}`)}`); } console.log("\n"); @@ -366,7 +368,7 @@ export {}; ${yellow(` ┌──────────────────────────────────────────┐ -│ lib/schema.ts │ +│ lib/schema │ └──────────────────────────────────────────┘ import { bigint, pgTable, text, uuid } from "drizzle-orm/pg-core"; diff --git a/packages/cli/src/create/types.ts b/packages/cli/src/create/types.ts index a4d1050d..ff6e322b 100644 --- a/packages/cli/src/create/types.ts +++ b/packages/cli/src/create/types.ts @@ -16,6 +16,8 @@ export type Network = export type Storage = "postgres" | "none"; +export type FileExtension = "js" | "ts" | "mjs"; + export type IndexerOptions = { cwd: string; indexerFileId: string; @@ -26,6 +28,7 @@ export type IndexerOptions = { dnaUrl?: string; packageManager: string; language: Language; + extension: FileExtension; }; export type PkgInfo = { diff --git a/packages/cli/src/create/utils.ts b/packages/cli/src/create/utils.ts index f9fbcd45..9bf54e74 100644 --- a/packages/cli/src/create/utils.ts +++ b/packages/cli/src/create/utils.ts @@ -4,7 +4,7 @@ import * as prettier from "prettier"; import prompts from "prompts"; import { blue, cyan, red, yellow } from "./colors"; import { dnaUrls, networks } from "./constants"; -import type { Chain, Language, Network, PkgInfo } from "./types"; +import type { Chain, FileExtension, Language, Network, PkgInfo } from "./types"; export function isEmpty(path: string) { const files = fs.readdirSync(path); @@ -31,7 +31,8 @@ export function validateLanguage(language?: string, throwError = false) { language === "typescript" || language === "ts" || language === "javascript" || - language === "js" + language === "js" || + language === "mjs" ) { return true; } @@ -49,7 +50,7 @@ export function getLanguageFromAlias(alias: string): Language { if (alias === "ts" || alias === "typescript") { return "typescript"; } - if (alias === "js" || alias === "javascript") { + if (alias === "js" || alias === "javascript" || alias === "mjs") { return "javascript"; } @@ -184,19 +185,31 @@ export function validateDnaUrl(dnaUrl?: string, throwError = false) { export function hasApibaraConfig(cwd: string): boolean { const configPathJS = path.join(cwd, "apibara.config.js"); const configPathTS = path.join(cwd, "apibara.config.ts"); + const configPathMJS = path.join(cwd, "apibara.config.mjs"); - return fs.existsSync(configPathJS) || fs.existsSync(configPathTS); + return ( + fs.existsSync(configPathJS) || + fs.existsSync(configPathTS) || + fs.existsSync(configPathMJS) + ); } -export function getApibaraConfigLanguage(cwd: string): Language { +export function getApibaraConfigLanguage(cwd: string): { + language: Language; + extension: FileExtension; +} { const configPathJS = path.join(cwd, "apibara.config.js"); const configPathTS = path.join(cwd, "apibara.config.ts"); + const configPathMJS = path.join(cwd, "apibara.config.mjs"); + if (fs.existsSync(configPathMJS)) { + return { language: "javascript", extension: "mjs" }; + } if (fs.existsSync(configPathJS)) { - return "javascript"; + return { language: "javascript", extension: "js" }; } if (fs.existsSync(configPathTS)) { - return "typescript"; + return { language: "typescript", extension: "ts" }; } throw new Error(red("✖") + " No apibara.config found"); diff --git a/packages/cli/src/rolldown/plugins/instrumentation.ts b/packages/cli/src/rolldown/plugins/instrumentation.ts index 2c24de7f..6d299d29 100644 --- a/packages/cli/src/rolldown/plugins/instrumentation.ts +++ b/packages/cli/src/rolldown/plugins/instrumentation.ts @@ -7,7 +7,7 @@ import type { RolldownPluginOption } from "rolldown"; export function instrumentation(apibara: Apibara) { const instrumentationPath = join( apibara.options._c12.cwd!, - `instrumentation.${apibara.options._c12.configFile?.endsWith(".ts") ? "ts" : "js"}`, + `instrumentation.${apibara.options._c12.configFile?.endsWith(".ts") ? "ts" : apibara.options._c12.configFile?.endsWith(".mjs") ? "mjs" : "js"}`, ); if (!existsSync(instrumentationPath)) { From 6b0baca47eb815c48ec4e19b240e1e4725f2b442 Mon Sep 17 00:00:00 2001 From: jaipaljadeja Date: Mon, 26 May 2025 16:30:15 +0530 Subject: [PATCH 2/2] indexer: show debug logs with useLogger when debug is true --- ...-indexer-d223a0d2-d422-40bd-a7b0-939c3b04ead1.json | 7 +++++++ .../apibara-b87e2be4-ca28-4711-b029-a215cfd726c8.json | 7 +++++++ packages/indexer/src/indexer.ts | 5 +++++ packages/indexer/src/plugins/logger.ts | 11 ++++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 change/@apibara-indexer-d223a0d2-d422-40bd-a7b0-939c3b04ead1.json create mode 100644 change/apibara-b87e2be4-ca28-4711-b029-a215cfd726c8.json diff --git a/change/@apibara-indexer-d223a0d2-d422-40bd-a7b0-939c3b04ead1.json b/change/@apibara-indexer-d223a0d2-d422-40bd-a7b0-939c3b04ead1.json new file mode 100644 index 00000000..011c0bb5 --- /dev/null +++ b/change/@apibara-indexer-d223a0d2-d422-40bd-a7b0-939c3b04ead1.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "indexer: show debug logs with useLogger when debug is true", + "packageName": "@apibara/indexer", + "email": "jadejajaipal5@gmail.com", + "dependentChangeType": "patch" +} diff --git a/change/apibara-b87e2be4-ca28-4711-b029-a215cfd726c8.json b/change/apibara-b87e2be4-ca28-4711-b029-a215cfd726c8.json new file mode 100644 index 00000000..be602646 --- /dev/null +++ b/change/apibara-b87e2be4-ca28-4711-b029-a215cfd726c8.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "cli: fix apibara cli not working with .mjs extensions", + "packageName": "apibara", + "email": "jadejajaipal5@gmail.com", + "dependentChangeType": "patch" +} diff --git a/packages/indexer/src/indexer.ts b/packages/indexer/src/indexer.ts index 358e2475..34a46980 100644 --- a/packages/indexer/src/indexer.ts +++ b/packages/indexer/src/indexer.ts @@ -225,6 +225,11 @@ export async function run( ) { await indexerAsyncContext.callAsync({}, async () => { const context = useIndexerContext(); + + if (indexer.options.debug) { + context.debug = true; + } + const middleware = await registerMiddleware(indexer); const indexerMetrics = createIndexerMetrics(); diff --git a/packages/indexer/src/plugins/logger.ts b/packages/indexer/src/plugins/logger.ts index 519c65e0..23c62a7c 100644 --- a/packages/indexer/src/plugins/logger.ts +++ b/packages/indexer/src/plugins/logger.ts @@ -1,4 +1,9 @@ -import { type ConsolaInstance, type ConsolaReporter, consola } from "consola"; +import { + type ConsolaInstance, + type ConsolaReporter, + LogLevels, + consola, +} from "consola"; import { useIndexerContext } from "../context"; import { defineIndexerPlugin } from "./config"; @@ -16,6 +21,10 @@ export function logger({ } else { ctx.logger = consola.create({}); } + + if (ctx.debug) { + ctx.logger.level = LogLevels.debug; + } }); }); }