From 96188826a8a2e47f73c1718d00420ae383720925 Mon Sep 17 00:00:00 2001 From: Tomek Marciniak Date: Fri, 2 Aug 2024 12:20:09 +0200 Subject: [PATCH] feat(providers): add utils for announcing --- bun.lockb | Bin 67798 -> 71224 bytes package.json | 34 ++----- packages/accounts/package.json | 27 +++++ .../accounts/src}/generate-mnemonic.spec.ts | 0 .../accounts/src}/generate-mnemonic.ts | 0 .../src}/generate-private-key.spec.ts | 0 .../accounts/src}/generate-private-key.ts | 0 .../accounts/src}/index.ts | 0 packages/accounts/tsup.config.ts | 3 + packages/connect/bunfig.toml | 2 + packages/connect/happy-dom.ts | 3 + packages/connect/package.json | 24 +++++ packages/connect/src/__mocks__/provider.ts | 16 +++ packages/connect/src/events.spec.ts | 28 +++++ packages/connect/src/events.ts | 51 ++++++++++ packages/connect/src/index.ts | 18 ++++ packages/connect/src/store.ts | 96 ++++++++++++++++++ packages/connect/tsup.config.ts | 3 + packages/providers/package.json | 24 +++++ .../providers/src}/index.ts | 0 .../providers/src}/types.ts | 2 +- .../providers/src}/validation.ts | 0 packages/providers/tsup.config.ts | 3 + packages/shared/tsup.config.ts | 11 ++ src/index.ts | 1 - tsup.config.ts | 1 - 26 files changed, 317 insertions(+), 30 deletions(-) create mode 100644 packages/accounts/package.json rename {src/accounts => packages/accounts/src}/generate-mnemonic.spec.ts (100%) rename {src/accounts => packages/accounts/src}/generate-mnemonic.ts (100%) rename {src/accounts => packages/accounts/src}/generate-private-key.spec.ts (100%) rename {src/accounts => packages/accounts/src}/generate-private-key.ts (100%) rename {src/accounts => packages/accounts/src}/index.ts (100%) create mode 100644 packages/accounts/tsup.config.ts create mode 100644 packages/connect/bunfig.toml create mode 100644 packages/connect/happy-dom.ts create mode 100644 packages/connect/package.json create mode 100644 packages/connect/src/__mocks__/provider.ts create mode 100644 packages/connect/src/events.spec.ts create mode 100644 packages/connect/src/events.ts create mode 100644 packages/connect/src/index.ts create mode 100644 packages/connect/src/store.ts create mode 100644 packages/connect/tsup.config.ts create mode 100644 packages/providers/package.json rename {src/providers => packages/providers/src}/index.ts (100%) rename {src/providers => packages/providers/src}/types.ts (98%) rename {src/providers => packages/providers/src}/validation.ts (100%) create mode 100644 packages/providers/tsup.config.ts create mode 100644 packages/shared/tsup.config.ts delete mode 100644 src/index.ts diff --git a/bun.lockb b/bun.lockb index 887a7a257182b4b9a422b15ca1af72e33fde6e7c..9f2f726458bbdb14479ebb2ca3380d9006d86b81 100755 GIT binary patch delta 13751 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 an}X#m-|L5{_d>)5V(}cg{XjV#kp2g&7M6Jc delta 11878 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 C+kMpl diff --git a/package.json b/package.json index f5e32b7..78bf995 100644 --- a/package.json +++ b/package.json @@ -1,40 +1,20 @@ { "name": "mina-js", - "version": "0.0.1", + "private": true, "scripts": { - "build": "tsup", - "test": "bun test", + "build": "bun run --filter '*' build", + "test": "bun run --filter '*' test", "lint": "bunx biome check .", "format": "bunx biome check . --write", "format:unsafe": "bunx biome check . --write --unsafe" }, "devDependencies": { "@biomejs/biome": "1.8.3", + "@happy-dom/global-registrator": "^14.12.3", "@tsconfig/bun": "1.0.7", "@types/bun": "1.1.6", - "tsup": "8.2.3" + "tsup": "8.2.3", + "typescript": "5.5.4" }, - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0", - "mina-signer": "3.0.7", - "zod": "3.23.8" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "exports": { - "./accounts": { - "types": "./dist/accounts/index.d.ts", - "import": "./dist/accounts/index.mjs", - "default": "./dist/accounts/index.js" - }, - "./providers": { - "types": "./dist/providers/index.d.ts", - "import": "./dist/providers/index.mjs", - "default": "./dist/providers/index.js" - } - } + "workspaces": ["packages/*"] } diff --git a/packages/accounts/package.json b/packages/accounts/package.json new file mode 100644 index 0000000..b09c180 --- /dev/null +++ b/packages/accounts/package.json @@ -0,0 +1,27 @@ +{ + "name": "@mina-js/accounts", + "version": "0.0.1", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.cjs", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsup", + "test": "bun test" + }, + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0", + "mina-signer": "3.0.7" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/src/accounts/generate-mnemonic.spec.ts b/packages/accounts/src/generate-mnemonic.spec.ts similarity index 100% rename from src/accounts/generate-mnemonic.spec.ts rename to packages/accounts/src/generate-mnemonic.spec.ts diff --git a/src/accounts/generate-mnemonic.ts b/packages/accounts/src/generate-mnemonic.ts similarity index 100% rename from src/accounts/generate-mnemonic.ts rename to packages/accounts/src/generate-mnemonic.ts diff --git a/src/accounts/generate-private-key.spec.ts b/packages/accounts/src/generate-private-key.spec.ts similarity index 100% rename from src/accounts/generate-private-key.spec.ts rename to packages/accounts/src/generate-private-key.spec.ts diff --git a/src/accounts/generate-private-key.ts b/packages/accounts/src/generate-private-key.ts similarity index 100% rename from src/accounts/generate-private-key.ts rename to packages/accounts/src/generate-private-key.ts diff --git a/src/accounts/index.ts b/packages/accounts/src/index.ts similarity index 100% rename from src/accounts/index.ts rename to packages/accounts/src/index.ts diff --git a/packages/accounts/tsup.config.ts b/packages/accounts/tsup.config.ts new file mode 100644 index 0000000..6e9381b --- /dev/null +++ b/packages/accounts/tsup.config.ts @@ -0,0 +1,3 @@ +import sharedConfig from "../shared/tsup.config"; + +export default sharedConfig; diff --git a/packages/connect/bunfig.toml b/packages/connect/bunfig.toml new file mode 100644 index 0000000..6b82abb --- /dev/null +++ b/packages/connect/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = "./happy-dom.ts" diff --git a/packages/connect/happy-dom.ts b/packages/connect/happy-dom.ts new file mode 100644 index 0000000..7f712d0 --- /dev/null +++ b/packages/connect/happy-dom.ts @@ -0,0 +1,3 @@ +import { GlobalRegistrator } from "@happy-dom/global-registrator"; + +GlobalRegistrator.register(); diff --git a/packages/connect/package.json b/packages/connect/package.json new file mode 100644 index 0000000..56a0490 --- /dev/null +++ b/packages/connect/package.json @@ -0,0 +1,24 @@ +{ + "name": "@mina-js/connect", + "version": "0.0.1", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.cjs", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsup", + "test": "bun test" + }, + "dependencies": { + "@mina-js/providers": "workspace:*", + "zod": "3.23.8" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/packages/connect/src/__mocks__/provider.ts b/packages/connect/src/__mocks__/provider.ts new file mode 100644 index 0000000..ac54a6a --- /dev/null +++ b/packages/connect/src/__mocks__/provider.ts @@ -0,0 +1,16 @@ +import { mock } from "bun:test"; +import type { MinaProviderDetail } from "@mina-js/providers"; + +export const mockedProvider: MinaProviderDetail = { + info: { + name: "Pallad", + icon: "data:image/", + rdns: "co.pallad", + slug: "pallad", + }, + provider: { + request: mock(), + addListener: mock(), + removeListener: mock(), + }, +}; diff --git a/packages/connect/src/events.spec.ts b/packages/connect/src/events.spec.ts new file mode 100644 index 0000000..485f555 --- /dev/null +++ b/packages/connect/src/events.spec.ts @@ -0,0 +1,28 @@ +import { expect, it, mock } from "bun:test"; +import type { MinaAnnounceProviderEvent } from "@mina-js/providers"; +import { mockedProvider } from "./__mocks__/provider"; +import { announceProvider, requestProviders } from "./events"; + +type Resolver = (value: unknown) => void; + +it("announcec Mina Provider with window event", async () => { + const listener = + (resolve: Resolver) => + ({ detail }: MinaAnnounceProviderEvent) => { + expect(detail.info.slug).toEqual(mockedProvider.info.slug); + resolve(true); + }; + await new Promise((resolve) => { + window.addEventListener("mina:announceProvider", listener(resolve)); + announceProvider(mockedProvider); + window.removeEventListener("mina:announceProvider", listener(resolve)); + }); +}); + +it("requests Mina Provider with window event", () => { + const listener = mock(); + window.addEventListener("mina:requestProvider", listener); + requestProviders(() => {}); + expect(listener).toHaveBeenCalled(); + window.removeEventListener("mina:requestProvider", listener); +}); diff --git a/packages/connect/src/events.ts b/packages/connect/src/events.ts new file mode 100644 index 0000000..4de04ad --- /dev/null +++ b/packages/connect/src/events.ts @@ -0,0 +1,51 @@ +import type { + MinaAnnounceProviderEvent, + MinaProviderDetail, +} from "@mina-js/providers"; + +export type AnnounceProviderReturnType = () => void; + +/** + * Creates an event to announce a Mina provider and registers a handler to respond to subsequent requests. + * + * @param {MinaProviderDetail} detail - The details of the provider to announce. + * @returns {AnnounceProviderReturnType} A function to remove the event listener when it is no longer needed. + */ +export function announceProvider( + detail: MinaProviderDetail, +): AnnounceProviderReturnType { + const event: CustomEvent = new CustomEvent( + "mina:announceProvider", + { detail: Object.freeze(detail) }, + ); + window.dispatchEvent(event); + const handler = () => window.dispatchEvent(event); + window.addEventListener("mina:requestProvider", handler); + return () => window.removeEventListener("mina:requestProvider", handler); +} + +export type RequestProvidersParameters = ( + providerDetail: MinaProviderDetail, +) => void; +export type RequestProvidersReturnType = (() => void) | undefined; + +/** + * Requests providers to be announced. + * + * This function adds an event listener for "mina:announceProvider" events and + * dispatches a custom event named "mina:requestProvider" to trigger the announce. + * + * @param listener A callback function that will be called when a provider is announced. + */ +export function requestProviders( + listener: RequestProvidersParameters, +): RequestProvidersReturnType { + if (typeof window === "undefined") return; + const handler = (event: MinaAnnounceProviderEvent) => listener(event.detail); + + window.addEventListener("mina:announceProvider", handler); + + window.dispatchEvent(new CustomEvent("mina:requestProvider")); + + return () => window.removeEventListener("mina:announceProvider", handler); +} diff --git a/packages/connect/src/index.ts b/packages/connect/src/index.ts new file mode 100644 index 0000000..96c500c --- /dev/null +++ b/packages/connect/src/index.ts @@ -0,0 +1,18 @@ +import type { + MinaAnnounceProviderEvent, + MinaProviderClient, + MinaRequestProviderEvent, +} from "@mina-js/providers"; + +declare global { + interface WindowEventMap { + "mina:announceProvider": MinaAnnounceProviderEvent; + "mina:requestProvider": MinaRequestProviderEvent; + } + interface Window { + mina?: MinaProviderClient | undefined; + } +} + +export * from "./store"; +export * from "./events"; diff --git a/packages/connect/src/store.ts b/packages/connect/src/store.ts new file mode 100644 index 0000000..1847c4e --- /dev/null +++ b/packages/connect/src/store.ts @@ -0,0 +1,96 @@ +import type { MinaProviderDetail } from "@mina-js/providers"; +import { requestProviders } from "./events"; + +export type Listener = (providerDetails: readonly MinaProviderDetail[]) => void; + +export type Store = { + /** + * Clears the store, including all provider details. + */ + clear(): void; + /** + * Destroys the store, including all provider details and listeners. + */ + destroy(): void; + /** + * Finds a provider detail by its slug. + */ + findProvider(args: { slug: string }): MinaProviderDetail | undefined; + /** + * Returns all provider details that have been emitted. + */ + getProviders(): readonly MinaProviderDetail[]; + /** + * Resets the store, and emits an event to request provider details. + */ + reset(): void; + /** + * Subscribes to emitted provider details. + */ + subscribe( + listener: Listener, + args?: { emitImmediately?: boolean | undefined } | undefined, + ): () => void; + + /** + * @internal + * Current state of listening listeners. + */ + _listeners(): Set; +}; + +export function createStore(): Store { + const listeners: Set = new Set(); + let providerDetails: readonly MinaProviderDetail[] = []; + + const request = () => + requestProviders((providerDetail) => { + if ( + providerDetails.some( + ({ info }) => info.slug === providerDetail.info.slug, + ) + ) + return; + + providerDetails = [...providerDetails, providerDetail]; + for (const listener of listeners) { + listener(providerDetails); + } + }); + let unwatch = request(); + + return { + _listeners() { + return listeners; + }, + clear() { + for (const listener of listeners) { + listener([]); + } + providerDetails = []; + }, + destroy() { + this.clear(); + listeners.clear(); + unwatch?.(); + }, + findProvider({ slug }) { + return providerDetails.find( + (providerDetail) => providerDetail.info.slug === slug, + ); + }, + getProviders() { + return providerDetails; + }, + reset() { + this.clear(); + unwatch?.(); + unwatch = request(); + }, + subscribe(listener, { emitImmediately } = {}) { + listeners.add(listener); + if (emitImmediately) listener(providerDetails); + return () => listeners.delete(listener); + }, + }; +} diff --git a/packages/connect/tsup.config.ts b/packages/connect/tsup.config.ts new file mode 100644 index 0000000..6e9381b --- /dev/null +++ b/packages/connect/tsup.config.ts @@ -0,0 +1,3 @@ +import sharedConfig from "../shared/tsup.config"; + +export default sharedConfig; diff --git a/packages/providers/package.json b/packages/providers/package.json new file mode 100644 index 0000000..9d8fa9b --- /dev/null +++ b/packages/providers/package.json @@ -0,0 +1,24 @@ +{ + "name": "@mina-js/providers", + "version": "0.0.1", + "type": "module", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.cjs", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsup", + "test": "bun test" + }, + "dependencies": { + "zod": "3.23.8" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/src/providers/index.ts b/packages/providers/src/index.ts similarity index 100% rename from src/providers/index.ts rename to packages/providers/src/index.ts diff --git a/src/providers/types.ts b/packages/providers/src/types.ts similarity index 98% rename from src/providers/types.ts rename to packages/providers/src/types.ts index 567b7bb..68f5ccc 100644 --- a/src/providers/types.ts +++ b/packages/providers/src/types.ts @@ -30,7 +30,7 @@ export interface MinaAnnounceProviderEvent type: "mina:announceProvider"; } -export interface EIP6963RequestProviderEvent extends Event { +export interface MinaRequestProviderEvent extends Event { type: "mina:requestProvider"; } diff --git a/src/providers/validation.ts b/packages/providers/src/validation.ts similarity index 100% rename from src/providers/validation.ts rename to packages/providers/src/validation.ts diff --git a/packages/providers/tsup.config.ts b/packages/providers/tsup.config.ts new file mode 100644 index 0000000..6e9381b --- /dev/null +++ b/packages/providers/tsup.config.ts @@ -0,0 +1,3 @@ +import sharedConfig from "../shared/tsup.config"; + +export default sharedConfig; diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts new file mode 100644 index 0000000..3d230eb --- /dev/null +++ b/packages/shared/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "./dist", + format: ["esm", "cjs"], + sourcemap: true, + clean: true, + bundle: true, + dts: true, +}); diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 6520f28..0000000 --- a/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -import "./accounts"; diff --git a/tsup.config.ts b/tsup.config.ts index 8ad86c4..91c8ce3 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,7 +1,6 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: ["src/accounts/index.ts", "src/providers/index.ts"], outDir: "./dist", format: ["esm", "cjs"], sourcemap: true,