Skip to content

Commit

Permalink
cli: use default logger that includes indexer name (#120)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaipaljadeja authored Nov 30, 2024
2 parents cf2449c + c8ddd39 commit 80b9543
Show file tree
Hide file tree
Showing 9 changed files with 116 additions and 7 deletions.
7 changes: 7 additions & 0 deletions change/apibara-17aa4aa8-e6bb-419c-9c4a-65bee8c749cd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "cli: use default logger that includes indexer name",
"packageName": "apibara",
"email": "[email protected]",
"dependentChangeType": "patch"
}
4 changes: 3 additions & 1 deletion examples/cli/indexers/1-evm.indexer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { EvmStream } from "@apibara/evm";
import { defineIndexer } from "@apibara/indexer";
import { useLogger } from "@apibara/indexer/plugins/logger";

export default defineIndexer(EvmStream)({
streamUrl: "https://ethereum.preview.apibara.org",
Expand All @@ -12,6 +13,7 @@ export default defineIndexer(EvmStream)({
transactions: [{}],
},
async transform({ endCursor }) {
console.log({ endCursor });
const logger = useLogger();
logger.info("Transforming block ", endCursor?.orderKey);
},
});
2 changes: 1 addition & 1 deletion examples/cli/indexers/2-starknet.indexer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export default function (runtimeConfig: ApibaraRuntimeConfig) {
},
async transform({ endCursor, block: { header }, context }) {
const logger = useLogger();
logger.info("Transforming block ", endCursor);
logger.info("Transforming block ", endCursor?.orderKey);
const { writer } = useSink({ context });

// writer.insert([{
Expand Down
2 changes: 0 additions & 2 deletions packages/cli/src/core/apibara.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@ export async function createApibara(
opts: LoadConfigOptions = {},
dev = false,
): Promise<Apibara> {
// load options
const options = await loadOptions(config, opts, dev);

// create apibara context
const apibara: Apibara = {
options,
indexers: [],
Expand Down
4 changes: 3 additions & 1 deletion packages/cli/src/rollup/plugins/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import type { Apibara } from "apibara/types";
export function appConfig(apibara: Apibara) {
return virtual({
"#apibara-internal-virtual/config": `
export const config = ${JSON.stringify(apibara.options, null, 2)};
import * as projectConfig from '${apibara.options._c12.configFile}';
export const config = projectConfig.default;
`,
});
}
1 change: 1 addition & 0 deletions packages/cli/src/runtime/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export { createIndexer } from "./internal/app";
export { createLogger } from "./internal/logger";
23 changes: 21 additions & 2 deletions packages/cli/src/runtime/internal/app.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { createIndexer as _createIndexer } from "@apibara/indexer";
import { logger } from "@apibara/indexer/plugins/logger";
import { type ConsolaReporter, logger } from "@apibara/indexer/plugins/logger";

import { config } from "#apibara-internal-virtual/config";
import { indexers } from "#apibara-internal-virtual/indexers";

import { createLogger } from "./logger";

export const availableIndexers = indexers.map((i) => i.name);

export function createIndexer(indexerName: string, preset?: string) {
Expand Down Expand Up @@ -39,7 +41,24 @@ export function createIndexer(indexerName: string, preset?: string) {
? indexerDefinition.indexer(runtimeConfig)
: indexerDefinition.indexer;

definition.plugins = [...(definition.plugins ?? []), logger()];
let reporter: ConsolaReporter = createLogger({
indexer: indexerName,
preset,
indexers: availableIndexers,
});

if (config.logger) {
reporter = config.logger({
indexer: indexerName,
preset,
indexers: availableIndexers,
});
}

definition.plugins = [
...(definition.plugins ?? []),
logger({ logger: reporter }),
];

return _createIndexer(definition);
}
70 changes: 70 additions & 0 deletions packages/cli/src/runtime/internal/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import type {
ConsolaOptions,
ConsolaReporter,
LogLevel,
LogObject,
LogType,
} from "consola";
import { type ColorName, colors, getColor } from "consola/utils";
import { murmurHash } from "ohash";

const INDEXER_COLOR_MAP = [
colors.red,
colors.green,
colors.yellow,
colors.blue,
colors.magenta,
colors.cyan,
];

const TYPE_COLOR_MAP: { [k in LogType]?: string } = {
info: "cyan",
fail: "red",
success: "green",
ready: "green",
start: "magenta",
};

const LEVEL_COLOR_MAP: { [k in LogLevel]?: string } = {
0: "red",
1: "yellow",
};

const MAX_INDEXER_NAME_LENGTH = 20;

class DefaultReporter implements ConsolaReporter {
private tag: string;

constructor(indexer: string, indexers: string[], preset?: string) {
const color =
INDEXER_COLOR_MAP[murmurHash(indexer) % INDEXER_COLOR_MAP.length];

const presetLength = preset ? preset.length : 0;

const longestIndexerName =
Math.max(...indexers.map((i) => i.length), indexer.length) + presetLength;

const paddedIndexer = `${indexer}${preset ? `:${preset} ` : ""}`
.padEnd(longestIndexerName, " ")
.slice(0, Math.min(longestIndexerName, MAX_INDEXER_NAME_LENGTH));

this.tag = color(`${paddedIndexer} |`);
}

log(logObj: LogObject, ctx: { options: ConsolaOptions }) {
const { args } = logObj;
const typeColor =
TYPE_COLOR_MAP[logObj.type] || LEVEL_COLOR_MAP[logObj.level] || "gray";

const type = getColor(typeColor as ColorName, "white")(logObj.type);
console.log(`${this.tag} ${type}`, ...args);
}
}

export function createLogger({
indexer,
indexers,
preset,
}: { indexer: string; indexers: string[]; preset?: string }) {
return new DefaultReporter(indexer, indexers, preset);
}
10 changes: 10 additions & 0 deletions packages/cli/src/types/config.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { ConsolaReporter } from "@apibara/indexer/plugins/logger";
import type { RollupCommonJSOptions } from "@rollup/plugin-commonjs";
import type {
C12InputConfig,
Expand All @@ -11,6 +12,11 @@ import type { DeepPartial } from "./_utils";
import type { ApibaraHooks } from "./hooks";
import type { RollupConfig } from "./rollup";

export type LoggerFactory = ({
indexer,
preset,
}: { indexer: string; indexers: string[]; preset?: string }) => ConsolaReporter;

/**
* Apibara Config type (apibara.config)
*/
Expand All @@ -25,6 +31,7 @@ export interface ApibaraConfig<
runtimeConfig?: R;
presets?: T;
preset?: keyof T;
logger?: LoggerFactory;
}

export type ApibaraDynamicConfig = Pick<ApibaraConfig, "runtimeConfig">;
Expand Down Expand Up @@ -69,6 +76,9 @@ export interface ApibaraOptions<
// Hooks
hooks: NestedHooks<ApibaraHooks>;

// Logging
logger?: LoggerFactory;

// Rollup
rollupConfig?: RollupConfig;
sourceMap?: boolean;
Expand Down

0 comments on commit 80b9543

Please sign in to comment.