diff --git a/.changeset/moody-aliens-begin.md b/.changeset/moody-aliens-begin.md new file mode 100644 index 000000000..d30ab44bf --- /dev/null +++ b/.changeset/moody-aliens-begin.md @@ -0,0 +1,5 @@ +--- +"ensindexer": minor +--- + +Made `ponder.schema.ts` to explicitly import just ENSIndexer Schema. diff --git a/.changeset/strict-shrimps-own.md b/.changeset/strict-shrimps-own.md new file mode 100644 index 000000000..ec6e4e247 --- /dev/null +++ b/.changeset/strict-shrimps-own.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensdb-sdk": minor +--- + +Created isolated database schema definitions: ENSIndexer Schema and ENSNode Schema. diff --git a/apps/ensindexer/ponder/ponder.schema.ts b/apps/ensindexer/ponder/ponder.schema.ts index 187c5398a..62fe7bf34 100644 --- a/apps/ensindexer/ponder/ponder.schema.ts +++ b/apps/ensindexer/ponder/ponder.schema.ts @@ -1,2 +1,2 @@ // export database schema definition for ENSIndexer -export * from "@ensnode/ensdb-sdk"; +export * from "@ensnode/ensdb-sdk/ensindexer"; diff --git a/packages/ensdb-sdk/package.json b/packages/ensdb-sdk/package.json index f9644da44..c9d231ff9 100644 --- a/packages/ensdb-sdk/package.json +++ b/packages/ensdb-sdk/package.json @@ -16,7 +16,9 @@ "ENSDb" ], "exports": { - ".": "./src/index.ts" + ".": "./src/index.ts", + "./ensindexer": "./src/ensindexer/index.ts", + "./ensnode": "./src/ensnode/index.ts" }, "files": [ "dist" @@ -24,11 +26,27 @@ "publishConfig": { "access": "public", "exports": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "./ensindexer": { + "import": { + "types": "./dist/ensindexer/index.d.ts", + "default": "./dist/ensindexer/index.js" + } + }, + "./ensnode": { + "import": { + "types": "./dist/ensnode/index.d.ts", + "default": "./dist/ensnode/index.js" + } + } }, "main": "./dist/index.js", - "module": "./dist/index.mjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts" }, "scripts": { @@ -36,14 +54,18 @@ "lint": "biome check --write .", "lint:ci": "biome ci" }, - "dependencies": { + "peerDependencies": { + "drizzle-orm": "catalog:", "ponder": "catalog:", "viem": "catalog:" }, "devDependencies": { "@ensnode/ensnode-sdk": "workspace:", "@ensnode/shared-configs": "workspace:*", + "drizzle-orm": "catalog:", + "ponder": "catalog:", "tsup": "catalog:", - "typescript": "catalog:" + "typescript": "catalog:", + "viem": "catalog:" } } diff --git a/packages/ensdb-sdk/src/schemas/ensnode-metadata.schema.ts b/packages/ensdb-sdk/src/ensindexer/ensnode-metadata.schema.ts similarity index 100% rename from packages/ensdb-sdk/src/schemas/ensnode-metadata.schema.ts rename to packages/ensdb-sdk/src/ensindexer/ensnode-metadata.schema.ts diff --git a/packages/ensdb-sdk/src/schemas/ensv2.schema.ts b/packages/ensdb-sdk/src/ensindexer/ensv2.schema.ts similarity index 100% rename from packages/ensdb-sdk/src/schemas/ensv2.schema.ts rename to packages/ensdb-sdk/src/ensindexer/ensv2.schema.ts diff --git a/packages/ensdb-sdk/src/ensindexer/index.ts b/packages/ensdb-sdk/src/ensindexer/index.ts new file mode 100644 index 000000000..b245eab10 --- /dev/null +++ b/packages/ensdb-sdk/src/ensindexer/index.ts @@ -0,0 +1,12 @@ +/** + * Merge the various sub-schemas into ENSIndexer Schema. + */ + +// TODO: remove `ensnode-metadata.schema` export when database migrations +// for ENSNode Schema are executable. +export * from "./ensnode-metadata.schema"; +export * from "./ensv2.schema"; +export * from "./protocol-acceleration.schema"; +export * from "./registrars.schema"; +export * from "./subgraph.schema"; +export * from "./tokenscope.schema"; diff --git a/packages/ensdb-sdk/src/schemas/protocol-acceleration.schema.ts b/packages/ensdb-sdk/src/ensindexer/protocol-acceleration.schema.ts similarity index 100% rename from packages/ensdb-sdk/src/schemas/protocol-acceleration.schema.ts rename to packages/ensdb-sdk/src/ensindexer/protocol-acceleration.schema.ts diff --git a/packages/ensdb-sdk/src/schemas/registrars.schema.ts b/packages/ensdb-sdk/src/ensindexer/registrars.schema.ts similarity index 100% rename from packages/ensdb-sdk/src/schemas/registrars.schema.ts rename to packages/ensdb-sdk/src/ensindexer/registrars.schema.ts diff --git a/packages/ensdb-sdk/src/schemas/subgraph.schema.ts b/packages/ensdb-sdk/src/ensindexer/subgraph.schema.ts similarity index 100% rename from packages/ensdb-sdk/src/schemas/subgraph.schema.ts rename to packages/ensdb-sdk/src/ensindexer/subgraph.schema.ts diff --git a/packages/ensdb-sdk/src/schemas/tokenscope.schema.ts b/packages/ensdb-sdk/src/ensindexer/tokenscope.schema.ts similarity index 100% rename from packages/ensdb-sdk/src/schemas/tokenscope.schema.ts rename to packages/ensdb-sdk/src/ensindexer/tokenscope.schema.ts diff --git a/packages/ensdb-sdk/src/ensnode/index.ts b/packages/ensdb-sdk/src/ensnode/index.ts new file mode 100644 index 000000000..30259c624 --- /dev/null +++ b/packages/ensdb-sdk/src/ensnode/index.ts @@ -0,0 +1,69 @@ +import { pgSchema, primaryKey } from "drizzle-orm/pg-core"; + +/** + * ENSNode Schema Name + * + * The name of the ENSNode schema in an ENSDb. + */ +const ENSNODE_SCHEMA_NAME = "ensnode"; + +/** + * ENSNode Schema + * + * Defines database objects within the ENSNode Schema in ENSDb. + */ +const ENSNODE_SCHEMA = pgSchema(ENSNODE_SCHEMA_NAME); + +/** + * ENSNode Metadata + * + * Possible key value pairs are defined by 'EnsNodeMetadata' type: + * - `EnsNodeMetadataEnsDbVersion` + * - `EnsNodeMetadataEnsIndexerPublicConfig` + * - `EnsNodeMetadataEnsIndexerIndexingStatus` + */ +export const metadata = ENSNODE_SCHEMA.table( + "metadata", + (t) => ({ + /** + * ENSIndexer Schema Name + * + * References the name of the ENSIndexer Schema that the metadata record + * belongs to. This allows multi-tenancy where multiple ENSIndexer + * instances can write to the same ENSNode Metadata table. + */ + ensIndexerSchemaName: t.text().notNull(), + + /** + * Key + * + * Allowed keys: + * - `EnsNodeMetadataEnsDbVersion['key']` + * - `EnsNodeMetadataEnsIndexerPublicConfig['key']` + * - `EnsNodeMetadataEnsIndexerIndexingStatus['key']` + */ + key: t.text().notNull(), + + /** + * Value + * + * Allowed values: + * - `EnsNodeMetadataEnsDbVersion['value']` + * - `EnsNodeMetadataEnsIndexerPublicConfig['value']` + * - `EnsNodeMetadataEnsIndexerIndexingStatus['value']` + * + * Guaranteed to be a serialized representation of JSON object. + */ + value: t.jsonb().notNull(), + }), + (table) => [ + /** + * Primary key constraint on 'ensIndexerSchemaName' and 'key' columns, + * to ensure that there is only one record for each key per ENSIndexer instance. + */ + primaryKey({ + name: "metadata_pkey", + columns: [table.ensIndexerSchemaName, table.key], + }), + ], +); diff --git a/packages/ensdb-sdk/src/index.ts b/packages/ensdb-sdk/src/index.ts index 58508341e..aba35b810 100644 --- a/packages/ensdb-sdk/src/index.ts +++ b/packages/ensdb-sdk/src/index.ts @@ -1,10 +1 @@ -/** - * Merge the various sub-schemas into a single ponder (drizzle) schema. - */ - -export * from "./schemas/ensnode-metadata.schema"; -export * from "./schemas/ensv2.schema"; -export * from "./schemas/protocol-acceleration.schema"; -export * from "./schemas/registrars.schema"; -export * from "./schemas/subgraph.schema"; -export * from "./schemas/tokenscope.schema"; +export * from "./ensindexer"; diff --git a/packages/ensdb-sdk/tsconfig.json b/packages/ensdb-sdk/tsconfig.json index d34e39a61..d4861e993 100644 --- a/packages/ensdb-sdk/tsconfig.json +++ b/packages/ensdb-sdk/tsconfig.json @@ -1,5 +1,8 @@ { - "extends": "@ensnode/shared-configs/tsconfig.ponder.json", + "extends": "@ensnode/shared-configs/tsconfig.lib.json", + "compilerOptions": { + "rootDir": "." // necessary for 'The project root is ambiguous' + }, "include": ["./**/*.ts"], "exclude": ["node_modules"] } diff --git a/packages/ensdb-sdk/tsup.config.ts b/packages/ensdb-sdk/tsup.config.ts index a4853583a..82d273ac3 100644 --- a/packages/ensdb-sdk/tsup.config.ts +++ b/packages/ensdb-sdk/tsup.config.ts @@ -1,13 +1,14 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: ["src/index.ts"], + entry: ["src/index.ts", "src/ensindexer/index.ts", "src/ensnode/index.ts"], platform: "neutral", format: ["esm"], target: "es2022", bundle: true, splitting: false, sourcemap: true, + dts: true, clean: true, external: ["viem", "ponder", "drizzle-orm", "drizzle-orm/pg-core"], outDir: "./dist", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a91c086c3..a6383f9ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -829,13 +829,6 @@ importers: version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) packages/ensdb-sdk: - dependencies: - ponder: - specifier: 'catalog:' - version: 0.16.3(@opentelemetry/api@1.9.0(patch_hash=4b2adeefaf7c22f9987d0a125d69cab900719bec7ed7636648bea6947107033a))(@types/node@24.10.9)(@types/pg@8.16.0)(hono@4.12.7)(lightningcss@1.30.2)(typescript@5.9.3)(viem@2.38.5(typescript@5.9.3)(zod@3.25.76))(zod@3.25.76) - viem: - specifier: 'catalog:' - version: 2.38.5(typescript@5.9.3)(zod@3.25.76) devDependencies: '@ensnode/ensnode-sdk': specifier: 'workspace:' @@ -843,12 +836,21 @@ importers: '@ensnode/shared-configs': specifier: workspace:* version: link:../shared-configs + drizzle-orm: + specifier: 'catalog:' + version: 0.41.0(@electric-sql/pglite@0.2.13)(@opentelemetry/api@1.9.0(patch_hash=4b2adeefaf7c22f9987d0a125d69cab900719bec7ed7636648bea6947107033a))(@types/pg@8.16.0)(kysely@0.26.3)(pg@8.16.3) + ponder: + specifier: 'catalog:' + version: 0.16.3(@opentelemetry/api@1.9.0(patch_hash=4b2adeefaf7c22f9987d0a125d69cab900719bec7ed7636648bea6947107033a))(@types/node@24.10.9)(@types/pg@8.16.0)(hono@4.12.7)(lightningcss@1.30.2)(typescript@5.9.3)(viem@2.38.5(typescript@5.9.3)(zod@3.25.76))(zod@3.25.76) tsup: specifier: 'catalog:' version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) typescript: specifier: 'catalog:' version: 5.9.3 + viem: + specifier: 'catalog:' + version: 2.38.5(typescript@5.9.3)(zod@3.25.76) packages/ensnode-react: dependencies: